diff --git a/CHANGELOG.md b/CHANGELOG.md index bbf3c216..a6519220 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,121 @@ See full changelog for the OpenAPI schema (OAS) [here](https://github.com/plaid/plaid-openapi/blob/master/CHANGELOG.md). +# 44.0.0 +- Updating to OAS 2020-09-14_1.706.1 + +## Breaking changes in this version +- [BREAKING] For `/cra/check_report/create`, replace `CraCheckReportCashflowInsightsGetOptions`, `CraCheckReportIncomeInsightsGetOptions`, `CraCheckReportLendScoreGetOptions`, `CraCheckReportNetworkInsightsGetOptions`, and `CraCheckReportVerificationGetEmploymentRefreshOptions` with the corresponding `CraCheckReportCreate*Options` interfaces. The old interfaces remain available for the deprecated `/get` options, and request JSON is unchanged. (OAS 2020-09-14_1.700.0) +- [BREAKING] Use `ProductsTerminateReasonCode` for both Item and user product termination; `ItemProductsTerminateReasonCode` and `UserProductsTerminateReasonCode` were removed. Accepted wire values are unchanged. (OAS 2020-09-14_1.701.1) +- [BREAKING] Object-literal fixtures for `BankTransferEvent`, `CreditSessionDocumentIncomeResult`, `LinkEventsWebhook`, `PayrollIncomeObject`, or `Security` must now include the required `receiver_details`, `num_i20s_uploaded`, `environment`, `i20s`, or `figi` property, respectively. Ordinary API response consumption is unchanged. (OAS 2020-09-14_1.699.0, 1.699.5, 1.701.0, 1.701.1, and 1.703.0) +- [BREAKING] `FDXInitiatorFiAttribute.value` is now a `string` instead of `FDXPartyType`. This schema is not referenced by an endpoint. (OAS 2020-09-14_1.703.0) +- [BREAKING] `StudentRepaymentPlanType.InterestOnly` now serializes as `"interest only"` instead of `"interest-only"`, matching the value returned by the API. (OAS 2020-09-14_1.699.1) + +## OpenAPI Schema Changes +### 2020-09-14_1.706.1 +- Make product `metadata` and `attributes` nullable when unavailable in `/cra/report/get` responses. + +### 2020-09-14_1.706.0 +- Add the `/transfer/return/recover` endpoint, which lets clients report that they have recovered some or all of the loss on a returned guaranteed transfer. +- Add the `guarantee_reimbursed`, `client_return_recovered`, and `plaid_return_recovered` transfer event types, and add a nullable signed `event_amount` field to the transfer event object. + +### 2020-09-14_1.705.4 +- Mark superseded products, endpoints, and fields as `deprecated`: the Beacon product (`/beacon/*` endpoints and webhooks, plus the `beacon_user_id` field on Identity Verification responses); Bank Transfer (except the `/bank_transfer/event/*` endpoints, still used for Auth micro-deposits); `/employers/search`; the legacy Cash Flow Updates webhooks superseded by `CASH_FLOW_INSIGHTS_UPDATED`; and the `PaymentInitiationConsentScope`, `TransferCreditFundsSource`, and `RiskReason` schemas. +- Quote `type: string` certain enum values (Prism version number strings, Freddie Mac "yes/no" API string responses) that YAML parsers were coercing to numbers or booleans. +- Expose `/cra/report/get` and its request/response schemas in generated client libraries. The endpoint remains hidden from public documentation. + +### 2020-09-14_1.705.3 +- Document the `ip_address` field on the `/identity_verification/create` `user` object: accepted only here (not via `/link/token/create`) and captured automatically by the Link SDK, for backend-only integrations that need IP-based risk checks. + +### 2020-09-14_1.705.2 +- Clarified the `/oauth/token` response `token_type` description (it is `Bearer` for OAuth access tokens); dropped the inaccurate "always Bearer" wording. + +### 2020-09-14_1.705.1 +- internal changes only + +### 2020-09-14_1.705.0 +- Type the `product` field of the `CraReportUpdatedWebhook` (`CRA_REPORT`/`CRA_REPORT_UPDATED`) `successful_products`/`failed_products` entries against the `Products` enum instead of a free-form string, matching the sibling `/cra/report/get` product schemas. + +### 2020-09-14_1.704.2 +- internal changes only + +### 2020-09-14_1.704.1 +- internal changes only + +### 2020-09-14_1.704.0 +- internal changes only + +### 2020-09-14_1.703.0 +- Add the `environment` field to the `LinkEventsWebhook` (`LINK`/`EVENTS`) schema, matching actual behavior. +- Change `FDXInitiatorFiAttribute.value` from the `FDXPartyType` enum to a string, matching the sibling `FDXFiAttribute` (this schema is not referenced by any endpoint). +- Fixed a `TransactionsRuleDetails.query` description that referenced a nonexistent `NAME` field (the enum value is `MERCHANT_NAME`), and a `/cra/encompass/get_reports` example whose `report_status` was not a valid value and whose `generated_at` key should be `created_at`. +- Fixed additional example/consistency issues: `/transactions/get` and `/processor/transactions/get` examples now report the correct `total_transactions`; the Identity Verification `Strategy` note references the `watchlist_screening` step; the `US_SDN` watchlist code label is consistent; `SelfieCapture` examples reflect that only one of `image_url`/`video_url` is populated; the `/institutions/get_by_id` example nests `liabilities` correctly; the `/oauth/token` scope description calls `urn:plaid:params:oauth:user-token` a subject token type; and a `/cra/encompass/load/existing` example was corrected to match its schema. + +### 2020-09-14_1.702.4 +- Add `hide_gse_details` to `/cra/check_report/verification/pdf/get`. When `true`, the GSE identifiers (the Report ID and `gse_reference_id`) are omitted from the returned Home Lending Report PDF. Defaults to `false`. These identifiers are always present in the `/cra/check_report/verification/get` JSON response regardless of this field. + +### 2020-09-14_1.702.3 +- Add the `error`, `repairable_items`, and `failed_products` fields to the `CHECK_REPORT_FAILED` and `USER_CHECK_REPORT_FAILED` webhooks. + +### 2020-09-14_1.702.2 +- Add `tax_lots` to the `/investments/holdings/get` sample response, showing both a holding with per-lot detail and a holding with an empty `tax_lots` array. + +### 2020-09-14_1.702.1 +- Update descriptions for the CRA `/get` endpoints. + +### 2020-09-14_1.702.0 +- Add `timestamp` to `/protect/compute` responses to indicate when the Trust Index score and fraud attributes were computed. + +### 2020-09-14_1.701.4 +- Add `ip_address` (optional, nullable) to the `user` object (`IdentityVerificationCreateRequestUser`) on `/identity_verification/create`. Lets backend-only integrations supply the end user's IP address for IP-based risk checks without launching the Link SDK. + +### 2020-09-14_1.701.3 +- Add `exclusion_code` to the `CraPartnerInsightsUltraFicoScoreResult` object, exposing the FICO exclusion code that explains why an UltraFICO® score could not be computed due to consumer-data conditions (e.g. insufficient account history). + +### 2020-09-14_1.701.2 +- Add private-visibility `error`, `repairable_items`, and `failed_products` to the `CHECK_REPORT_FAILED` and `USER_CHECK_REPORT_FAILED` webhooks. + +### 2020-09-14_1.701.1 +- Add the nullable `receiver_details` field to the `BankTransferEvent` schema returned by `/bank_transfer/event/list` and `/bank_transfer/event/sync`, matching what the API already emits. Currently always `null`. +- [Breaking] Change the generated `reason_code` type for `/item/products/terminate` and `/user/products/terminate` from the unusable `ItemProductsTerminateReasonCode` and `UserProductsTerminateReasonCode` wrapper types to `ProductsTerminateReasonCode`. The accepted JSON values are unchanged. +- Make `home_lending_report_options` visible in the docs for `/cra/check_report/create` and `/link/token/create`. + +### 2020-09-14_1.701.0 +- Add `figi` to the `Security` schema: the 12-character OpenFIGI identifier, which stays stable across most corporate actions (ticker/CUSIP/name changes) and is the preferred identifier for tracking a security across its lifecycle. Null until Plaid has enriched the security with FIGI data. + +### 2020-09-14_1.700.1 +- Add the `/sandbox/fdx/consent/seed` endpoint for seeding a test FDX consent grant on Sandbox data partner accounts. Takes `customer_id` and `application_id` (and an optional `consent_id`) and returns the seeded `consent_id`. + +### 2020-09-14_1.700.0 +- [Breaking] Rename the `/cra/check_report/create` request options schemas for `cashflow_insights`, `lend_score`, `network_insights`, `income_insights`, and the Home Lending Report's `employment_refresh_options` to `CraCheckReportCreate*Options`. The JSON request is unchanged. +- Deprecate the request-time generation config on the CRA `/get` endpoints (`options`, `partner_insights`, `employment_refresh_options`); no longer accepted for new clients (created on or after 2026-07-01). + +### 2020-09-14_1.699.6 +- Add `cash advance`, `late fee`, `membership fee`, `returned item fee` to the `transaction_code` enum. + +### 2020-09-14_1.699.5 +- Add `num_i20s_uploaded` to the `document_income_results` object in the `/credit/sessions/get` and `/link/token/get` responses + +### 2020-09-14_1.699.4 +- Add private-visibility scaffolding for the `CRA_REPORT_UPDATED` webhook (`CRA_REPORT` type), fired when a subscribed CRA report is updated; lists the `successful_products` and `failed_products` for the update. Hidden from the public spec/docs until launch (customer-facing entry follows when `x-private-visibility` flips). + +### 2020-09-14_1.699.3 +- Add `kick` to the `processor` enum on `/processor/token/create`, for creating processor tokens for the Kick integration. + +### 2020-09-14_1.699.2 +- Adds `DOCUMENT_TYPE_US_STUDENT_I20` enum value (Form I-20 student document) for document metadata +- Add `/fdx/consents`, `/fdx/consents/{consentId}`, and `/fdx/consents/{consentId}/revocation` for managing FDX consent grants. These endpoints remain hidden from public documentation. + +### 2020-09-14_1.699.1 +- Additions and corrections of enum values returned by API but not mentioned in OpenAPI spec. No actual changes to API behavior. +- `PlaidErrorType`: add 13 error types (`ASSETS_ERROR`, `ENRICH_ERROR`, `STATEMENTS_ERROR`, `RECURRING_TRANSACTIONS_ERROR`, `CRA_MONITORING_ERROR`, `CREDIT_PROFILE_REPORT_ERROR`, `ENCOMPASS_ERROR`, `FRAUD_INSIGHTS_ERROR`, `FREDDIE_MAC_ERROR`, `LINK_DELIVERY_ERROR`, `PROFILE_ERROR`, `TRANSFER_RECURRING_ERROR`, `TRANSFER_REFUND_ERROR` +- Asset Report `warning_code`: add the 5 `BANK_INCOME_INSIGHTS_*` codes +- watchlist `source`: add `retro` enum value +- `TransferNetwork`: add `rfp` enum value (request for payment; closed beta, debit-only) +- `StudentRepaymentPlan.type`: `interest-only` → `interest only` (match the emitted value) + +### 2020-09-14_1.699.0 +- Add support for the Form I-20 US immigration student document on `/credit/payroll_income/get`. This form now returns an `i20` array which extraction data on uploaded I-20 documents. + # 43.0.0 - Updating to OAS 2020-09-14_1.698.7 diff --git a/README.md b/README.md index 1e31c90a..dd7416a2 100755 --- a/README.md +++ b/README.md @@ -7,10 +7,12 @@ The official Node.js client library for the [Plaid API][1]. - [Installation](#install) - [Versioning](#versioning) - [Getting started](#getting-started) +- [Dates](#dates) - [Error Handling](#error-handling) - [Examples](#examples) - [Promise Support](#promise-support) - [Migration Guide](#migration-guide) +- [Webhook troubleshooting with Next.js](#webhook-troubleshooting-with-nextjs) - [Support](#support) - [Contributing](#contributing) - [License](#license) @@ -106,7 +108,7 @@ plaidClient }); ``` -Note that the full error object includes the API configuration object, including the request headers, which in turn include the API key and secret. To avoid logging your API secret, log only `error.data` and/or avoid logging the full `error.config.headers` object. +Note that the full error object includes the API configuration object, including the request headers, which in turn include the API key and secret. To avoid logging your API secret, log only `error.response.data` and/or avoid logging the full `error.config.headers` object. ## Examples @@ -129,15 +131,15 @@ const response = await plaidClient.transactionsSync({ access_token }); const transactions = response.data.transactions; -); ``` Retrieve the transactions for a transactions user for the last thirty days (using the older method): ```typescript -const now = moment(); -const today = now.format('YYYY-MM-DD'); -const thirtyDaysAgo = now.subtract(30, 'days').format('YYYY-MM-DD'); +const today = new Date().toISOString().slice(0, 10); +const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) + .toISOString() + .slice(0, 10); const response = await plaidClient.transactionsGet({ access_token, diff --git a/api.ts b/api.ts index 684699e9..f81c1dfb 100644 --- a/api.ts +++ b/api.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -264,7 +264,7 @@ export interface AccountAssets { */ subtype: AccountSubtype | null; /** - * The current verification status of an Auth Item initiated through Automated or Manual micro-deposits. Returned for Auth Items only. `pending_automatic_verification`: The Item is pending automatic verification. `pending_manual_verification`: The Item is pending manual micro-deposit verification. Items remain in this state until the user successfully verifies the micro-deposit. `automatically_verified`: The Item has successfully been automatically verified. `manually_verified`: The Item has successfully been manually verified. `verification_expired`: Plaid was unable to automatically verify the deposit within 7 calendar days and will no longer attempt to validate the Item. Users may retry by submitting their information again through Link. `verification_failed`: The Item failed manual micro-deposit verification because the user exhausted all 3 verification attempts. Users may retry by submitting their information again through Link. `database_matched`: The Item has successfully been verified using Plaid\'s data sources. Note: Database Match is currently a beta feature, please contact your account manager for more information. + * The current verification status of an Auth Item initiated through Automated or Manual micro-deposits. Returned for Auth Items only. `pending_automatic_verification`: The Item is pending automatic verification. `pending_manual_verification`: The Item is pending manual micro-deposit verification. Items remain in this state until the user successfully verifies the micro-deposit. `automatically_verified`: The Item has successfully been automatically verified. `manually_verified`: The Item has successfully been manually verified. `verification_expired`: Plaid was unable to automatically verify the deposit within 7 calendar days and will no longer attempt to validate the Item. Users may retry by submitting their information again through Link. `verification_failed`: The Item failed manual micro-deposit verification because the user exhausted all 3 verification attempts. Users may retry by submitting their information again through Link. `database_matched`: (deprecated) The Item has successfully been verified using Plaid\'s data sources. Only returned for Auth Items created via Database Match. * @type {string} * @memberof AccountAssets */ @@ -294,7 +294,7 @@ export interface AccountAssets { */ investments?: AssetReportInvestments; /** - * Data returned by the financial institution about the account owner or owners.For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29) + * Data returned by the financial institution about the account owner or owners. For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29) * @type {Array} * @memberof AccountAssets */ @@ -334,7 +334,7 @@ export enum AccountAssetsVerificationStatusEnum { } /** - * A set of fields describing the balance for an account. Balance information may be cached unless the balance object was returned by `/accounts/balance/get` or `/signal/evaluate` (using a Balance-only ruleset). + * A set of fields describing the balance for an account. For real-time values, use `/accounts/balance/get` or `/signal/evaluate` (with a Balance-only ruleset), which are fetched live from the institution at request time. Values returned by other endpoints may be cached, or adjusted by Plaid to reflect transaction activity received since the last refresh. * @export * @interface AccountBalance */ @@ -2111,7 +2111,7 @@ export interface AssetDetail { */ AssetTypeAdditionalDescription: string | null; /** - * The Number of days requested made to the Financial Institution. Example When looking for 3 months of data from the FI, pass in 90 days. + * The number of days requested from the Financial Institution. Example: When looking for 3 months of data from the FI, pass in 90 days. * @type {number} * @memberof AssetDetail */ @@ -2141,16 +2141,16 @@ export interface AssetDetail { * @enum {string} */ export enum AssetDetailAssetRetirementIndicatorEnum { - True = 'true', - False = 'false' + Yes = 'Yes', + No = 'No' } /** * @export * @enum {string} */ export enum AssetDetailAssetEmployerSponsoredIndicatorEnum { - True = 'true', - False = 'false' + Yes = 'Yes', + No = 'No' } /** @@ -2268,8 +2268,8 @@ export enum AssetHoldingAssetHoldingTypeEnum { * @enum {string} */ export enum AssetHoldingAssetHoldingRestrictedIndicatorEnum { - True = 'true', - False = 'false' + Yes = 'Yes', + No = 'No' } /** @@ -2436,7 +2436,7 @@ export enum AssetReportAddOns { } /** - * AssetReportAuditCopyCreateRequest defines the request schema for `/asset_report/audit_copy/get` + * AssetReportAuditCopyCreateRequest defines the request schema for `/asset_report/audit_copy/create` * @export * @interface AssetReportAuditCopyCreateRequest */ @@ -2467,7 +2467,7 @@ export interface AssetReportAuditCopyCreateRequest { auditor_id?: string; } /** - * AssetReportAuditCopyCreateResponse defines the response schema for `/asset_report/audit_copy/get` + * AssetReportAuditCopyCreateResponse defines the response schema for `/asset_report/audit_copy/create` * @export * @interface AssetReportAuditCopyCreateResponse */ @@ -2604,7 +2604,7 @@ export interface AssetReportCreateRequest { */ secret?: string; /** - * An array of access tokens corresponding to the Items that will be included in the report. The `assets` product must have been initialized for the Items during link; the Assets product cannot be added after initialization. + * An array of access tokens corresponding to the Items that will be included in the report. The `assets` product must have been initialized for the Items during Link; the Assets product cannot be added after initialization. * @type {Array} * @memberof AssetReportCreateRequest */ @@ -2655,7 +2655,7 @@ export interface AssetReportCreateRequestOptions { */ products?: Array; /** - * A list of add-ons that should be included in the Asset Report. When Fast Assets is requested, Plaid will create two versions of the Asset Report: the Fast Asset Report, which will contain only Identity and Balance information, and the Full Asset Report, which will also contain Transactions information. A `PRODUCT_READY` webhook will be fired for each Asset Report when it is ready, and the `report_type` field will indicate whether the webhook is firing for the `full` or `fast` Asset Report. To retrieve the Fast Asset Report, call `/asset_report/get` with `fast_report` set to `true`. There is no additional charge for using Fast Assets. To create a Fast Asset Report, Plaid must successfully retrieve both Identity and Balance data; if Plaid encounters an error obtaining this data, the Fast Asset Report will not be created. However, as long as Plaid can obtain Transactions data, the Full Asset Report will still be available. When Investments is requested, `investments` must be specified in the `optional_products` array when initializing Link. + * A list of add-ons that should be included in the Asset Report. When Fast Assets is requested, Plaid will create two versions of the Asset Report: the Fast Asset Report, which will contain only Identity and Balance information, and the Full Asset Report, which will also contain Transactions information. A `PRODUCT_READY` webhook will be fired for each Asset Report when it is ready, and the `report_type` field will indicate whether the webhook is firing for the `FULL` or `FAST` Asset Report. To retrieve the Fast Asset Report, call `/asset_report/get` with `fast_report` set to `true`. There is no additional charge for using Fast Assets. To create a Fast Asset Report, Plaid must successfully retrieve both Identity and Balance data; if Plaid encounters an error obtaining this data, the Fast Asset Report will not be created. However, as long as Plaid can obtain Transactions data, the Full Asset Report will still be available. When Investments is requested, `investments` must be specified in the `optional_products` array when initializing Link. * @type {Array} * @memberof AssetReportCreateRequestOptions */ @@ -2977,7 +2977,7 @@ export interface AssetReportInvestmentHolding { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof AssetReportInvestmentHolding */ @@ -3105,7 +3105,7 @@ export interface AssetReportInvestmentTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof AssetReportInvestmentTransaction */ @@ -3415,7 +3415,7 @@ export interface AssetReportTransaction { */ date: string; /** - * The date on which the transaction took place, in IS0 8601 format. + * The date on which the transaction took place, in ISO 8601 format. * @type {string} * @memberof AssetReportTransaction */ @@ -4356,7 +4356,7 @@ export enum BankIncomeRefreshCompleteResult { } /** - * Fired when a refreshed bank income report has finished generating or failed to generate. The `/credit/bank_income/refresh` endpoint that previously triggered this webhook is deprecated; to refresh Bank Income data, send the user through Link\'s update mode, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To get this webhook, subscribe via the [Dashboard](https://dashboard.plaid.com/developers/webhooks). + * Fired when a refreshed bank income report has finished generating or failed to generate. To obtain refreshed Bank Income data, send the user through Link\'s update mode, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To get this webhook, subscribe via the [Dashboard](https://dashboard.plaid.com/developers/webhooks). * @export * @interface BankIncomeRefreshCompleteWebhook */ @@ -4393,7 +4393,7 @@ export interface BankIncomeRefreshCompleteWebhook { environment: WebhookEnvironmentValues; } /** - * Fired when a change to the user\'s income is detected. The `/credit/bank_income/refresh` endpoint that previously served this refresh is deprecated; to get updated income data, send the user through Link\'s update mode so they can confirm their income sources, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To receive this webhook, subscribe in the [Dashboard](https://dashboard.plaid.com/developers/webhooks). + * Fired when a change to the user\'s income is detected. To obtain refreshed Bank Income data, send the user through Link\'s update mode so they can confirm their income sources, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To receive this webhook, subscribe in the [Dashboard](https://dashboard.plaid.com/developers/webhooks). * @export * @interface BankIncomeRefreshUpdateWebhook */ @@ -4919,6 +4919,12 @@ export interface BankTransferEvent { * @memberof BankTransferEvent */ direction: BankTransferDirection | null; + /** + * + * @type {ReceiverDetails} + * @memberof BankTransferEvent + */ + receiver_details: ReceiverDetails | null; } /** * The type of bank transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into your origination account; a `credit` indicates a transfer of money out of your origination account. @@ -6075,7 +6081,7 @@ export interface BaseReportInvestmentHolding { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof BaseReportInvestmentHolding */ @@ -6215,7 +6221,7 @@ export interface BaseReportInvestmentTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof BaseReportInvestmentTransaction */ @@ -6395,7 +6401,7 @@ export interface BaseReportTransaction { */ date: string; /** - * The date on which the transaction took place, in IS0 8601 format. + * The date on which the transaction took place, in ISO 8601 format. * @type {string} * @memberof BaseReportTransaction */ @@ -9087,7 +9093,7 @@ export interface BetaEwaReportV1GetResponse { */ generation_time?: string; /** - * A list of earned wage access (EWA) scoring entries that map potential advance amounts to repayment likelihood scores. The predefined advance amount ranges are `[0, 25]`, `[25, 50]`, `[50, 100]`, `[100, 200]`, `[200, 300]`, `[300, 400]`, and `[400, 500]`. + * A list of earned wage access (EWA) scoring entries that map potential advance amounts to repayment likelihood scores. The predefined advance amount ranges are `[0, 25)`, `[25, 50)`, `[50, 100)`, `[100, 200)`, `[200, 300)`, `[300, 400)`, and `[400, 500)`. * @type {Array} * @memberof BetaEwaReportV1GetResponse */ @@ -10847,7 +10853,7 @@ export interface CashflowReportGetResponse { */ transactions: Array; /** - * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched via manipulating the `offset` parameter. + * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched using the `cursor` parameter. * @type {number} * @memberof CashflowReportGetResponse */ @@ -11447,7 +11453,7 @@ export interface CashflowReportTransaction { */ account_id: string; /** - * The settled value of the transaction, denominated in the transactions\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. + * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. * @type {number} * @memberof CashflowReportTransaction */ @@ -11459,7 +11465,7 @@ export interface CashflowReportTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof CashflowReportTransaction */ @@ -11483,7 +11489,7 @@ export interface CashflowReportTransaction { */ location: Location; /** - * The merchant name or transaction description. Note: This is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The merchant name or transaction description. Note: This is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof CashflowReportTransaction */ @@ -11531,7 +11537,7 @@ export interface CashflowReportTransaction { */ transaction_id: string; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof CashflowReportTransaction */ @@ -11591,7 +11597,7 @@ export interface CashflowReportTransaction { */ transaction_code: TransactionCode | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof CashflowReportTransaction */ @@ -11684,7 +11690,7 @@ export interface CashflowReportTransactionsGetResponse { */ transactions: Array; /** - * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched via manipulating the `offset` parameter. + * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched using the `cursor` parameter. * @type {number} * @memberof CashflowReportTransactionsGetResponse */ @@ -11876,7 +11882,7 @@ export interface Cause { */ error_code: string; /** - * The specific reason for the error code. Currently, reasons are only supported OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. + * The specific reason for the error code. Currently, reasons are only supported for OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. * @type {string} * @memberof Cause */ @@ -11956,7 +11962,44 @@ export interface CauseAllOf { item_id?: string; } /** - * It is possible for a Check Report product to be returned with missing information. In such cases, the product will contain warning data in the response, indicating why obtaining the owner information failed. + * An error object plus the `item_id` of an Item that the end user can repair via Link [update mode](https://plaid.com/docs/link/update-mode). The `error_code` will be in the `ITEM_LOGIN_REQUIRED` family. + * @export + * @interface CheckReportRepairableItem + */ +export interface CheckReportRepairableItem { + /** + * + * @type {PlaidErrorType} + * @memberof CheckReportRepairableItem + */ + error_type: PlaidErrorType; + /** + * The particular error code. Safe for programmatic use. + * @type {string} + * @memberof CheckReportRepairableItem + */ + error_code: string; + /** + * A developer-friendly representation of the error code. This may change over time and is not safe for programmatic use. + * @type {string} + * @memberof CheckReportRepairableItem + */ + error_message: string; + /** + * A user-friendly representation of the error code. `null` if the error is not related to user action. + * @type {string} + * @memberof CheckReportRepairableItem + */ + display_message: string | null; + /** + * The `item_id` of the Item associated with this webhook, warning, or error + * @type {string} + * @memberof CheckReportRepairableItem + */ + item_id: string; +} +/** + * It is possible for a Check Report product to be returned with missing information. In such cases, the product will contain warning data in the response, indicating why some of the requested information could not be retrieved. * @export * @interface CheckReportWarning */ @@ -12133,7 +12176,7 @@ export interface ClientProvidedRawTransaction { */ description: string; /** - * The value of the transaction with direction. (NOTE: this will affect enrichment results, so directions are important):. Negative (-) for credits (e.g., incoming transfers, refunds) Positive (+) for debits (e.g., purchases, fees, outgoing transfers) + * The value of the transaction with direction. (NOTE: this will affect enrichment results, so directions are important). Negative (-) for credits (e.g., incoming transfers, refunds) Positive (+) for debits (e.g., purchases, fees, outgoing transfers) * @type {number} * @memberof ClientProvidedRawTransaction */ @@ -12459,7 +12502,7 @@ export interface ConnectedApplication { */ reason_for_access?: string | null; /** - * The date this application was linked in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) (YYYY-MM-DD) format in UTC. + * The date and time this application was linked, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format in UTC (e.g. `\"2020-01-01T00:00:00Z\"`). Note that older, legacy integrations instead receive this value as a date only, in `YYYY-MM-DD` format (e.g. `\"2020-01-01\"`). * @type {string} * @memberof ConnectedApplication */ @@ -12832,7 +12875,7 @@ export interface Counterparty { */ website: string | null; /** - * The URL of a logo associated with the counterparty, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with the counterparty, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Counterparty */ @@ -13653,7 +13696,7 @@ export interface CraCashflowInsightsReport { attributes?: object; } /** - * BaseReportGetRequest defines the request schema for `/cra/check_report/base_report/get` + * CraCheckReportBaseReportGetRequest defines the request schema for `/cra/check_report/base_report/get` * @export * @interface CraCheckReportBaseReportGetRequest */ @@ -13700,6 +13743,18 @@ export interface CraCheckReportBaseReportGetRequest { * @memberof CraCheckReportBaseReportGetRequest */ user_tier?: CraUserTier | null; + /** + * The CRA report token (formatted `cra-report--`) identifying a specific consumer report. When provided alongside `consumer_report_permissible_purpose`, pins retrieval to that report and stamps its permissible purpose. If omitted, the most recently generated report for the user is returned. + * @type {string} + * @memberof CraCheckReportBaseReportGetRequest + */ + report_id?: string; + /** + * + * @type {CraCheckReportPermissiblePurpose} + * @memberof CraCheckReportBaseReportGetRequest + */ + consumer_report_permissible_purpose?: CraCheckReportPermissiblePurpose; } /** * CraCheckReportBaseReportGetResponse defines the response schema for `/cra/check_report/base_report/get` @@ -13727,7 +13782,7 @@ export interface CraCheckReportBaseReportGetResponse { request_id: string; } /** - * Defines configuration options to generate Cashflow Insights + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportCashflowInsightsGetOptions */ @@ -13779,6 +13834,7 @@ export interface CraCheckReportCashflowInsightsGetRequest { * * @type {CraCheckReportCashflowInsightsGetOptions} * @memberof CraCheckReportCashflowInsightsGetRequest + * @deprecated */ options?: CraCheckReportCashflowInsightsGetOptions | null; } @@ -13839,6 +13895,77 @@ export interface CraCheckReportCreateBaseReportOptions { */ home_lending_report_options?: CraCheckReportHomeLendingReportOptions | null; } +/** + * Defines configuration options to generate Cashflow Insights + * @export + * @interface CraCheckReportCreateCashflowInsightsOptions + */ +export interface CraCheckReportCreateCashflowInsightsOptions { + /** + * + * @type {CashflowAttributesVersion} + * @memberof CraCheckReportCreateCashflowInsightsOptions + */ + attributes_version?: CashflowAttributesVersion | null; +} +/** + * Defines configuration options for the Employment Refresh Report. + * @export + * @interface CraCheckReportCreateEmploymentRefreshOptions + */ +export interface CraCheckReportCreateEmploymentRefreshOptions { + /** + * The number of days of data to request for the report. This field is required if an Employment Refresh Report is requested. Maximum is 731. + * @type {number} + * @memberof CraCheckReportCreateEmploymentRefreshOptions + */ + days_requested: number; +} +/** + * Defines configuration options to generate Income Insights. + * @export + * @interface CraCheckReportCreateIncomeInsightsOptions + */ +export interface CraCheckReportCreateIncomeInsightsOptions { + /** + * + * @type {IncomeInsightsFilter} + * @memberof CraCheckReportCreateIncomeInsightsOptions + */ + income_insights_filter?: IncomeInsightsFilter | null; + /** + * + * @type {IncomeInsightsVersion} + * @memberof CraCheckReportCreateIncomeInsightsOptions + */ + income_insights_version: IncomeInsightsVersion | null; +} +/** + * Defines configuration options to generate the LendScore + * @export + * @interface CraCheckReportCreateLendScoreOptions + */ +export interface CraCheckReportCreateLendScoreOptions { + /** + * + * @type {PlaidLendScoreVersion} + * @memberof CraCheckReportCreateLendScoreOptions + */ + lend_score_version?: PlaidLendScoreVersion | null; +} +/** + * Defines configuration options to generate Network Insights + * @export + * @interface CraCheckReportCreateNetworkInsightsOptions + */ +export interface CraCheckReportCreateNetworkInsightsOptions { + /** + * + * @type {NetworkInsightsVersion} + * @memberof CraCheckReportCreateNetworkInsightsOptions + */ + network_insights_version?: NetworkInsightsVersion | null; +} /** * Defines configuration to generate Partner Insights. * @export @@ -13913,7 +14040,7 @@ export interface CraCheckReportCreateRequest { */ client_report_id?: string | null; /** - * Specifies a list of products that will be eagerly generated when creating the report (in addition to the Base Report, which is always eagerly generated). These products will be made available before a success webhook is sent. Use this option to minimize response latency for product `/get` endpoints. Note that specifying `cra_partner_insights` in this field will trigger a billable event. Other products are not billed until the respective reports are fetched via product-specific `/get` endpoints. + * Specifies a list of products to generate when creating the report (in addition to the Base Report, which is always generated). These products will be made available before a success webhook is sent. Note that specifying `cra_partner_insights` in this field will trigger a billable event. Other products are not billed until the respective reports are retrieved via their product-specific `/get` endpoints. * @type {Array} * @memberof CraCheckReportCreateRequest */ @@ -13926,10 +14053,10 @@ export interface CraCheckReportCreateRequest { base_report?: CraCheckReportCreateBaseReportOptions | null; /** * - * @type {CraCheckReportCashflowInsightsGetOptions} + * @type {CraCheckReportCreateCashflowInsightsOptions} * @memberof CraCheckReportCreateRequest */ - cashflow_insights?: CraCheckReportCashflowInsightsGetOptions | null; + cashflow_insights?: CraCheckReportCreateCashflowInsightsOptions | null; /** * * @type {CraCheckReportCreatePartnerInsightsOptions} @@ -13938,16 +14065,16 @@ export interface CraCheckReportCreateRequest { partner_insights?: CraCheckReportCreatePartnerInsightsOptions | null; /** * - * @type {CraCheckReportLendScoreGetOptions} + * @type {CraCheckReportCreateLendScoreOptions} * @memberof CraCheckReportCreateRequest */ - lend_score?: CraCheckReportLendScoreGetOptions | null; + lend_score?: CraCheckReportCreateLendScoreOptions | null; /** * - * @type {CraCheckReportNetworkInsightsGetOptions} + * @type {CraCheckReportCreateNetworkInsightsOptions} * @memberof CraCheckReportCreateRequest */ - network_insights?: CraCheckReportNetworkInsightsGetOptions | null; + network_insights?: CraCheckReportCreateNetworkInsightsOptions | null; /** * Indicates that investment data should be extracted from the linked account(s). * @type {boolean} @@ -13956,10 +14083,10 @@ export interface CraCheckReportCreateRequest { include_investments?: boolean | null; /** * - * @type {CraCheckReportIncomeInsightsGetOptions} + * @type {CraCheckReportCreateIncomeInsightsOptions} * @memberof CraCheckReportCreateRequest */ - income_insights?: CraCheckReportIncomeInsightsGetOptions | null; + income_insights?: CraCheckReportCreateIncomeInsightsOptions | null; /** * * @type {ConsumerReportPermissiblePurpose} @@ -14004,6 +14131,24 @@ export interface CraCheckReportFailedWebhook { * @memberof CraCheckReportFailedWebhook */ user_id: string; + /** + * Details on why the Check Report failed and how to resolve it. + * @type {PlaidError} + * @memberof CraCheckReportFailedWebhook + */ + error?: PlaidError | null; + /** + * A list of Items that the end user can repair via Link [update mode](https://plaid.com/docs/link/update-mode). Empty when no Item is user-repairable. After repairing these Items, call `/cra/check_report/create` to regenerate the report. + * @type {Array} + * @memberof CraCheckReportFailedWebhook + */ + repairable_items?: Array; + /** + * Specifies a list of products that failed to generate for the report. Populated when generation was attempted and all requested products failed. Additional detail on what caused the failure can be found by calling the product /get endpoint. + * @type {Array} + * @memberof CraCheckReportFailedWebhook + */ + failed_products?: Array; /** * A list of `item_ids` included in the Check Report. Access to this field is in closed beta. * @type {Array} @@ -14119,13 +14264,13 @@ export interface CraCheckReportHomeLendingReportOptions { reports_requested: Array; /** * - * @type {CraCheckReportVerificationGetEmploymentRefreshOptions} + * @type {CraCheckReportCreateEmploymentRefreshOptions} * @memberof CraCheckReportHomeLendingReportOptions */ - employment_refresh_options?: CraCheckReportVerificationGetEmploymentRefreshOptions | null; + employment_refresh_options?: CraCheckReportCreateEmploymentRefreshOptions | null; } /** - * Defines configuration options to generate Income Insights. + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportIncomeInsightsGetOptions */ @@ -14183,8 +14328,21 @@ export interface CraCheckReportIncomeInsightsGetRequest { * * @type {CraCheckReportIncomeInsightsGetOptions} * @memberof CraCheckReportIncomeInsightsGetRequest + * @deprecated */ options?: CraCheckReportIncomeInsightsGetOptions | null; + /** + * The CRA report token (formatted `cra-report--`) identifying a specific consumer report. When provided alongside `consumer_report_permissible_purpose`, pins retrieval to that report and stamps its permissible purpose. If omitted, the most recently generated report for the user is returned. + * @type {string} + * @memberof CraCheckReportIncomeInsightsGetRequest + */ + report_id?: string; + /** + * + * @type {CraCheckReportPermissiblePurpose} + * @memberof CraCheckReportIncomeInsightsGetRequest + */ + consumer_report_permissible_purpose?: CraCheckReportPermissiblePurpose; } /** * CraCheckReportIncomeInsightsGetResponse defines the response schema for `/cra/check_report/income_insights/get`. @@ -14212,7 +14370,7 @@ export interface CraCheckReportIncomeInsightsGetResponse { warnings?: Array; } /** - * Defines configuration options to generate the LendScore + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportLendScoreGetOptions */ @@ -14264,6 +14422,7 @@ export interface CraCheckReportLendScoreGetRequest { * * @type {CraCheckReportLendScoreGetOptions} * @memberof CraCheckReportLendScoreGetRequest + * @deprecated */ options?: CraCheckReportLendScoreGetOptions | null; } @@ -14293,7 +14452,7 @@ export interface CraCheckReportLendScoreGetResponse { warnings?: Array; } /** - * Defines configuration options to generate Network Insights + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportNetworkInsightsGetOptions */ @@ -14333,6 +14492,7 @@ export interface CraCheckReportNetworkInsightsGetRequest { * * @type {CraCheckReportNetworkInsightsGetOptions} * @memberof CraCheckReportNetworkInsightsGetRequest + * @deprecated */ options?: CraCheckReportNetworkInsightsGetOptions | null; /** @@ -14431,7 +14591,7 @@ export interface CraCheckReportPartnerInsightsGetOptions { prism_versions?: PrismVersionsDeprecated | null; } /** - * Defines configuration to generate Partner Insights. + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `partner_insights`. * @export * @interface CraCheckReportPartnerInsightsGetPartnerInsights */ @@ -14495,6 +14655,7 @@ export interface CraCheckReportPartnerInsightsGetRequest { * * @type {CraCheckReportPartnerInsightsGetPartnerInsights} * @memberof CraCheckReportPartnerInsightsGetRequest + * @deprecated */ partner_insights?: CraCheckReportPartnerInsightsGetPartnerInsights; /** @@ -14530,6 +14691,16 @@ export interface CraCheckReportPartnerInsightsGetResponse { */ warnings?: Array; } +/** + * The permissible purpose under the FCRA for retrieving this consumer report. Restricted to permissible purposes related to loan servicing only. Required when `report_id` is provided. + * @export + * @enum {string} + */ +export enum CraCheckReportPermissiblePurpose { + AccountReviewCredit = 'ACCOUNT_REVIEW_CREDIT', + WrittenInstructionOther = 'WRITTEN_INSTRUCTION_OTHER' +} + /** * Fired when the Check Report is ready to be retrieved. Once this webhook has fired, the report will be available to retrieve for 24 hours. * @export @@ -14580,7 +14751,7 @@ export interface CraCheckReportReadyWebhook { environment: WebhookEnvironmentValues; } /** - * Defines configuration options for the Employment Refresh Report. + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `employment_refresh_options`. * @export * @interface CraCheckReportVerificationGetEmploymentRefreshOptions */ @@ -14637,6 +14808,7 @@ export interface CraCheckReportVerificationGetRequest { * * @type {CraCheckReportVerificationGetEmploymentRefreshOptions} * @memberof CraCheckReportVerificationGetRequest + * @deprecated */ employment_refresh_options?: CraCheckReportVerificationGetEmploymentRefreshOptions | null; /** @@ -14714,6 +14886,12 @@ export interface CraCheckReportVerificationPdfGetRequest { * @memberof CraCheckReportVerificationPdfGetRequest */ reports_requested?: Set; + /** + * If `true`, the GSE identifiers (the Report ID and `gse_reference_id`) are omitted from the returned Home Lending Report PDF. Defaults to `false`. These identifiers are always present in the `/cra/check_report/verification/get` JSON response regardless of this field. + * @type {boolean} + * @memberof CraCheckReportVerificationPdfGetRequest + */ + hide_gse_details?: boolean; /** * The user token associated with the user for which data is being requested. This field is used only by customers with pre-existing integrations that already use the `user_token` field. All other customers should use the `user_id` instead. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). * @type {string} @@ -15969,7 +16147,7 @@ export interface CraMonitoringInsightsGetRequest { user_token?: string; } /** - * CraMonitoringInsightsGetResponse defines the response schema for `cra/monitoring_insights/get` + * CraMonitoringInsightsGetResponse defines the response schema for `/cra/monitoring_insights/get` * @export * @interface CraMonitoringInsightsGetResponse */ @@ -16092,7 +16270,7 @@ export interface CraMonitoringInsightsSubscribeRequest { user_token?: string; } /** - * CraMonitoringInsightsSubscribeResponse defines the response schema for `cra/monitoring_insights/subscribe` + * CraMonitoringInsightsSubscribeResponse defines the response schema for `/cra/monitoring_insights/subscribe` * @export * @interface CraMonitoringInsightsSubscribeResponse */ @@ -16136,7 +16314,7 @@ export interface CraMonitoringInsightsUnsubscribeRequest { subscription_id: string; } /** - * CraMonitoringInsightsUnsubscribeResponse defines the response schema for `cra/monitoring_insights/unsubscribe` + * CraMonitoringInsightsUnsubscribeResponse defines the response schema for `/cra/monitoring_insights/unsubscribe` * @export * @interface CraMonitoringInsightsUnsubscribeResponse */ @@ -16961,6 +17139,12 @@ export interface CraPartnerInsightsUltraFicoScoreResult { * @memberof CraPartnerInsightsUltraFicoScoreResult */ error_reason?: string; + /** + * FICO exclusion code indicating why an UltraFICO® score could not be computed due to consumer-data conditions (e.g. insufficient account history). `null` when the exclusion code is not set; \"0\" when a score was produced. + * @type {string} + * @memberof CraPartnerInsightsUltraFicoScoreResult + */ + exclusion_code?: string | null; } /** * The version of the UltraFICO® score. @@ -17015,6 +17199,200 @@ export interface CraProjectedModeledIncome { */ annual: CraAnnualIncomeValues; } +/** + * The stage in the lending lifecycle for which the report is being retrieved. + * @export + * @enum {string} + */ +export enum CraReportDecisionStage { + Prequalification = 'PREQUALIFICATION', + Decisioning = 'DECISIONING', + Servicing = 'SERVICING' +} + +/** + * The CRA report returned by `/cra/report/get`. + * @export + * @interface CraReportGetReport + */ +export interface CraReportGetReport { + /** + * The date and time the report was retrieved. + * @type {string} + * @memberof CraReportGetReport + */ + retrieved_time: string; + /** + * + * @type {CraReportScope} + * @memberof CraReportGetReport + */ + scope: CraReportScope; + /** + * + * @type {CraReportDecisionStage} + * @memberof CraReportGetReport + */ + decision_stage: CraReportDecisionStage; + /** + * + * @type {ConsumerReportPermissiblePurpose} + * @memberof CraReportGetReport + */ + consumer_report_permissible_purpose: ConsumerReportPermissiblePurpose; + /** + * Per-product report data. Each entry corresponds to one requested product. + * @type {Array} + * @memberof CraReportGetReport + */ + products: Array; +} +/** + * CraReportGetRequest defines the request schema for `/cra/report/get`. + * @export + * @interface CraReportGetRequest + */ +export interface CraReportGetRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof CraReportGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof CraReportGetRequest + */ + secret?: string; + /** + * A unique user identifier, created by `/user/create`. Integrations that began using `/user/create` after December 10, 2025 use this field to identify a user instead of the `user_token`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). + * @type {string} + * @memberof CraReportGetRequest + */ + user_id: string; + /** + * The requested products and their versions, e.g. `[{\"product\":\"cra_qualify\",\"version\":\"V1\"}]`. + * @type {Array} + * @memberof CraReportGetRequest + */ + products: Array; + /** + * + * @type {CraReportScope} + * @memberof CraReportGetRequest + */ + scope?: CraReportScope; + /** + * + * @type {CraReportDecisionStage} + * @memberof CraReportGetRequest + */ + decision_stage: CraReportDecisionStage; + /** + * + * @type {ConsumerReportPermissiblePurpose} + * @memberof CraReportGetRequest + */ + consumer_report_permissible_purpose: ConsumerReportPermissiblePurpose; +} +/** + * CraReportGetRequestProduct specifies a product and version for a `/cra/report/get` call. + * @export + * @interface CraReportGetRequestProduct + */ +export interface CraReportGetRequestProduct { + /** + * + * @type {Products} + * @memberof CraReportGetRequestProduct + */ + product: Products; + /** + * The version of the product that was generated. + * @type {string} + * @memberof CraReportGetRequestProduct + */ + version: string; +} +/** + * CraReportGetResponse defines the response schema for `/cra/report/get`. + * @export + * @interface CraReportGetResponse + */ +export interface CraReportGetResponse { + /** + * + * @type {CraReportGetReport} + * @memberof CraReportGetResponse + */ + report: CraReportGetReport; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof CraReportGetResponse + */ + request_id: string; + /** + * A unique user identifier, created by `/user/create`. Integrations that began using `/user/create` after December 10, 2025 use this field to identify a user instead of the `user_token`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). + * @type {string} + * @memberof CraReportGetResponse + */ + user_id: string; + /** + * User or report-level errors that affected the overall report but do not map to a specific product failure. + * @type {Array} + * @memberof CraReportGetResponse + */ + warnings: Array; +} +/** + * Per-product report data. `attributes` is an opaque map of key-value pairs; for a full list of attributes per product and version, see the data dictionary. + * @export + * @interface CraReportGetResponseProduct + */ +export interface CraReportGetResponseProduct { + /** + * + * @type {Products} + * @memberof CraReportGetResponseProduct + */ + product: Products; + /** + * The version of the product that was generated. + * @type {string} + * @memberof CraReportGetResponseProduct + */ + version: string; + /** + * A map of product report metadata, where the key is a string and the value varies by product. For a full list of metadata fields per product, see the data dictionary. May be `null` if metadata was not available. + * @type {{ [key: string]: object; }} + * @memberof CraReportGetResponseProduct + */ + metadata: { [key: string]: object; } | null; + /** + * A map of product attributes, where the key is a string and the value is a float, int, or boolean. The specific list of attributes depends on the product and version. For a full list, see the data dictionary. May be `null` if attributes were not available. + * @type {{ [key: string]: object; }} + * @memberof CraReportGetResponseProduct + */ + attributes: { [key: string]: object; } | null; + /** + * Product-level errors. Non-empty when this product failed to generate; empty on success. + * @type {Array} + * @memberof CraReportGetResponseProduct + */ + errors: Array; +} +/** + * Determines whose items are used. `PLAID_NETWORK` (default) uses the Plaid Network view of the user\'s profile. `CLIENT_USER` uses only the items linked by this client. + * @export + * @enum {string} + */ +export enum CraReportScope { + PlaidNetwork = 'PLAID_NETWORK', + ClientUser = 'CLIENT_USER' +} + /** * Fired when a Check Report upgrade attempt has failed * @export @@ -17076,6 +17454,24 @@ export interface CraUserCheckReportFailedWebhook { * @memberof CraUserCheckReportFailedWebhook */ user_id: string; + /** + * Details on why the Check Report failed and how to resolve it. + * @type {PlaidError} + * @memberof CraUserCheckReportFailedWebhook + */ + error?: PlaidError | null; + /** + * A list of Items that the end user can repair via Link [update mode](https://plaid.com/docs/link/update-mode). Empty when no Item is user-repairable. After repairing these Items, call `/cra/check_report/create` to regenerate the report. + * @type {Array} + * @memberof CraUserCheckReportFailedWebhook + */ + repairable_items?: Array; + /** + * Specifies a list of products that failed to generate for the report. Populated when generation was attempted and all requested products failed. Additional detail on what caused the failure can be found by calling the product /get endpoint. + * @type {Array} + * @memberof CraUserCheckReportFailedWebhook + */ + failed_products?: Array; /** * A list of `item_ids` included in the Check Report. Access to this field is in closed beta. * @type {Array} @@ -19334,7 +19730,7 @@ export interface CreditBankIncomeSummary { */ export interface CreditBankIncomeTransaction { /** - * The settled value of the transaction, denominated in the transactions\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. + * The settled value of the transaction, denominated in the transaction\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. * @type {number} * @memberof CreditBankIncomeTransaction */ @@ -19752,7 +20148,7 @@ export interface CreditBankStatementsUploadsGetRequest { */ export interface CreditBankStatementsUploadsGetRequestOptions { /** - * An array of `item_id`s whose bank statements information is returned. Each `item_id` should uniquely identify a bank statements uploaded item. If this field is not provided, all `item_id`s associated with the `user_token` will returned in the response. + * An array of `item_id`s whose bank statements information is returned. Each `item_id` should uniquely identify a bank statements uploaded item. If this field is not provided, all `item_id`s associated with the `user_token` will be returned in the response. * @type {Array} * @memberof CreditBankStatementsUploadsGetRequestOptions */ @@ -19870,13 +20266,13 @@ export interface CreditDocumentMetadata { */ name: string; /** - * The type of document. `PAYSTUB`: A paystub. `BANK_STATEMENT`: A bank statement. `US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `NONE`: Used to indicate that there is no underlying document for the data. `UNKNOWN`: Document type could not be determined. + * The type of document. `PAYSTUB`: A paystub. `BANK_STATEMENT`: A bank statement. `US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `US_TAX_1099_MISC`: A 1099-MISC tax form reporting miscellaneous income. `US_TAX_1099_K`: A 1099-K tax form reporting payment card and third-party network transactions. `US_STUDENT_I20`: A Certificate of Eligibility for Nonimmigrant Student Status (Form I-20) issued by a US school. `US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `NONE`: Used to indicate that there is no underlying document for the data. `UNKNOWN`: Document type could not be determined. * @type {string} * @memberof CreditDocumentMetadata */ document_type: string | null; /** - * Signed URL to retrieve the document(s). The payload will be a .zip file containing the document(s). For Payroll Income, the file type of the documents will always be PDF, and the documents may not be available, in which case the field will be `null`. If you would like Plaid to generate a PDF if the original is not available, contact your account manager. [Example generated pay stub](https://plaid.com/documents/plaid-generated-mock-paystub.pdf). For Document Income, this field will not be `null`, and the file type of the underlying document(s) will be the original file type uploaded by the user. For more details on available file types, see the [Document Income](https://plaid.com/docs/income/payroll-income) documentation. This download URL can only be used once and expires after two minutes. To generate a new download URL, call `/credit/payroll_income/get` again. + * Signed URL to retrieve the document(s). The payload will be a .zip file containing the document(s). For Payroll Income, the file type of the documents will always be PDF, and the documents may not be available, in which case the field will be `null`. If you would like Plaid to generate a PDF if the original is not available, contact your account manager. [Example generated pay stub](https://plaid.com/documents/plaid-generated-mock-paystub.pdf). For Document Income, this field will not be `null`, and the file type of the underlying document(s) will be the original file type uploaded by the user. For more details on available file types, see the [Document Income](https://plaid.com/docs/income/document-income) documentation. This download URL can only be used once and expires after two minutes. To generate a new download URL, call `/credit/payroll_income/get` again. * @type {string} * @memberof CreditDocumentMetadata */ @@ -20228,7 +20624,7 @@ export interface CreditFreddieMacParties { PARTY: Array; } /** - * A collection of information about a single party to a transaction. Included direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. + * A collection of information about a single party to a transaction. Includes direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. * @export * @interface CreditFreddieMacParty */ @@ -20441,6 +20837,134 @@ export interface CreditFreddieMacVerificationOfAssetsDeal { */ SERVICES: CreditFreddieMacServices; } +/** + * An object representing an end user\'s Form I-20 US immigration student document. + * @export + * @interface CreditI20 + */ +export interface CreditI20 { + /** + * An identifier of the document referenced by the document metadata. + * @type {string} + * @memberof CreditI20 + */ + document_id?: string | null; + /** + * + * @type {CreditDocumentMetadata} + * @memberof CreditI20 + */ + document_metadata?: CreditDocumentMetadata; + /** + * + * @type {CreditI20Student} + * @memberof CreditI20 + */ + student?: CreditI20Student; + /** + * Amount of the student\'s personal funds. + * @type {number} + * @memberof CreditI20 + */ + personal_funds?: number | null; + /** + * Amount of funds from on-campus employment. + * @type {number} + * @memberof CreditI20 + */ + on_campus_employment?: number | null; + /** + * Amount of funds provided by the issuing school. + * @type {number} + * @memberof CreditI20 + */ + funds_from_this_school?: number | null; + /** + * Total amount of funds available to the student. + * @type {number} + * @memberof CreditI20 + */ + students_funding_total?: number | null; + /** + * Amount of funds from another source. + * @type {number} + * @memberof CreditI20 + */ + funds_from_another_source?: number | null; + /** + * Estimated total average costs for the program period. + * @type {number} + * @memberof CreditI20 + */ + estimated_average_costs_total?: number | null; + /** + * Estimated average living expenses. + * @type {number} + * @memberof CreditI20 + */ + estimated_average_living_expenses?: number | null; + /** + * Number of months the student\'s funding covers. + * @type {number} + * @memberof CreditI20 + */ + students_funding_period_months?: number | null; + /** + * Number of months the estimated average costs cover. + * @type {number} + * @memberof CreditI20 + */ + estimated_average_costs_period_months?: number | null; +} +/** + * An object representing the student named on a Form I-20. + * @export + * @interface CreditI20Student + */ +export interface CreditI20Student { + /** + * Given name of the student. + * @type {string} + * @memberof CreditI20Student + */ + given_name?: string | null; + /** + * Surname or primary name of the student. + * @type {string} + * @memberof CreditI20Student + */ + surname_primary_name?: string | null; + /** + * Name of the student as it appears on their passport. + * @type {string} + * @memberof CreditI20Student + */ + passport_name?: string | null; + /** + * Preferred name of the student. + * @type {string} + * @memberof CreditI20Student + */ + preferred_name?: string | null; + /** + * Name of the school issuing the Form I-20. + * @type {string} + * @memberof CreditI20Student + */ + school_name?: string | null; + /** + * Start date of the program in ISO 8601 format (YYYY-MM-DD). + * @type {string} + * @memberof CreditI20Student + */ + program_start_date?: string | null; + /** + * End date of the program in ISO 8601 format (YYYY-MM-DD). + * @type {string} + * @memberof CreditI20Student + */ + program_end_date?: string | null; +} /** * An object representing an end user\'s pay stub. * @export @@ -20590,7 +21114,7 @@ export interface CreditPayStubEmployee { */ name: string | null; /** - * Marital status of the employee - either `SINGLE` or `MARRIED` or `NOT LISTED`. + * Marital status of the employee - one of `SINGLE`, `MARRIED`, or `NOT LISTED`. * @type {string} * @memberof CreditPayStubEmployee */ @@ -20646,7 +21170,7 @@ export interface CreditPayStubNetPay { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof CreditPayStubNetPay */ @@ -20713,7 +21237,7 @@ export interface CreditPayrollIncomeGetRequest { */ export interface CreditPayrollIncomeGetRequestOptions { /** - * An array of `item_id`s whose payroll information is returned. Each `item_id` should uniquely identify a payroll income item. If this field is not provided, all `item_id`s associated with the `user_token` will returned in the response. + * An array of `item_id`s whose payroll information is returned. Each `item_id` should uniquely identify a payroll income item. If this field is not provided, all `item_id`s associated with the `user_token` will be returned in the response. * @type {Array} * @memberof CreditPayrollIncomeGetRequestOptions */ @@ -20981,7 +21505,7 @@ export interface CreditPayrollIncomeRiskSignalsGetRequest { user_id?: string; } /** - * CreditPayrollIncomeRiskSignalsGetRequest defines the response schema for `/credit/payroll_income/risk_signals/get` + * CreditPayrollIncomeRiskSignalsGetResponse defines the response schema for `/credit/payroll_income/risk_signals/get` * @export * @interface CreditPayrollIncomeRiskSignalsGetResponse */ @@ -21397,6 +21921,12 @@ export interface CreditSessionDocumentIncomeResult { * @memberof CreditSessionDocumentIncomeResult */ num_1099s_uploaded: number; + /** + * The number of I-20s uploaded by the user + * @type {number} + * @memberof CreditSessionDocumentIncomeResult + */ + num_i20s_uploaded: number; } /** * The details of a Link error. @@ -21603,7 +22133,7 @@ export interface CreditW2 { */ tax_year: string | null; /** - * An employee identification number or EIN. + * An employer identification number or EIN. * @type {string} * @memberof CreditW2 */ @@ -21749,7 +22279,7 @@ export interface CustomSandboxTransaction { iso_currency_code?: string; } /** - * The object contains a risk score and a risk tier that evaluate the transaction return risk of an unauthorized debit. Common return codes in this category include: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, the customer of financial institutions can dispute a transaction as unauthorized. + * The object contains a risk score and a risk tier that evaluate the transaction return risk of an unauthorized debit. Common return codes in this category include: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, customers of financial institutions can dispute a transaction as unauthorized. * @export * @interface CustomerInitiatedReturnRisk */ @@ -22010,7 +22540,7 @@ export interface DeductionsBreakdown { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof DeductionsBreakdown */ @@ -22041,7 +22571,7 @@ export interface DeductionsTotal { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof DeductionsTotal */ @@ -22221,7 +22751,7 @@ export interface DetectedAccount { total_inflows: number; } /** - * Device Id associated with the device used during the previous link session + * Device ID associated with the device used during the previous Link session * @export * @interface DeviceId */ @@ -22282,7 +22812,7 @@ export interface DistributionBreakdown { */ type?: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof DistributionBreakdown */ @@ -22296,7 +22826,7 @@ export interface DistributionBreakdown { current_pay?: Pay; } /** - * The type of document. `DOCUMENT_TYPE_PAYSTUB`: A paystub. `DOCUMENT_TYPE_BANK_STATEMENT`: A bank statement. `DOCUMENT_TYPE_US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `DOCUMENT_TYPE_US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `DOCUMENT_TYPE_GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `DOCUMENT_TYPE_NONE`: Used to indicate that there is no underlying document for the data. `DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `UNKNOWN`: Document type could not be determined. + * The type of document. `DOCUMENT_TYPE_PAYSTUB`: A paystub. `DOCUMENT_TYPE_BANK_STATEMENT`: A bank statement. `DOCUMENT_TYPE_US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `DOCUMENT_TYPE_US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `DOCUMENT_TYPE_GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `DOCUMENT_TYPE_NONE`: Used to indicate that there is no underlying document for the data. `DOCUMENT_TYPE_US_TAX_1099_MISC`: A Form 1099-MISC information return reporting miscellaneous income. `DOCUMENT_TYPE_US_TAX_1099_K`: A Form 1099-K information return reporting payment card and third-party network transactions. `DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `DOCUMENT_TYPE_US_STUDENT_I20`: A Form I-20 Certificate of Eligibility for Nonimmigrant Student Status. `UNKNOWN`: Document type could not be determined. * @export * @enum {string} */ @@ -22312,7 +22842,8 @@ export enum DocType { DocumentTypeNone = 'DOCUMENT_TYPE_NONE', DocumentTypeUsTax1099Misc = 'DOCUMENT_TYPE_US_TAX_1099_MISC', DocumentTypeUsTax1099K = 'DOCUMENT_TYPE_US_TAX_1099_K', - DocumentTypePlaidGeneratedPaystubPdf = 'DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF' + DocumentTypePlaidGeneratedPaystubPdf = 'DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF', + DocumentTypeUsStudentI20 = 'DOCUMENT_TYPE_US_STUDENT_I20' } /** @@ -22686,13 +23217,13 @@ export interface EarningsBreakdown { */ rate?: number | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof EarningsBreakdown */ unofficial_currency_code?: string | null; /** - * The year-to-date amount of the deduction. + * The year-to-date amount of the line item. * @type {number} * @memberof EarningsBreakdown */ @@ -22755,7 +23286,7 @@ export interface EarningsTotal { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof EarningsTotal */ @@ -23126,7 +23657,7 @@ export interface Enhancements { */ website?: string | null; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enhancements */ @@ -23168,7 +23699,7 @@ export interface Enhancements { */ personal_finance_category?: PersonalFinanceCategory | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enhancements */ @@ -23235,7 +23766,7 @@ export interface Enrichments { */ location: Location; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enrichments */ @@ -23265,7 +23796,7 @@ export interface Enrichments { */ personal_finance_category: PersonalFinanceCategory | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enrichments */ @@ -23599,7 +24130,7 @@ export interface EntityScreeningStatusUpdatedWebhook { environment: WebhookEnvironmentValues; } /** - * Shorthand identifier for a specific screening list for entities. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_SOE`: State Owned Enterprise List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `US_CAP`: US OFAC Correspondent Account or Payable-Through Account Sanctions `US_FSE`: US OFAC Foreign Sanctions Evaders `US_MBS`: US Non-SDN Menu-Based Sanctions `US_SDN`: US Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `US_CMC`: US OFAC Non-SDN Chinese Military-Industrial Complex List `US_UVL`: Bureau of Industry and Security Unverified List `US_SAM`: US System for Award Management Exclusion List `US_TEL`: US Terrorist Exclusion List `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List + * Shorthand identifier for a specific screening list for entities. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_SOE`: State Owned Enterprise List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `US_CAP`: US OFAC Correspondent Account or Payable-Through Account Sanctions `US_FSE`: US OFAC Foreign Sanctions Evaders `US_MBS`: US Non-SDN Menu-Based Sanctions `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `US_CMC`: US OFAC Non-SDN Chinese Military-Industrial Complex List `US_UVL`: Bureau of Industry and Security Unverified List `US_SAM`: US System for Award Management Exclusion List `US_TEL`: US Terrorist Exclusion List `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List * @export * @enum {string} */ @@ -24111,7 +24642,7 @@ export interface ExtendedRecipientMetadata { */ joined_date: string; /** - * The number of Data Partner consumers that are connected to the recipient for the specific Data Partner + * The number of consumers connected to the recipient through this Data Partner * @type {number} * @memberof ExtendedRecipientMetadata */ @@ -24136,7 +24667,7 @@ export interface ExtendedRecipientMetadataAllOf { */ joined_date: string; /** - * The number of Data Partner consumers that are connected to the recipient for the specific Data Partner + * The number of consumers connected to the recipient through this Data Partner * @type {number} * @memberof ExtendedRecipientMetadataAllOf */ @@ -24632,10 +25163,10 @@ export interface FDXInitiatorFiAttribute { name?: string; /** * - * @type {FDXPartyType} + * @type {string} * @memberof FDXInitiatorFiAttribute */ - value?: FDXPartyType; + value?: string; } /** * Details of consent or payment network identifier or other entity\'s revocation request or other lifecycle status change event @@ -24668,7 +25199,7 @@ export interface FDXLifecycleEvent { */ initiator?: FDXPartyType; /** - * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14) + * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://datatracker.ietf.org/doc/html/rfc3339) * @type {string} * @memberof FDXLifecycleEvent */ @@ -24699,7 +25230,7 @@ export interface FDXNotification { */ subtype?: string; /** - * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14) + * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://datatracker.ietf.org/doc/html/rfc3339) * @type {string} * @memberof FDXNotification */ @@ -25338,6 +25869,19 @@ export interface GenericScreeningHitLocationItems { */ data?: WatchlistScreeningHitLocations; } +/** + * GetConsentsResponse defines the response schema for `/fdx/consents` + * @export + * @interface GetConsentsResponse + */ +export interface GetConsentsResponse { + /** + * Consent grants matching the customerId (and optional status) filter. + * @type {Array} + * @memberof GetConsentsResponse + */ + consent_grants: Array; +} /** * GetRecipientResponse defines the response schema for `/fdx/recipient/{recipientId}` * @export @@ -25581,7 +26125,7 @@ export interface Holding { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof Holding */ @@ -26085,7 +26629,7 @@ export interface IdentityDocumentUploadRiskSignal { */ type?: string | null; /** - * Indicates whether fraud risk was detected on the field. + * Indicates whether fraud risk was detected for this risk signal. * @type {boolean} * @memberof IdentityDocumentUploadRiskSignal */ @@ -26513,13 +27057,14 @@ export interface IdentityVerification { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerification + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerification */ @@ -26690,7 +27235,7 @@ export interface IdentityVerificationCreateRequest { */ client_user_id?: string; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationCreateRequest */ @@ -26732,14 +27277,14 @@ export interface IdentityVerificationCreateRequest { */ secret?: string; /** - * An optional flag specifying how you would like Plaid to handle attempts to create an Identity Verification when an Identity Verification already exists for the provided `client_user_id` and `template_id`. If idempotency is enabled, Plaid will return the existing Identity Verification. If idempotency is disabled, Plaid will reject the request with a `400 Bad Request` status code if an Identity Verification already exists for the supplied `client_user_id` and `template_id`. + * An optional flag specifying how you would like Plaid to handle attempts to create an Identity Verification when an Identity Verification already exists for the provided `client_user_id` and/or `user_id`, and `template_id`. If idempotency is enabled, Plaid will return the existing Identity Verification. If idempotency is disabled, Plaid will reject the request with a `400 Bad Request` status code if an Identity Verification already exists for the supplied `client_user_id` and/or `user_id`, and `template_id`. * @type {boolean} * @memberof IdentityVerificationCreateRequest */ is_idempotent?: boolean | null; } /** - * User information collected outside of Link, most likely via your own onboarding process. Each of the following identity fields are optional: `email_address` `phone_number` `date_of_birth` `name` `address` `id_number` Specifically, these fields are optional in that they can either be fully provided (satisfying every required field in their subschema) or omitted from the request entirely by not providing the key or value. Providing these fields via the API will result in Link skipping the data collection process for the associated user. All verification steps enabled in the associated Identity Verification Template will still be run. Verification steps will either be run immediately, or once the user completes the `accept_tos` step, depending on the value provided to the `gave_consent` field. If you are not using the shareable URL feature, you can optionally provide these fields via `/link/token/create` instead; both `/identity_verification/create` and `/link/token/create` are valid ways to provide this information. Note that if you provide a non-`null` user data object via `/identity_verification/create`, any user data fields entered via `/link/token/create` for the same `client_user_id` will be ignored when prefilling Link. + * User information collected outside of Link, most likely via your own onboarding process. Each of the following identity fields are optional: `email_address` `phone_number` `date_of_birth` `name` `address` `id_number` Specifically, these fields are optional in that they can either be fully provided (satisfying every required field in their subschema) or omitted from the request entirely by not providing the key or value. Providing these fields via the API will result in Link skipping the data collection process for the associated user. All verification steps enabled in the associated Identity Verification Template will still be run. Verification steps will either be run immediately, or once the user completes the `accept_tos` step, depending on the value provided to the `gave_consent` field. If you are not using the shareable URL feature, you can optionally provide these fields via `/link/token/create` instead; both `/identity_verification/create` and `/link/token/create` are valid ways to provide this information. Note that if you provide a non-`null` user data object via `/identity_verification/create`, any user data fields entered via `/link/token/create` for the same `client_user_id` will be ignored when prefilling Link. The `ip_address` field is optional. Provide the end user\'s IP address to enable IP-based risk checks for backend-only integrations that do not use the Link SDK; when the Link SDK is used, the IP address is collected automatically. Unlike the identity fields above, `ip_address` cannot be provided via `/link/token/create`. * @export * @interface IdentityVerificationCreateRequestUser */ @@ -26787,6 +27332,12 @@ export interface IdentityVerificationCreateRequestUser { * @deprecated */ client_user_id?: string | null; + /** + * An IPv4 or IPv6 address. + * @type {string} + * @memberof IdentityVerificationCreateRequestUser + */ + ip_address?: string | null; } /** * An identity verification attempt represents a customer\'s attempt to verify their identity, reflecting the required steps for completing the session, the results for each step, and information collected in the process. @@ -26891,13 +27442,14 @@ export interface IdentityVerificationCreateResponse { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerificationCreateResponse + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationCreateResponse */ @@ -27105,13 +27657,14 @@ export interface IdentityVerificationGetResponse { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerificationGetResponse + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationGetResponse */ @@ -27166,7 +27719,7 @@ export interface IdentityVerificationListRequest { */ client_user_id?: string; /** - * A unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and the `client_user_id` are present in the request, the `user_id` must have been created from the provided `client_user_id`. + * A unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and the `client_user_id` are present in the request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationListRequest */ @@ -27504,13 +28057,14 @@ export interface IdentityVerificationRetryResponse { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerificationRetryResponse + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationRetryResponse */ @@ -27961,7 +28515,7 @@ export interface IncomeInsightsFilter { excluded_categories?: Array; } /** - * The version of Income Insights to use. + * The version of Income Insights to use. This value is not shared across API calls for the same resource. If it is omitted from a request, the default version is used, even if a version was set in an earlier call such as `/link/token/create` or `/cra/check_report/create`. * @export * @enum {string} */ @@ -28793,7 +29347,7 @@ export interface IndividualScreeningHitNames { weak_alias_determination: WeakAliasDetermination; } /** - * Shorthand identifier for a specific screening list for individuals. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_CIA`: CIA List of Chiefs of State and Cabinet Members `IZ_IPL`: Interpol Red Notices for Wanted Persons List `IZ_PEP`: Politically Exposed Persons List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List `US_DPL`: Bureau of Industry and Security Denied Persons List `US_DTC`: US Department of State AECA Debarred `US_FBI`: US Department of Justice FBI Wanted List `US_FSE`: US OFAC Foreign Sanctions Evaders `US_ISN`: US Department of State Nonproliferation Sanctions `US_PLC`: US OFAC Palestinian Legislative Council `US_SAM`: US System for Award Management Exclusion List `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `SG_SOF`: Government of Singapore Terrorists and Terrorist Entities `TR_TWL`: Government of Turkey Terrorist Wanted List `TR_DFD`: Government of Turkey Domestic Freezing Decisions `TR_FOR`: Government of Turkey Foreign Freezing Requests `TR_WMD`: Government of Turkey Weapons of Mass Destruction `TR_CMB`: Government of Turkey Capital Markets Board + * Shorthand identifier for a specific screening list for individuals. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_CIA`: CIA List of Chiefs of State and Cabinet Members `IZ_IPL`: Interpol Red Notices for Wanted Persons List `IZ_PEP`: Politically Exposed Persons List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List `US_DPL`: Bureau of Industry and Security Denied Persons List `US_DTC`: US Department of State AECA Debarred `US_FBI`: US Department of Justice FBI Wanted List `US_FSE`: US OFAC Foreign Sanctions Evaders `US_ISN`: US Department of State Nonproliferation Sanctions `US_MBS`: US Non-SDN Menu-Based Sanctions `US_PLC`: US OFAC Palestinian Legislative Council `US_SAM`: US System for Award Management Exclusion List `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `SG_SOF`: Government of Singapore Terrorists and Terrorist Entities `TR_TWL`: Government of Turkey Terrorist Wanted List `TR_DFD`: Government of Turkey Domestic Freezing Decisions `TR_FOR`: Government of Turkey Foreign Freezing Requests `TR_WMD`: Government of Turkey Weapons of Mass Destruction `TR_CMB`: Government of Turkey Capital Markets Board * @export * @enum {string} */ @@ -28881,7 +29435,7 @@ export interface IndividualWatchlistProgram { is_archived: boolean; } /** - * The `inflow_model` allows you to model a test account that receives regular income or make regular payments on a loan. Any transactions generated by the `inflow_model` will appear in addition to randomly generated test data or transactions specified by `override_accounts`. + * The `inflow_model` allows you to model a test account that receives regular income or makes regular payments on a loan. Any transactions generated by the `inflow_model` will appear in addition to randomly generated test data or transactions specified by `override_accounts`. * @export * @interface InflowModel */ @@ -28899,7 +29453,7 @@ export interface InflowModel { */ income_amount: number; /** - * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the income transaction will appear. The name of the income transaction. This field is required if `type` is `monthly-income`, `monthly-balance-payment` or `monthly-interest-only-payment`. + * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the income transaction will appear. This field is required if `type` is `monthly-income`, `monthly-balance-payment` or `monthly-interest-only-payment`. * @type {number} * @memberof InflowModel */ @@ -28911,7 +29465,7 @@ export interface InflowModel { */ transaction_name: string; /** - * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the balance is calculated for the next payment. The name of the income transaction. This field is required if `type` is `monthly-balance-payment` or `monthly-interest-only-payment`. + * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the balance is calculated for the next payment. This field is required if `type` is `monthly-balance-payment` or `monthly-interest-only-payment`. * @type {string} * @memberof InflowModel */ @@ -29890,7 +30444,7 @@ export interface InvestmentTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof InvestmentTransaction */ @@ -30085,7 +30639,7 @@ export interface InvestmentsAuthDataSources { holdings?: DataSources; } /** - * Identifying information for transferring holdings to an investments account. + * Identifying information for transferring holdings to an investment account. * @export * @interface InvestmentsAuthGetNumbers */ @@ -30215,7 +30769,7 @@ export interface InvestmentsAuthGetResponse { request_id: string; } /** - * Information on the ownership of an investments account + * Information on the ownership of an investment account * @export * @interface InvestmentsAuthOwner */ @@ -30289,7 +30843,7 @@ export interface InvestmentsDefaultUpdateWebhook { environment: WebhookEnvironmentValues; } /** - * Fired after an asynchronous extraction on an investments account. + * Fired after an asynchronous extraction on an investment account. * @export * @interface InvestmentsHistoricalUpdateWebhook */ @@ -30634,7 +31188,7 @@ export interface InvestmentsTransactionsOverride { security?: SecurityOverride; } /** - * Information on an issue encountered with financial institutions interactions with financial institutions during Linking. + * Information on an issue encountered with financial institution interactions during Linking. * @export * @interface Issue */ @@ -31269,7 +31823,7 @@ export interface ItemApplicationScopesUpdateResponse { request_id: string; } /** - * ItemApplicationUnlinkRequest defines the request schema for `/item/application/unlink/` + * ItemApplicationUnlinkRequest defines the request schema for `/item/application/unlink` * @export * @interface ItemApplicationUnlinkRequest */ @@ -31313,7 +31867,7 @@ export interface ItemApplicationUnlinkResponse { request_id: string; } /** - * The method used to populate Auth data for the Item. This field is only populated for Items that have had Auth numbers data set on at least one of its accounts, and will be `null` otherwise. For info about the various flows, see our [Auth coverage documentation](https://plaid.com/docs/auth/coverage/). `INSTANT_AUTH`: The Item\'s Auth data was provided directly by the user\'s institution connection. `INSTANT_MATCH`: The Item\'s Auth data was provided via the Instant Match fallback flow. `AUTOMATED_MICRODEPOSITS`: The Item\'s Auth data was provided via the Automated Micro-deposits flow. `SAME_DAY_MICRODEPOSITS`: The Item\'s Auth data was provided via the Same-Day Micro-deposits flow. `INSTANT_MICRODEPOSITS`: The Item\'s Auth data was provided via the Instant Micro-deposits flow. `DATABASE_MATCH`: The Item\'s Auth data was provided via the Database Match flow. `DATABASE_INSIGHTS`: The Item\'s Auth data was provided via the Database Insights flow. `TRANSFER_MIGRATED`: The Item\'s Auth data was provided via [`/transfer/migrate_account`](https://plaid.com/docs/api/products/transfer/account-linking/#migrate-account-into-transfers). `INVESTMENTS_FALLBACK`: The Item\'s Auth data for Investments Move was provided via a [fallback flow](https://plaid.com/docs/investments-move/#fallback-flows). + * The method used to populate Auth data for the Item. This field is only populated for Items that have had Auth numbers data set on at least one of their accounts, and will be `null` otherwise. For info about the various flows, see our [Auth coverage documentation](https://plaid.com/docs/auth/coverage/). `INSTANT_AUTH`: The Item\'s Auth data was provided directly by the user\'s institution connection. `INSTANT_MATCH`: The Item\'s Auth data was provided via the Instant Match fallback flow. `AUTOMATED_MICRODEPOSITS`: The Item\'s Auth data was provided via the Automated Micro-deposits flow. `SAME_DAY_MICRODEPOSITS`: The Item\'s Auth data was provided via the Same-Day Micro-deposits flow. `INSTANT_MICRODEPOSITS`: The Item\'s Auth data was provided via the Instant Micro-deposits flow. `DATABASE_MATCH`: The Item\'s Auth data was provided via the Database Match flow. `DATABASE_INSIGHTS`: The Item\'s Auth data was provided via the Database Insights flow. `TRANSFER_MIGRATED`: The Item\'s Auth data was provided via [`/transfer/migrate_account`](https://plaid.com/docs/api/products/transfer/account-linking/#migrate-account-into-transfers). `INVESTMENTS_FALLBACK`: The Item\'s Auth data for Investments Move was provided via a [fallback flow](https://plaid.com/docs/investments-move/#fallback-flows). * @export * @enum {string} */ @@ -31625,13 +32179,6 @@ export interface ItemProductReadyWebhook { */ environment: WebhookEnvironmentValues; } -/** - * The reason for terminating products on the Item. - * @export - * @interface ItemProductsTerminateReasonCode - */ -export interface ItemProductsTerminateReasonCode { -} /** * ItemProductsTerminateRequest defines the request schema for `/item/products/terminate` * @export @@ -31658,10 +32205,10 @@ export interface ItemProductsTerminateRequest { access_token: string; /** * - * @type {ItemProductsTerminateReasonCode} + * @type {ProductsTerminateReasonCode} * @memberof ItemProductsTerminateRequest */ - reason_code: ItemProductsTerminateReasonCode; + reason_code: ProductsTerminateReasonCode; /** * Additional context or details about the reason for terminating products on the Item. Personally identifiable information, such as an email address or phone number, should not be included in the `reason_note`. * @type {string} @@ -31910,7 +32457,7 @@ export interface ItemStatusLastWebhook { code_sent?: string; } /** - * Information about the last successful and failed transactions update for the Item. + * An object with information about the status of the Item. * @export * @interface ItemStatusNullable */ @@ -33189,7 +33736,7 @@ export interface LinkDeliveryGetRequest { link_delivery_session_id: string; } /** - * LinkDeliveryGetRequest defines the response schema for `/link_delivery/get` + * LinkDeliveryGetResponse defines the response schema for `/link_delivery/get` * @export * @interface LinkDeliveryGetResponse */ @@ -33251,7 +33798,7 @@ export interface LinkDeliveryInstitution { institution_id?: string; } /** - * Information related to the related to the delivery of the link session to users + * Information related to the delivery of the link session to users * @export * @interface LinkDeliveryMetadata */ @@ -33478,7 +34025,7 @@ export interface LinkEventMetadata { */ match_reason?: string; /** - * The routing number submitted by user at the micro-deposits routing number pane. Emitted by `SUBMIT_ROUTING_NUMBER`. + * The routing number submitted by the user at the micro-deposits routing number pane. Emitted by `SUBMIT_ROUTING_NUMBER`. * @type {string} * @memberof LinkEventMetadata */ @@ -33560,6 +34107,12 @@ export interface LinkEventsWebhook { * @memberof LinkEventsWebhook */ link_token: string; + /** + * + * @type {WebhookEnvironmentValues} + * @memberof LinkEventsWebhook + */ + environment: WebhookEnvironmentValues; } /** * LinkOAuthCorrelationIdExchangeRequest defines the request schema for `/link/oauth/correlation_id/exchange` @@ -33656,7 +34209,7 @@ export interface LinkSessionBankIncomeResult { institution: LinkSessionSuccessMetadataInstitution | null; } /** - * The details of a document upload CRA session in link + * The details of a document upload CRA session in Link * @export * @interface LinkSessionCraDocumentUploadResult */ @@ -34336,7 +34889,7 @@ export interface LinkTokenCreateRequest { */ user_id?: string; /** - * List of Plaid product(s) that the linked Item must support. If launching Link in update mode, should be omitted (unless you are using update mode to add a credit product, such as Assets, Statements, Income, or Plaid Check Consumer Report, to an existing Item); at least one `product` is required otherwise. To maximize the number of institutions and accounts available, initialize Link with the minimal product set required for your use case, as the products specified will limit which institutions and account types will be available to your users in Link. Only institutions that support *all* requested products can be selected; if a user attempts to select an institution that does not support a listed product, a \"Connectivity not supported\" error message will appear in Link. For each specified product, the Item connected by the user must contain at least one compatible account. For details on compatible product / account type combinations, see [the account type/product support matrix](https://plaid.com/docs/api/accounts/#account-type--product-support-matrix). To add products without limiting the institution list or account types, use the [`optional_products`](https://plaid.com/docs/api/link/#link-token-create-request-optional-products) or [`required_if_supported_products`](https://plaid.com/docs/api/link/#link-token-create-request-required-if-supported-products) fields. Products can also be added to an Item by calling the product endpoint after obtaining an access token; this may require the product to be listed in the [`additional_consented_products`](https://plaid.com/docs/api/link/#link-token-create-request-additional-consented-products) array. For details, see [Choosing when to initialize products](https://plaid.com/docs/link/initializing-products/). `balance` is *not* a valid value, the Balance product does not require explicit initialization and will automatically be initialized when any other product is initialized. If launching Link with CRA products, `cra_base_reports` is required and must be included in the `products` array. Note that, unless you have opted to disable Instant Match support, institutions that support Instant Match will also be shown in Link if `auth` is specified as a product, even though these institutions do not contain `auth` in their product array. In Production, you will be billed for each product that you specify when initializing Link. Note that a product cannot be removed from an Item once the Item has been initialized with that product. To stop billing on an Item for subscription-based products, such as Liabilities, Investments, and Transactions, remove the Item via `/item/remove`. + * List of Plaid product(s) that the linked Item must support. If launching Link in update mode, should be omitted (unless you are using update mode to add a credit product, such as Assets, Statements, Income, or Plaid Check Consumer Report, to an existing Item); at least one `product` is required otherwise. To maximize the number of institutions and accounts available, initialize Link with the minimal product set required for your use case, as the products specified will limit which institutions and account types will be available to your users in Link. Only institutions that support *all* requested products can be selected; if a user attempts to select an institution that does not support a listed product, a \"Connectivity not supported\" error message will appear in Link. For each specified product, the Item connected by the user must contain at least one compatible account. For details on compatible product / account type combinations, see [the account type/product support matrix](https://plaid.com/docs/api/accounts/#account-type--product-support-matrix). To add products without limiting the institution list or account types, use the [`optional_products`](https://plaid.com/docs/api/link/#link-token-create-request-optional-products) or [`required_if_supported_products`](https://plaid.com/docs/api/link/#link-token-create-request-required-if-supported-products) fields. Products can also be added to an Item by calling the product endpoint after obtaining an access token; this may require the product to be listed in the [`additional_consented_products`](https://plaid.com/docs/api/link/#link-token-create-request-additional-consented-products) array. For details, see [Choosing when to initialize products](https://plaid.com/docs/link/initializing-products/). `balance` is *not* a valid value, the Balance product does not require explicit initialization and will automatically be initialized when any other product is initialized. If launching Link with CRA products, `cra_base_report` is required and must be included in the `products` array. Note that, unless you have opted to disable Instant Match support, institutions that support Instant Match will also be shown in Link if `auth` is specified as a product, even though these institutions do not contain `auth` in their product array. In Production, you will be billed for each product that you specify when initializing Link. Note that a product cannot be removed from an Item once the Item has been initialized with that product. To stop billing on an Item for subscription-based products, such as Liabilities, Investments, and Transactions, remove the Item via `/item/remove`. * @type {Array} * @memberof LinkTokenCreateRequest */ @@ -34671,7 +35224,7 @@ export interface LinkTokenCreateRequestAuth { */ database_match_enabled?: boolean; /** - * Database Insights has been deprecated and replaced with Database Auth. Use the [Account Verification Dashboard](https://dashboard.plaid.com/account-verification) to enable Database Auth. + * Database Insights has been deprecated and replaced with Database Auth. Use the [Account Verification Dashboard](https://dashboard.plaid.com/account-verification) to enable Database Auth. In Canada, Database Auth is in early availability and cannot yet be managed via the Dashboard; it must be enabled by passing `database_insights_enabled: true` in `/link/token/create`. * @type {boolean} * @memberof LinkTokenCreateRequestAuth * @deprecated @@ -35019,7 +35572,7 @@ export interface LinkTokenCreateRequestIncomeVerification { */ asset_report_id?: string; /** - * An array of access tokens corresponding to Items that a user has previously connected with. Data from these institutions will be cross-referenced with document data received during the Document Income flow to help verify that the uploaded documents are accurate. If the `transactions` product was not initialized for these Items during link, it will be initialized after this Link session. This field should only be used with the `payroll` income source type. + * An array of access tokens corresponding to Items that a user has previously connected with. Data from these institutions will be cross-referenced with document data received during the Document Income flow to help verify that the uploaded documents are accurate. If the `transactions` product was not initialized for these Items during Link, it will be initialized after this Link session. This field should only be used with the `payroll` income source type. * @type {Array} * @memberof LinkTokenCreateRequestIncomeVerification */ @@ -35739,7 +36292,7 @@ export interface LoanDisbursementsIndicators { */ monthly_average?: MonthlyAverage | null; /** - * Up to 3 top service providers that the user had the most transactions for in the given time window, in descending order of total spend. If the user has received money from any provider in the given time window, this list will be empty. + * Up to 3 top service providers that the user had the most transactions for in the given time window, in descending order of total spend. If the user has not received money from any provider in the given time window, this list will be empty. * @type {Array} * @memberof LoanDisbursementsIndicators */ @@ -36030,7 +36583,7 @@ export interface MFA { */ selection_rounds: number; /** - * Number of available answers per question, used if `type` is `selection`. Defaults to 2. + * Number of available answers per question, used if `type` is `selections`. Defaults to 2. * @type {number} * @memberof MFA */ @@ -36674,7 +37227,7 @@ export interface NetPay { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof NetPay */ @@ -36893,7 +37446,7 @@ export interface Numbers { bacs_sort_code?: string; } /** - * Identifying information for transferring holdings to an investments account via ACATS. + * Identifying information for transferring holdings to an investment account via ACATS. * @export * @interface NumbersACATS */ @@ -36930,7 +37483,7 @@ export interface NumbersACH { */ account_id: string; /** - * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive \"tokenized\" routing and account numbers, which are not the user\'s actual account and routing numbers. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive a \"tokenized\" account number, which is not the user\'s actual account number. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACH */ @@ -36942,7 +37495,7 @@ export interface NumbersACH { */ is_tokenized_account_number?: boolean; /** - * The ACH routing number for the account. This may be a tokenized routing number. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH routing number for the account. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACH */ @@ -36979,7 +37532,7 @@ export interface NumbersACHNullable { */ account_id: string; /** - * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive \"tokenized\" routing and account numbers, which are not the user\'s actual account and routing numbers. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive a \"tokenized\" account number, which is not the user\'s actual account number. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACHNullable */ @@ -36991,7 +37544,7 @@ export interface NumbersACHNullable { */ is_tokenized_account_number?: boolean; /** - * The ACH routing number for the account. This may be a tokenized routing number. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH routing number for the account. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACHNullable */ @@ -37016,7 +37569,7 @@ export interface NumbersACHNullable { can_transfer_out?: boolean | null; } /** - * Identifying information for transferring holdings to an investments account via ATON. + * Identifying information for transferring holdings to an investment account via ATON. * @export * @interface NumbersATON */ @@ -37347,7 +37900,7 @@ export interface OAuthIntrospectResponse { */ active: boolean; /** - * A JSON string containing a space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` grant type. `mcp:dashboard` allows access to the MCP dashboard server. + * A space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` subject token type. `mcp:dashboard` allows access to the MCP dashboard server. * @type {string} * @memberof OAuthIntrospectResponse */ @@ -37493,7 +38046,7 @@ export interface OAuthTokenRequest { */ secret?: string; /** - * A JSON string containing a space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` grant type. `mcp:dashboard` allows access to the MCP dashboard server. + * A space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` subject token type. `mcp:dashboard` allows access to the MCP dashboard server. * @type {string} * @memberof OAuthTokenRequest */ @@ -37548,7 +38101,7 @@ export interface OAuthTokenResponse { */ refresh_token: string; /** - * Type of token the access token is. Currently it is always Bearer + * The type of the returned token. `Bearer` for OAuth access tokens. * @type {string} * @memberof OAuthTokenResponse */ @@ -37732,7 +38285,7 @@ export enum OverrideAccountType { } /** - * Data to use to set values of test accounts. Some values cannot be specified in the schema and will instead will be calculated from other test data in order to achieve more consistent, realistic test data. + * Data to use to set values of test accounts. Some values cannot be specified in the schema and will instead be calculated from other test data in order to achieve more consistent, realistic test data. * @export * @interface OverrideAccounts */ @@ -38837,7 +39390,7 @@ export interface PartnerEndCustomerWithSecretsAllOf { secrets?: PartnerEndCustomerSecrets; } /** - * A collection of information about a single party to a transaction. Included direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. + * A collection of information about a single party to a transaction. Includes direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. * @export * @interface Party */ @@ -39030,7 +39583,7 @@ export interface PayStubDeductionsBreakdown { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubDeductionsBreakdown */ @@ -39061,7 +39614,7 @@ export interface PayStubDeductionsTotal { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubDeductionsTotal */ @@ -39116,7 +39669,7 @@ export interface PayStubDistributionBreakdown { */ type: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubDistributionBreakdown */ @@ -39165,13 +39718,13 @@ export interface PayStubEarningsBreakdown { */ rate: number | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubEarningsBreakdown */ unofficial_currency_code: string | null; /** - * The year-to-date amount of the deduction. + * The year-to-date amount of the line item. * @type {number} * @memberof PayStubEarningsBreakdown */ @@ -39202,7 +39755,7 @@ export interface PayStubEarningsTotal { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubEarningsTotal */ @@ -39275,7 +39828,7 @@ export interface PayStubPayPeriodDetails { */ start_date: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubPayPeriodDetails */ @@ -39848,7 +40401,7 @@ export interface PaymentInitiationConsentPayerDetails { emails?: Array; } /** - * The counterparty\'s bank account numbers. Exactly one of IBAN or Bacs data is required. + * The payer\'s bank account numbers. Exactly one of IBAN or Bacs data is required. * @export * @interface PaymentInitiationConsentPayerNumbers */ @@ -40194,7 +40747,7 @@ export interface PaymentInitiationPayment { */ adjusted_reference?: string | null; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof PaymentInitiationPayment */ @@ -40429,7 +40982,7 @@ export interface PaymentInitiationPaymentGetResponse { */ adjusted_reference?: string | null; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof PaymentInitiationPaymentGetResponse */ @@ -40995,7 +41548,7 @@ export interface PaymentInitiationStandingOrderMetadata { valid_standing_order_intervals: Array; } /** - * Transaction information specific to inter-bank transfers. If the transaction was not an inter-bank transfer, all fields will be `null`. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, the `payment_meta` key will always appear, but no data elements are guaranteed. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * Transaction information specific to inter-bank transfers. If the transaction was not an inter-bank transfer, all fields will be `null`. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, the `payment_meta` key will always appear, but no data elements are guaranteed. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @export * @interface PaymentMeta */ @@ -41222,7 +41775,7 @@ export enum PaymentScheme { } /** - * Fired when the status of a payment has changed. For a full explanation of payment statuses and how to handle each, see the [Payment Status guide](https://plaid.com/docs/payment-initiation/payment-status/). Note: Plaid payment statuses do not constitute proof that funds have arrived in the recipient\'s account. Do not use `new_payment_status` to confirm fund settlement. + * Fired when the status of a payment has changed. For a full explanation of payment statuses and how to handle each, see the [Payment Status guide](https://plaid.com/docs/payment-initiation/payment-status/). Note: For standard Payment Initiation, Plaid payment statuses do not constitute proof that funds have arrived in the recipient\'s account, and you should not use `new_payment_status` to confirm fund settlement. For options that provide confirmation of fund receipt, see [Virtual Accounts](https://plaid.com/docs/payment-initiation/virtual-accounts/payment-confirmation/). * @export * @interface PaymentStatusUpdateWebhook */ @@ -41361,6 +41914,12 @@ export interface PayrollIncomeObject { * @memberof PayrollIncomeObject */ form1099s: Array; + /** + * Array of Form I-20 US immigration student documents. + * @type {Array} + * @memberof PayrollIncomeObject + */ + i20s: Array; } /** * An object representing the rate at which an individual is paid. @@ -41604,7 +42163,7 @@ export interface PaystubAddress { */ export interface PaystubDeduction { /** - * The description of the deduction, as provided on the paystub. For example: `\"401(k)\"`, `\"FICA MED TAX\"`. + * The type of the deduction, as provided on the paystub. For example: `\"401(k)\"`, `\"FICA MED TAX\"`. * @type {string} * @memberof PaystubDeduction */ @@ -41908,7 +42467,7 @@ export interface PaystubOverrideEarningsBreakdown { */ rate?: number | null; /** - * The year-to-date amount of the deduction. + * The year-to-date amount of the line item. * @type {number} * @memberof PaystubOverrideEarningsBreakdown */ @@ -42329,7 +42888,7 @@ export interface PersonalFinanceCategory { version?: PersonalFinanceCategoryVersion; } /** - * Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 2025, you may only receive the `v2` taxonomy. + * Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 3, 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 3, 2025, you may only receive the `v2` taxonomy. * @export * @enum {string} */ @@ -42562,7 +43121,7 @@ export interface PlaidError { */ error_code: string; /** - * The specific reason for the error code. Currently, reasons are only supported OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. + * The specific reason for the error code. Currently, reasons are only supported for OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. * @type {string} * @memberof PlaidError */ @@ -42652,7 +43211,20 @@ export enum PlaidErrorType { CheckReportError = 'CHECK_REPORT_ERROR', ConsumerReportError = 'CONSUMER_REPORT_ERROR', UserError = 'USER_ERROR', - IdempotencyError = 'IDEMPOTENCY_ERROR' + IdempotencyError = 'IDEMPOTENCY_ERROR', + AssetsError = 'ASSETS_ERROR', + CraMonitoringError = 'CRA_MONITORING_ERROR', + CreditProfileReportError = 'CREDIT_PROFILE_REPORT_ERROR', + EncompassError = 'ENCOMPASS_ERROR', + EnrichError = 'ENRICH_ERROR', + FraudInsightsError = 'FRAUD_INSIGHTS_ERROR', + FreddieMacError = 'FREDDIE_MAC_ERROR', + LinkDeliveryError = 'LINK_DELIVERY_ERROR', + ProfileError = 'PROFILE_ERROR', + RecurringTransactionsError = 'RECURRING_TRANSACTIONS_ERROR', + StatementsError = 'STATEMENTS_ERROR', + TransferRecurringError = 'TRANSFER_RECURRING_ERROR', + TransferRefundError = 'TRANSFER_REFUND_ERROR' } /** @@ -43802,7 +44374,7 @@ export interface ProcessorInvestmentsTransactionsGetRequest { end_date: string; } /** - * ProcessorInvestmentsTransactionsGetRequest defines the response schema for `/processor/investments/transactions/get` + * ProcessorInvestmentsTransactionsGetResponse defines the response schema for `/processor/investments/transactions/get` * @export * @interface ProcessorInvestmentsTransactionsGetResponse */ @@ -44085,7 +44657,7 @@ export interface ProcessorSignalEvaluateRequest { */ is_recurring?: boolean | null; /** - * The default ACH or non-ACH payment method to complete the transaction. `SAME_DAY_ACH`: Same Day ACH by Nacha. The debit transaction is processed and settled on the same day. `STANDARD_ACH`: Standard ACH by Nacha. `MULTIPLE_PAYMENT_METHODS`: If there is no default debit rail or there are multiple payment methods. Possible values: `SAME_DAY_ACH`, `STANDARD_ACH`, `MULTIPLE_PAYMENT_METHODS` + * The default ACH payment method to complete the transaction. `SAME_DAY_ACH`: Same Day ACH by Nacha. The debit transaction is processed and settled on the same day. `STANDARD_ACH`: Standard ACH by Nacha. `MULTIPLE_PAYMENT_METHODS`: If there is no default debit rail or there are multiple payment methods. Possible values: `SAME_DAY_ACH`, `STANDARD_ACH`, `MULTIPLE_PAYMENT_METHODS` * @type {string} * @memberof ProcessorSignalEvaluateRequest */ @@ -44291,7 +44863,7 @@ export interface ProcessorStripeBankAccountTokenCreateResponse { request_id: string; } /** - * This webhook is only sent to [Plaid processor partners](https://plaid.com/docs/auth/partnerships/). Fired when an Item\'s transactions change. This can be due to any event resulting in new changes, such as an initial 30-day transactions fetch upon the initialization of an Item with transactions, the backfill of historical transactions that occurs shortly after, or when changes are populated from a regularly-scheduled transactions update job. It is recommended to listen for the `SYNC_UPDATES_AVAILABLE` webhook when using the `/processor/transactions/sync` endpoint. Note that when using `/processor/transactions/sync` the older webhooks `INITIAL_UPDATE`, `HISTORICAL_UPDATE`, `DEFAULT_UPDATE`, and `TRANSACTIONS_REMOVED`, which are intended for use with `/processor/transactions/get`, will also continue to be sent in order to maintain backwards compatibility. It is not necessary to listen for and respond to those webhooks when using `/processor/transactions/sync`. After receipt of this webhook, the new changes can be fetched for the Item from `/processor/transactions/sync`. Note that to receive this webhook for an Item, `/processor/transactions/sync` must have been called at least once on that Item. This means that, unlike the `INITIAL_UPDATE` and `HISTORICAL_UPDATE` webhooks, it will not fire immediately upon Item creation. If `/transactions/sync` is called on an Item that was *not* initialized with Transactions, the webhook will fire twice: once the first 30 days of transactions data has been fetched, and a second time when all available historical transactions data has been fetched. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic transactions data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. + * This webhook is only sent to [Plaid processor partners](https://plaid.com/docs/auth/partnerships/). Fired when an Item\'s transactions change. This can be due to any event resulting in new changes, such as an initial 30-day transactions fetch upon the initialization of an Item with transactions, the backfill of historical transactions that occurs shortly after, or when changes are populated from a regularly-scheduled transactions update job. It is recommended to listen for the `SYNC_UPDATES_AVAILABLE` webhook when using the `/processor/transactions/sync` endpoint. Note that when using `/processor/transactions/sync` the older webhooks `INITIAL_UPDATE`, `HISTORICAL_UPDATE`, `DEFAULT_UPDATE`, and `TRANSACTIONS_REMOVED`, which are intended for use with `/processor/transactions/get`, will also continue to be sent in order to maintain backwards compatibility. It is not necessary to listen for and respond to those webhooks when using `/processor/transactions/sync`. After receipt of this webhook, the new changes can be fetched for the Item from `/processor/transactions/sync`. Note that to receive this webhook for an Item, `/processor/transactions/sync` must have been called at least once on that Item. This means that, unlike the `INITIAL_UPDATE` and `HISTORICAL_UPDATE` webhooks, it will not fire immediately upon Item creation. If `/processor/transactions/sync` is called on an Item that was *not* initialized with Transactions, the webhook will fire twice: once the first 30 days of transactions data has been fetched, and a second time when all available historical transactions data has been fetched. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic transactions data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. * @export * @interface ProcessorSyncUpdatesAvailableWebhook */ @@ -44453,7 +45025,8 @@ export enum ProcessorTokenCreateRequestProcessorEnum { Atomicfi = 'atomicfi', Pay = 'pay', Natural = 'natural', - Kanmon = 'kanmon' + Kanmon = 'kanmon', + Kick = 'kick' } /** @@ -44808,7 +45381,7 @@ export interface ProcessorTransactionsRecurringGetRequest { */ export interface ProcessorTransactionsRecurringGetResponse { /** - * An array of depository transaction streams. + * An array of inflow transaction streams. * @type {Array} * @memberof ProcessorTransactionsRecurringGetResponse */ @@ -45018,7 +45591,7 @@ export interface ProcessorTransactionsSyncResponse { request_id: string; } /** - * The product access being requested. Used to or disallow product access across all accounts. If unset, defaults to all products allowed. + * The product access being requested. Used to allow or disallow product access across all accounts. If unset, defaults to all products allowed. * @export * @interface ProductAccess */ @@ -45178,7 +45751,7 @@ export enum ProductStatusStatusEnum { } /** - * A detailed breakdown of the institution\'s performance for a request type. The values for `success`, `error_plaid`, and `error_institution` sum to 1. The time range used for calculating the breakdown may range from the most recent few minutes to the past six hours. In general, smaller institutions will show status that was calculated over a longer period of time. For Investment updates, which are refreshed less frequently, the period assessed may be 24 hours or more. For more details, see [Institution status details](https://plaid.com/docs/account/activity/#institution-status-details). + * A detailed breakdown of the institution\'s performance for a request type. The values for `success`, `error_plaid`, and `error_institution` sum to 1. The time range used for calculating the breakdown may range from the most recent few minutes to the past six hours. In general, smaller institutions will show status that was calculated over a longer period of time. For Investment updates, which are refreshed less frequently, the period assessed may be 24 hours or more. For more details, see [Institution status details](https://plaid.com/docs/account/activity/#troubleshooting-institution-insights). * @export * @interface ProductStatusBreakdown */ @@ -45267,7 +45840,7 @@ export enum Products { } /** - * The reason for terminating products. `FRAUD_FIRST_PARTY`: The end user who owns the connected bank account committed fraud `FRAUD_FALSE_IDENTITY`: The end user created the connection using false identity information or stolen credentials `FRAUD_ABUSE`: The end user is abusing the client\'s service or platform through their connected account `FRAUD_OTHER`: Other fraud-related reasons involving the end user not covered by the specific fraud categories `FRAUD_TRANSACTION`: Fraud occurred at the transaction level, such as an unauthorized transaction, card testing, chargeback, ACH return, or dispute `CONSUMER_LOAN_PAID_OFF`: The end user paid off their loan and no longer needs the product `CONSUMER_ACCOUNT_CLOSED`: The end user closed their account with the client and no longer needs the product `CONSUMER_CHARGE_OFF`: The end user\'s account has been charged off `CONSUMER_PAYMENT_METHOD_SWITCHED`: The end user switched to a different payment method and no longer needs the product `USER_OFFBOARDING`: The user is offboarding from the service or platform `DUPLICATE_ITEM`: The connection is a duplicate of another existing connection for the same user `BILLING_TERMINATION`: The user\'s billing or subscription relationship has ended `OTHER`: Any other reason for terminating products not covered by the above categories + * The reason for terminating products. `FRAUD_FIRST_PARTY`: The end user who owns the connected bank account committed fraud using their real identity `FRAUD_FALSE_IDENTITY`: The connection was created using a false or stolen identity `FRAUD_ABUSE`: The end user is abusing the client\'s service or platform (for example, automation or excessive retries) through their connected account `FRAUD_OTHER`: Fraud-related, but not covered by the specific fraud categories above; `reason_note` should clarify `FRAUD_TRANSACTION`: Fraud occurred at the transaction level, such as an unauthorized transaction, card testing, chargeback, ACH return, or dispute `CONSUMER_LOAN_PAID_OFF`: The end user paid off their loan and no longer needs the product `CONSUMER_ACCOUNT_CLOSED`: The end user closed their account with the client and no longer needs the product `CONSUMER_CHARGE_OFF`: The end user\'s account has been charged off `CONSUMER_PAYMENT_METHOD_SWITCHED`: The end user switched to a different payment method and no longer needs the product `USER_OFFBOARDING`: The user is offboarding from the client\'s service or platform `DUPLICATE_ITEM`: This Item is a duplicate of another active Item for the same user `BILLING_TERMINATION`: The client\'s billing or subscription relationship with the end user has ended `OTHER`: None of the above; `reason_note` should clarify * @export * @enum {string} */ @@ -45454,6 +46027,12 @@ export interface ProtectComputeResponse { * @memberof ProtectComputeResponse */ subscores?: ProtectComputeSubscores | null; + /** + * The timestamp when the Trust Index score and fraud attributes were computed, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format, e.g. `\"2017-09-14T14:42:19.350Z\"` + * @type {string} + * @memberof ProtectComputeResponse + */ + timestamp?: string | null; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -45523,7 +46102,7 @@ export interface ProtectEvent { */ timestamp: string; /** - * If present, contains the current Protect Session ID from the Plaid Pixel SDK. + * If present, contains the current Protect Session ID from the Protect SDK. * @type {string} * @memberof ProtectEvent */ @@ -46363,6 +46942,19 @@ export interface RecaptchaRequiredError { */ troubleshooting_steps?: string; } +/** + * Additional details for receiver events. Currently always `null`. + * @export + * @interface ReceiverDetails + */ +export interface ReceiverDetails { + /** + * The available balance associated with the receiver event. + * @type {string} + * @memberof ReceiverDetails + */ + available_balance: string | null; +} /** * An object containing a Bacs account number and sort code. If an IBAN is not provided or if you need to accept domestic GBP-denominated payments, Bacs data is required. * @export @@ -48212,7 +48804,7 @@ export interface SandboxCraCashflowUpdatesUpdateRequest { user_id?: string; } /** - * SandboxCraCashflowUpdatesUpdateResponse defines the response schema for `sandbox/cashflow_updates/update` + * SandboxCraCashflowUpdatesUpdateResponse defines the response schema for `/sandbox/cra/cashflow_updates/update` * @export * @interface SandboxCraCashflowUpdatesUpdateResponse */ @@ -48224,6 +48816,62 @@ export interface SandboxCraCashflowUpdatesUpdateResponse { */ request_id: string; } +/** + * Request to seed an FDX consent grant, and its backing item, for the given end user and recipient application so the FDX Consent API can be exercised in Sandbox. + * @export + * @interface SandboxFdxConsentSeedRequest + */ +export interface SandboxFdxConsentSeedRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + secret?: string; + /** + * The data provider\'s identifier for the end user to associate the seeded consent grant with. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + customer_id: string; + /** + * This field will map to the application ID that is returned from `/item/application/list`, or provided to the institution in an oauth redirect. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + application_id: string; + /** + * Optional UUIDv4 identifier for the seeded consent grant. If omitted, one is generated. Seeding fails if a grant with this identifier already exists. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + consent_id?: string; +} +/** + * Response containing the identifier of the seeded FDX consent grant, which can then be listed, retrieved, and revoked through the FDX Consent API. + * @export + * @interface SandboxFdxConsentSeedResponse + */ +export interface SandboxFdxConsentSeedResponse { + /** + * The identifier of the newly seeded FDX consent grant. + * @type {string} + * @memberof SandboxFdxConsentSeedResponse + */ + consent_id: string; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof SandboxFdxConsentSeedResponse + */ + request_id: string; +} /** * SandboxIncomeFireWebhookRequest defines the request schema for `/sandbox/income/fire_webhook` * @export @@ -48538,7 +49186,7 @@ export interface SandboxItemSetVerificationStatusResponse { request_id: string; } /** - * Defines the request schema for `sandbox/oauth/select_accounts` + * Defines the request schema for `/sandbox/oauth/select_accounts` * @export * @interface SandboxOauthSelectAccountsRequest */ @@ -48700,13 +49348,13 @@ export interface SandboxProcessorTokenCreateRequest { */ export interface SandboxProcessorTokenCreateRequestOptions { /** - * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. + * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. You can also use a custom test user — either set this to the username of a custom user configured in the Dashboard, or set it to `user_custom` and pass the JSON-stringified custom user configuration object as `override_password` to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxProcessorTokenCreateRequestOptions */ override_username?: string | null; /** - * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. + * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. You can also use a custom test user — reference one configured in the Dashboard via `override_username`, or set `override_username` to `user_custom` and pass the JSON-stringified custom user configuration object as this field to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxProcessorTokenCreateRequestOptions */ @@ -48806,13 +49454,13 @@ export interface SandboxPublicTokenCreateRequestOptions { */ webhook?: string; /** - * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. + * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. You can also use a custom test user — either set this to the username of a custom user configured in the Dashboard, or set it to `user_custom` and pass the JSON-stringified custom user configuration object as `override_password` to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxPublicTokenCreateRequestOptions */ override_username?: string | null; /** - * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. + * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. You can also use a custom test user — reference one configured in the Dashboard via `override_username`, or set `override_username` to `user_custom` and pass the JSON-stringified custom user configuration object as this field to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxPublicTokenCreateRequestOptions */ @@ -49069,7 +49717,7 @@ export interface SandboxTransferLedgerSimulateAvailableRequest { */ secret?: string; /** - * Specify which ledger balance to simulate converting pending balance to available balance. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to simulate converting pending balance to available balance. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof SandboxTransferLedgerSimulateAvailableRequest */ @@ -49980,7 +50628,7 @@ export interface Security { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof Security */ @@ -50009,6 +50657,12 @@ export interface Security { * @memberof Security */ cfi_code: string | null; + /** + * 12-character FIGI, a unique Financial Instrument Global Identifier assigned to securities that is immutable and stays consistent across most corporate actions. This is an open data standard issued by the Object Management Group and administered by Bloomberg L.P. + * @type {string} + * @memberof Security + */ + figi: string | null; /** * * @type {OptionContract} @@ -51091,7 +51745,7 @@ export interface SignalEvaluateCoreAttributes { */ p50_eod_balance_31d_to_60d?: number | null; /** - * The 50th percentile of the end-of-day available balance between day 61 and day 90 over the past 60 days of the account that will be debited + * The 50th percentile of the end-of-day available balance between day 61 and day 90 over the past 90 days of the account that will be debited * @type {number} * @memberof SignalEvaluateCoreAttributes */ @@ -51103,7 +51757,7 @@ export interface SignalEvaluateCoreAttributes { */ p90_eod_balance_31d_to_60d?: number | null; /** - * The 90th percentile of the end-of-day available balance between day 61 and day 90 over the past 60 days of the account that will be debited + * The 90th percentile of the end-of-day available balance between day 61 and day 90 over the past 90 days of the account that will be debited * @type {number} * @memberof SignalEvaluateCoreAttributes */ @@ -51115,7 +51769,7 @@ export interface SignalEvaluateCoreAttributes { */ p10_eod_balance_31d_to_60d?: number | null; /** - * The 10th percentile of the end-of-day available balance between day 61 and day 90 over the past 60 days of the account that will be debited + * The 10th percentile of the end-of-day available balance between day 61 and day 90 over the past 90 days of the account that will be debited * @type {number} * @memberof SignalEvaluateCoreAttributes */ @@ -51127,13 +51781,13 @@ export interface SignalEvaluateCoreAttributes { */ transactions_last_updated?: string | null; /** - * Indicates if the receiver bank account is closed + * Indicates if the account that will be debited is closed * @type {boolean} * @memberof SignalEvaluateCoreAttributes */ is_account_closed?: boolean | null; /** - * Indicates if the receiver bank account is either frozen or restricted + * Indicates if the account that will be debited is either frozen or restricted * @type {boolean} * @memberof SignalEvaluateCoreAttributes */ @@ -51254,7 +51908,7 @@ export interface SignalEvaluateRequest { */ account_id: string; /** - * The unique ID that you would like to use to refer to this evaluation attempt - for example, a payment attempt ID. You will use this later to debug this evaluation, and/or report an ACH return, etc. The max length for this field is 36 characters. + * The unique ID that you would like to use to refer to this evaluation attempt - for example, a payment attempt ID. You will use this later to debug this evaluation, and/or report an ACH return, etc. The max length for this field is 36 characters. The `client_transaction_id` also functions as an idempotency key; calling `/signal/evaluate` with a previously used `client_transaction_id` will return the results of the previous evaluation rather than triggering a fresh evaluation. * @type {string} * @memberof SignalEvaluateRequest */ @@ -51467,7 +52121,7 @@ export interface SignalReturnReportRequest { */ secret?: string; /** - * Must be the same as the `client_transaction_id` supplied when calling `/signal/evaluate` or `/accounts/balance/get`. + * Must be the same as the `client_transaction_id` supplied when calling `/signal/evaluate`. * @type {string} * @memberof SignalReturnReportRequest */ @@ -51800,7 +52454,7 @@ export interface SingleDocumentRiskSignal { risk_summary: DocumentRiskSummary; } /** - * A type indicating whether a dashboard user, an API-based user, or Plaid last touched this object. + * A type indicating who or what last touched this object. `dashboard`, `link`, and `api` indicate the originating surface; `system` indicates Plaid. `retro` indicates a screening created retroactively via a bulk screening creation. * @export * @enum {string} */ @@ -51808,7 +52462,8 @@ export enum Source { Dashboard = 'dashboard', Link = 'link', Api = 'api', - System = 'system' + System = 'system', + Retro = 'retro' } /** @@ -52059,7 +52714,7 @@ export interface StatementsListResponse { request_id: string; } /** - * The result of the statement refresh extraction `SUCCESS`: The statements were successfully extracted and can be listed via `/statements/list/` and downloaded via `/statements/download/`. `FAILURE`: The statements failed to be extracted. + * The result of the statement refresh extraction `SUCCESS`: The statements were successfully extracted and can be listed via `/statements/list` and downloaded via `/statements/download`. `FAILURE`: The statements failed to be extracted. * @export * @enum {string} */ @@ -52219,7 +52874,7 @@ export interface Statuses { STATUS: Status; } /** - * An instruction specifying what steps the new Identity Verification attempt should require the user to complete: `reset` - Restart the user at the beginning of the session, regardless of whether they successfully completed part of their previous session. `incomplete` - Start the new session at the step that the user failed in the previous session, skipping steps that have already been successfully completed. `infer` - If the most recent Identity Verification attempt associated with the given `client_user_id` has a status of `failed` or `expired`, retry using the `incomplete` strategy. Otherwise, use the `reset` strategy. `custom` - Start the new session with a custom configuration, specified by the value of the `steps` field Note: The `incomplete` strategy cannot be applied if the session\'s failing step is `screening` or `risk_check`. The `infer` strategy cannot be applied if the session\'s status is still `active` + * An instruction specifying what steps the new Identity Verification attempt should require the user to complete: `reset` - Restart the user at the beginning of the session, regardless of whether they successfully completed part of their previous session. `incomplete` - Start the new session at the step that the user failed in the previous session, skipping steps that have already been successfully completed. `infer` - If the most recent Identity Verification attempt associated with the given `client_user_id` has a status of `failed` or `expired`, retry using the `incomplete` strategy. Otherwise, use the `reset` strategy. `custom` - Start the new session with a custom configuration, specified by the value of the `steps` field Note: The `incomplete` strategy cannot be applied if the session\'s failing step is `watchlist_screening` or `risk_check`. The `infer` strategy cannot be applied if the session\'s status is still `active` * @export * @enum {string} */ @@ -52345,7 +53000,7 @@ export interface StudentLoan { */ outstanding_interest_amount: number | null; /** - * The relevant account number that should be used to reference this loan for payments. In the majority of cases, `payment_reference_number` will match `account_number,` but in some institutions, such as Great Lakes (`ins_116861`), it will be different. + * The relevant account number that should be used to reference this loan for payments. In the majority of cases, `payment_reference_number` will match `account_number`, but in some institutions, such as Great Lakes (`ins_116861`), it will be different. * @type {string} * @memberof StudentLoan */ @@ -52490,7 +53145,7 @@ export enum StudentRepaymentPlanTypeEnum { IncomeContingentRepayment = 'income-contingent repayment', IncomeBasedRepayment = 'income-based repayment', IncomeSensitiveRepayment = 'income-sensitive repayment', - InterestOnly = 'interest-only', + InterestOnly = 'interest only', Other = 'other', PayAsYouEarn = 'pay as you earn', RevisedPayAsYouEarn = 'revised pay as you earn', @@ -52879,7 +53534,7 @@ export interface TotalMonthlyIncomeInsights { current_amount: number; } /** - * Total amount of credit transactions into the account in the time period of the report. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the time period of the report. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount */ @@ -52904,7 +53559,7 @@ export interface TotalOutflowAmount { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the account in the last 30 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the last 30 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount30d */ @@ -52929,7 +53584,7 @@ export interface TotalOutflowAmount30d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the account in the last 60 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the last 60 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount60d */ @@ -52954,7 +53609,7 @@ export interface TotalOutflowAmount60d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the account in the last 90 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the last 90 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount90d */ @@ -53079,7 +53734,7 @@ export interface TotalReportInflowAmount90d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the time period of the report. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the time period of the report. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount */ @@ -53104,7 +53759,7 @@ export interface TotalReportOutflowAmount { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the last 30 days. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the last 30 days. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount30d */ @@ -53129,7 +53784,7 @@ export interface TotalReportOutflowAmount30d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the last 60 days. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the last 60 days. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount60d */ @@ -53154,7 +53809,7 @@ export interface TotalReportOutflowAmount60d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the last 90 days. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the last 90 days. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount90d */ @@ -53191,7 +53846,7 @@ export interface Transaction { */ account_id: string; /** - * The settled value of the transaction, denominated in the transactions\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. + * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. * @type {number} * @memberof Transaction */ @@ -53203,20 +53858,20 @@ export interface Transaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof Transaction */ unofficial_currency_code: string | null; /** - * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {Array} * @memberof Transaction * @deprecated */ category?: Array | null; /** - * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof Transaction * @deprecated @@ -53241,7 +53896,7 @@ export interface Transaction { */ location: Location; /** - * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof Transaction * @deprecated @@ -53297,7 +53952,7 @@ export interface Transaction { */ transaction_type?: TransactionTransactionTypeEnum; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Transaction */ @@ -53351,7 +54006,7 @@ export interface Transaction { */ transaction_code: TransactionCode | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof Transaction */ @@ -53445,7 +54100,7 @@ export interface TransactionAllOf { */ transaction_code: TransactionCode | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof TransactionAllOf */ @@ -53493,7 +54148,7 @@ export interface TransactionBase { */ account_id: string; /** - * The settled value of the transaction, denominated in the transactions\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. + * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. * @type {number} * @memberof TransactionBase */ @@ -53505,20 +54160,20 @@ export interface TransactionBase { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof TransactionBase */ unofficial_currency_code: string | null; /** - * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {Array} * @memberof TransactionBase * @deprecated */ category?: Array | null; /** - * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof TransactionBase * @deprecated @@ -53543,7 +54198,7 @@ export interface TransactionBase { */ location?: Location; /** - * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof TransactionBase * @deprecated @@ -53599,7 +54254,7 @@ export interface TransactionBase { */ transaction_type?: TransactionBaseTransactionTypeEnum; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof TransactionBase */ @@ -53624,7 +54279,7 @@ export enum TransactionBaseTransactionTypeEnum { } /** - * An identifier classifying the transaction type. This field is populated for European institutions, as well as certain institutions in the United States. For institutions where this classification is not available, this field is set to `null`. `adjustment:` Bank adjustment `atm:` Cash deposit or withdrawal via an automated teller machine `bank charge:` Charge or fee levied by the institution `bill payment`: Payment of a bill `cash:` Cash deposit or withdrawal `cashback:` Cash withdrawal while making a debit card purchase `cheque:` Document ordering the payment of money to another person or organization `direct debit:` Automatic withdrawal of funds initiated by a third party at a regular interval `interest:` Interest earned or incurred `payment:` One-off outbound payment not classified as a bill payment, direct debit, or standing order `purchase:` Purchase made with a debit or credit card `refund:` Merchant credit or return, such as a refund of a prior purchase `standing order:` Payment instructed by the account holder to a third party at a regular interval `transfer:` Transfer of money between accounts + * An identifier classifying the transaction type. This field is populated for European institutions, as well as certain institutions in the United States. For institutions where this classification is not available, this field is set to `null`. `adjustment:` Bank adjustment `atm:` Cash deposit or withdrawal via an automated teller machine `bank charge:` Charge or fee levied by the institution `bill payment`: Payment of a bill `cash:` Cash deposit or withdrawal `cash advance:` Cash advance drawn against a credit card or line of credit `cashback:` Cash withdrawal while making a debit card purchase `cheque:` Document ordering the payment of money to another person or organization `direct debit:` Automatic withdrawal of funds initiated by a third party at a regular interval `interest:` Interest earned or incurred `late fee:` Fee associated with a late or past-due payment `membership fee:` Annual or recurring membership fee `payment:` One-off outbound payment not classified as a bill payment, direct debit, or standing order `purchase:` Purchase made with a debit or credit card `refund:` Merchant credit or return, such as a refund of a prior purchase `returned item fee:` Fee for a returned item, such as a returned check or stop payment `standing order:` Payment instructed by the account holder to a third party at a regular interval `transfer:` Transfer of money between accounts * @export * @enum {string} */ @@ -53634,13 +54289,17 @@ export enum TransactionCode { BankCharge = 'bank charge', BillPayment = 'bill payment', Cash = 'cash', + CashAdvance = 'cash advance', Cashback = 'cashback', Cheque = 'cheque', DirectDebit = 'direct debit', Interest = 'interest', + LateFee = 'late fee', + MembershipFee = 'membership fee', Payment = 'payment', Purchase = 'purchase', Refund = 'refund', + ReturnedItemFee = 'returned item fee', StandingOrder = 'standing order', Transfer = 'transfer', Null = 'null' @@ -53677,7 +54336,7 @@ export interface TransactionCounterparty { */ website: string | null; /** - * The URL of a logo associated with the counterparty, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with the counterparty, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof TransactionCounterparty */ @@ -54251,7 +54910,7 @@ export interface TransactionsRecurringCreateInput { transaction_ids?: Array; } /** - * TransactionsRecurringCreateRequest defined the request schema for `/transactions/recurring/streams/create` endpoint. + * TransactionsRecurringCreateRequest defines the request schema for `/transactions/recurring/streams/create` endpoint. * @export * @interface TransactionsRecurringCreateRequest */ @@ -54370,7 +55029,7 @@ export interface TransactionsRecurringGetRequestOptions { */ export interface TransactionsRecurringGetResponse { /** - * An array of depository transaction streams. + * An array of inflow transaction streams. * @type {Array} * @memberof TransactionsRecurringGetResponse */ @@ -54414,7 +55073,7 @@ export interface TransactionsRecurringMergeInput { stream_ids: Array; } /** - * TransactionsRecurringMergeRequest defined the request schema for `/transactions/recurring/streams/merge` endpoint. + * TransactionsRecurringMergeRequest defines the request schema for `/transactions/recurring/streams/merge` endpoint. * @export * @interface TransactionsRecurringMergeRequest */ @@ -54470,20 +55129,20 @@ export interface TransactionsRecurringMergeResponse { */ export interface TransactionsRecurringUpdateInput { /** - * ID of the stream that all the transactions will be added in to. + * ID of the stream that all the transactions will be added into. * @type {string} * @memberof TransactionsRecurringUpdateInput */ stream_id: string; /** - * IDs of all the transactions that will be added into the stream. If any transaction currently exist in another stream, it will be removed from the other stream. + * IDs of all the transactions that will be added into the stream. If any transaction currently exists in another stream, it will be removed from the other stream. * @type {Array} * @memberof TransactionsRecurringUpdateInput */ transaction_ids: Array; } /** - * TransactionsRecurringUpdateRequest defined the request schema for `/transactions/recurring/streams/update` endpoint. + * TransactionsRecurringUpdateRequest defines the request schema for `/transactions/recurring/streams/update` endpoint. * @export * @interface TransactionsRecurringUpdateRequest */ @@ -54632,7 +55291,7 @@ export interface TransactionsRuleDetails { */ type: TransactionsRuleType; /** - * For `TRANSACTION_ID` field, provide `transaction_id`. For `NAME` field, provide a string pattern. + * For `TRANSACTION_ID` field, provide `transaction_id`. For `MERCHANT_NAME` field, provide a string pattern. * @type {string} * @memberof TransactionsRuleDetails */ @@ -54659,7 +55318,7 @@ export enum TransactionsRuleType { } /** - * TransactionsRulesCreateRequest defines the request schema for `beta/transactions/rules/v1/create` + * TransactionsRulesCreateRequest defines the request schema for `/beta/transactions/rules/v1/create` * @export * @interface TransactionsRulesCreateRequest */ @@ -55173,7 +55832,7 @@ export interface Transfer { */ standard_return_window: string | null; /** - * The date 61 business days from settlement date indicating the following ACH returns can no longer happen: R05, R07, R10, R11, R51, R33, R37, R38, R51, R52, R53. This will be of the form YYYY-MM-DD. + * The date 61 business days from settlement date indicating the following ACH returns can no longer happen: R05, R07, R10, R11, R51, R33, R37, R38, R52, R53. This will be of the form YYYY-MM-DD. * @type {string} * @memberof Transfer */ @@ -55384,7 +56043,7 @@ export interface TransferAuthorizationCreateRequest { */ funding_account_id?: string | null; /** - * Specify which ledger balance should be used to fund the transfer. You can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance should be used to fund the transfer. You can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferAuthorizationCreateRequest */ @@ -55463,7 +56122,7 @@ export interface TransferAuthorizationCreateRequest { */ user_present?: boolean | null; /** - * If set to `false`, Plaid will not offer a `guarantee_decision` for this request (Guarantee customers only). This field is deprecated in favor for `guarantee`. + * If set to `false`, Plaid will not offer a `guarantee_decision` for this request (Guarantee customers only). This field is deprecated in favor of `guarantee`. * @type {boolean} * @memberof TransferAuthorizationCreateRequest * @deprecated @@ -55479,6 +56138,7 @@ export interface TransferAuthorizationCreateRequest { * The unique identifier returned by Plaid\'s [beacon](https://plaid.com/docs/transfer/guarantee/#using-a-beacon) when it is run on your webpage. * @type {string} * @memberof TransferAuthorizationCreateRequest + * @deprecated */ beacon_session_id?: string | null; /** @@ -55654,7 +56314,7 @@ export interface TransferAuthorizationPaymentRisk { */ bank_initiated_return_score: number | null; /** - * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. The score evaluates the transaction return risk of an unauthorized debit and covers return codes: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, the customer of financial institutions can dispute a transaction as unauthorized. + * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. The score evaluates the transaction return risk of an unauthorized debit and covers return codes: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, customers of financial institutions can dispute a transaction as unauthorized. * @type {number} * @memberof TransferAuthorizationPaymentRisk */ @@ -55822,7 +56482,7 @@ export interface TransferBalance { */ available: string; /** - * The available balance, plus amount of pending funds that in processing (decimal string with two digits of precision e.g. \"10.00\"). + * The available balance, plus the amount of pending funds that are in processing (decimal string with two digits of precision e.g. \"10.00\"). * @type {string} * @memberof TransferBalance */ @@ -56564,6 +57224,12 @@ export interface TransferEvent { * @memberof TransferEvent */ sweep_amount: string | null; + /** + * A signed amount associated with this event (decimal string with two digits of precision e.g. \"10.00\" or \"-10.00\"). + * @type {string} + * @memberof TransferEvent + */ + event_amount?: string | null; /** * Plaid\'s unique identifier for a refund. A non-null value indicates the event is for the associated refund of the transfer. * @type {string} @@ -56774,7 +57440,7 @@ export interface TransferEventSyncResponse { request_id: string; } /** - * The type of event that this transfer represents. Event types with prefix `sweep` represents events for Plaid Ledger sweeps. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer has been successfully completed by the payment network. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `returned`: A posted transfer was returned. `swept`: The transfer was swept to / from the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer\'s business checking account. `return_swept`: Due to the transfer being returned, funds were pulled from or pushed back to the sweep account. `sweep.pending`: A new ledger sweep was created; it is in the pending state. `sweep.posted`: The ledger sweep has been successfully submitted to the payment network. `sweep.settled`: The transaction has settled in the funding account. This means that funds withdrawn from Plaid Ledger balance have reached the funding account, or funds to be deposited into the Plaid Ledger Balance have been pulled, and the hold period has begun. `sweep.returned`: A posted ledger sweep was returned. `sweep.failed`: The ledger sweep failed, no funds were moved. `sweep.funds_available`: Funds from the ledger sweep have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `refund.pending`: A new refund was created; it is in the pending state. `refund.cancelled`: The refund was cancelled. `refund.failed`: The refund failed, no funds were moved. `refund.posted`: The refund has been successfully submitted to the payment network. `refund.settled`: The refund transaction has settled in the Plaid linked account. `refund.returned`: A posted refund was returned. `refund.swept`: The refund was swept from the sweep account. `refund.return_swept`: Due to the refund being returned, funds were pushed back to the sweep account. + * The type of event that this transfer represents. Event types with prefix `sweep` represent events for Plaid Ledger sweeps. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer has been successfully completed by the payment network. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `guaranteed`: The transfer has been fully guaranteed by Plaid. `returned`: A posted transfer was returned. `guarantee_reimbursed`: Plaid reimbursed the client for the loss on a returned guaranteed transfer. The `event_amount` is the reimbursed amount. `client_return_recovered`: The client reported recovering the loss on a returned transfer via `/transfer/return/recover`, and Plaid debited the recovered amount from the client\'s ledger. The `event_amount` is the recovered amount. `plaid_return_recovered`: Plaid recovered the loss on a returned transfer by successfully reinitiating it. The `event_amount` is the recovered amount. Client should stop their return recovery effort. `swept`: The transfer was swept to / from the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer\'s business checking account. `return_swept`: Due to the transfer being returned, funds were pulled from or pushed back to the sweep account. `sweep.pending`: A new ledger sweep was created; it is in the pending state. `sweep.posted`: The ledger sweep has been successfully submitted to the payment network. `sweep.settled`: The transaction has settled in the funding account. This means that funds withdrawn from Plaid Ledger balance have reached the funding account, or funds to be deposited into the Plaid Ledger Balance have been pulled, and the hold period has begun. `sweep.returned`: A posted ledger sweep was returned. `sweep.failed`: The ledger sweep failed, no funds were moved. `sweep.funds_available`: Funds from the ledger sweep have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `refund.pending`: A new refund was created; it is in the pending state. `refund.cancelled`: The refund was cancelled. `refund.failed`: The refund failed, no funds were moved. `refund.posted`: The refund has been successfully submitted to the payment network. `refund.settled`: The refund transaction has settled in the Plaid linked account. `refund.returned`: A posted refund was returned. `refund.swept`: The refund was swept from the sweep account. `refund.return_swept`: Due to the refund being returned, funds were pushed back to the sweep account. * @export * @enum {string} */ @@ -56785,7 +57451,11 @@ export enum TransferEventType { Posted = 'posted', Settled = 'settled', FundsAvailable = 'funds_available', + Guaranteed = 'guaranteed', Returned = 'returned', + GuaranteeReimbursed = 'guarantee_reimbursed', + ClientReturnRecovered = 'client_return_recovered', + PlaidReturnRecovered = 'plaid_return_recovered', Swept = 'swept', SweptSettled = 'swept_settled', ReturnSwept = 'return_swept', @@ -57142,7 +57812,7 @@ export interface TransferIntentCreate { */ user: TransferUserInResponse; /** - * A description for the underlying transfer. Maximum of 8 characters. + * A description for the underlying transfer. Maximum of 15 characters. * @type {string} * @memberof TransferIntentCreate */ @@ -57396,7 +58066,7 @@ export interface TransferIntentGet { */ user: TransferUserInResponse; /** - * A description for the underlying transfer. Maximum of 8 characters. + * A description for the underlying transfer. Maximum of 15 characters. * @type {string} * @memberof TransferIntentGet */ @@ -57552,7 +58222,7 @@ export interface TransferLedgerDepositRequest { */ secret?: string; /** - * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to payout or collect funds. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. + * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to pay out to or collect funds from. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. * @type {string} * @memberof TransferLedgerDepositRequest */ @@ -57564,7 +58234,7 @@ export interface TransferLedgerDepositRequest { */ funding_account_id?: string | null; /** - * Specify which ledger balance to deposit to. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to deposit to. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferLedgerDepositRequest */ @@ -57865,7 +58535,7 @@ export interface TransferLedgerGetRequest { */ secret?: string; /** - * Specify which ledger balance to get. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to get. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferLedgerGetRequest */ @@ -57945,7 +58615,7 @@ export interface TransferLedgerWithdrawRequest { */ secret?: string; /** - * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to payout or collect funds. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. + * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to pay out to or collect funds from. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. * @type {string} * @memberof TransferLedgerWithdrawRequest */ @@ -57957,7 +58627,7 @@ export interface TransferLedgerWithdrawRequest { */ funding_account_id?: string | null; /** - * Specify which ledger balance to withdraw from. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to withdraw from. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferLedgerWithdrawRequest */ @@ -58312,7 +58982,7 @@ export interface TransferMigrateAccountResponse { request_id: string; } /** - * The network or rails used for the transfer. For transfers submitted as `ach` or `same-day-ach`, the Standard ACH cutoff is 8:30 PM Eastern Time. For transfers submitted as `same-day-ach`, the Same Day ACH cutoff is 3:00 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail. For transfers submitted as `rtp`, Plaid will automatically route between the Real-Time Payments (RTP) rail by TCH or FedNow rails as necessary. If a transfer is submitted as `rtp` and the counterparty account is not eligible for RTP, the `/transfer/authorization/create` request will fail with an `INVALID_FIELD` error code. To pre-check to determine whether a counterparty account can support RTP, call `/transfer/capabilities/get` before calling `/transfer/authorization/create`. Wire transfers are currently in early availability. To request access to `wire` as a payment network, contact your account manager. For transfers submitted as `wire`, the `type` must be `credit`; wire debits are not supported. The cutoff to submit a wire payment is 6:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail. + * The network or rails used for the transfer. For transfers submitted as `ach` or `same-day-ach`, the Standard ACH cutoff is 8:30 PM Eastern Time. For transfers submitted as `same-day-ach`, the Same Day ACH cutoff is 3:00 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail. For transfers submitted as `rtp`, Plaid will automatically route between the Real-Time Payments (RTP) rail by TCH or FedNow rails as necessary. If a transfer is submitted as `rtp` and the counterparty account is not eligible for RTP, the `/transfer/authorization/create` request will fail with an `INVALID_FIELD` error code. To pre-check to determine whether a counterparty account can support RTP, call `/transfer/capabilities/get` before calling `/transfer/authorization/create`. Wire transfers are currently in early availability. To request access to `wire` as a payment network, contact your account manager. For transfers submitted as `wire`, the `type` must be `credit`; wire debits are not supported. The cutoff to submit a wire payment is 6:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail. Support for `rfp` (request for payment) is currently in closed beta. To learn more, contact your Plaid account manager. For transfers submitted as `rfp`, the `type` must be `debit`. * @export * @enum {string} */ @@ -58320,7 +58990,8 @@ export enum TransferNetwork { Ach = 'ach', SameDayAch = 'same-day-ach', Rtp = 'rtp', - Wire = 'wire' + Wire = 'wire', + Rfp = 'rfp' } /** @@ -59145,7 +59816,7 @@ export interface TransferRecurringCreateRequest { */ access_token: string; /** - * A random key provided by the client, per unique recurring transfer. Maximum of 50 characters. The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to create a recurring fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single recurring transfer is created. + * A random key provided by the client, per unique recurring transfer. Maximum of 50 characters. The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to create a recurring transfer fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single recurring transfer is created. * @type {string} * @memberof TransferRecurringCreateRequest */ @@ -59583,7 +60254,7 @@ export interface TransferRefundCreateResponse { request_id: string; } /** - * The failure reason if the event type for a refund is `\"failed\"` or `\"returned\"`. Null value otherwise. + * The failure reason if the status for a refund is `\"failed\"` or `\"returned\"`. Null value otherwise. * @export * @interface TransferRefundFailure */ @@ -59846,6 +60517,56 @@ export interface TransferRepaymentReturnListResponse { */ request_id: string; } +/** + * Defines the request schema for `/transfer/return/recover` + * @export + * @interface TransferReturnRecoverRequest + */ +export interface TransferReturnRecoverRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + secret?: string; + /** + * The ID of the returned transfer that was recovered. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + transfer_id: string; + /** + * The amount being recovered (decimal string with two digits of precision e.g. \"10.00\"). The sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + amount: string; + /** + * A random key provided by the client, per unique recovery. Maximum of 50 characters. The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to report a recovery fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single recovery is recorded. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + idempotency_key: string; +} +/** + * Defines the response schema for `/transfer/return/recover` + * @export + * @interface TransferReturnRecoverResponse + */ +export interface TransferReturnRecoverResponse { + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof TransferReturnRecoverResponse + */ + request_id: string; +} /** * The unit of the recurring interval. * @export @@ -61104,7 +61825,7 @@ export interface UserDataOverview { total_inflows: number; } /** - * UserFinancialDataRefreshRequest defines the request schema for `user/financial_data/refresh` + * UserFinancialDataRefreshRequest defines the request schema for `/user/financial_data/refresh` * @export * @interface UserFinancialDataRefreshRequest */ @@ -61129,7 +61850,7 @@ export interface UserFinancialDataRefreshRequest { secret?: string; } /** - * UserFinancialDataRefreshResponse defines the response schema for `user/financial_data/refresh` + * UserFinancialDataRefreshResponse defines the response schema for `/user/financial_data/refresh` * @export * @interface UserFinancialDataRefreshResponse */ @@ -61465,13 +62186,6 @@ export interface UserPermissionRevokedWebhook { */ environment: WebhookEnvironmentValues; } -/** - * The reason for terminating user-based products. - * @export - * @interface UserProductsTerminateReasonCode - */ -export interface UserProductsTerminateReasonCode { -} /** * UserProductsTerminateRequest defines the request schema for `/user/products/terminate` * @export @@ -61498,10 +62212,10 @@ export interface UserProductsTerminateRequest { user_id: string; /** * - * @type {UserProductsTerminateReasonCode} + * @type {ProductsTerminateReasonCode} * @memberof UserProductsTerminateRequest */ - reason_code: UserProductsTerminateReasonCode; + reason_code: ProductsTerminateReasonCode; /** * Additional context or details about the reason for terminating user-based products. Personally identifiable information, such as an email address or phone number, should not be included in the `reason_note`. * @type {string} @@ -61672,7 +62386,7 @@ export interface UserThirdPartyTokenCreateResponse { third_party_user_token: string; } /** - * UserThirdPartyTokenCreateRequest defines the request schema for `/user/third_party_token/remove` + * UserThirdPartyTokenRemoveRequest defines the request schema for `/user/third_party_token/remove` * @export * @interface UserThirdPartyTokenRemoveRequest */ @@ -61697,7 +62411,7 @@ export interface UserThirdPartyTokenRemoveRequest { third_party_user_token: string; } /** - * UserThirdPartyTokenCreateResponse defines the response schema for `/user/third_party_token/remove` + * UserThirdPartyTokenRemoveResponse defines the response schema for `/user/third_party_token/remove` * @export * @interface UserThirdPartyTokenRemoveResponse */ @@ -61716,7 +62430,7 @@ export interface UserThirdPartyTokenRemoveResponse { request_id: string; } /** - * UserTransactionsRefreshRequest defines the request schema for `user/transactions/refresh` + * UserTransactionsRefreshRequest defines the request schema for `/user/transactions/refresh` * @export * @interface UserTransactionsRefreshRequest */ @@ -61741,7 +62455,7 @@ export interface UserTransactionsRefreshRequest { secret?: string; } /** - * UserTransactionsRefreshResponse defines the response schema for `user/transactions/refresh` + * UserTransactionsRefreshResponse defines the response schema for `/user/transactions/refresh` * @export * @interface UserTransactionsRefreshResponse */ @@ -62012,7 +62726,7 @@ export interface W2 { */ tax_year?: string | null; /** - * An employee identification number or EIN. + * An employer identification number or EIN. * @type {string} * @memberof W2 */ @@ -62714,7 +63428,7 @@ export interface WalletTransaction { */ transaction_id: string; /** - * The EMI (E-Money Institution) wallet that this payment is associated with, if any. This wallet is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. + * The ID of the e-wallet that this transaction is associated with. * @type {string} * @memberof WalletTransaction */ @@ -62762,7 +63476,7 @@ export interface WalletTransaction { */ created_at: string; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof WalletTransaction */ @@ -63049,7 +63763,7 @@ export interface WalletTransactionGetResponse { */ transaction_id: string; /** - * The EMI (E-Money Institution) wallet that this payment is associated with, if any. This wallet is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. + * The ID of the e-wallet that this transaction is associated with. * @type {string} * @memberof WalletTransactionGetResponse */ @@ -63097,7 +63811,7 @@ export interface WalletTransactionGetResponse { */ created_at: string; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof WalletTransactionGetResponse */ @@ -63257,7 +63971,7 @@ export enum WalletTransactionPayeeVerificationStatus { } /** - * Transactions are related when they have a logical connection. For example, a `PAYOUT` transaction can be returned by the sender, creating a `RETURN` transaction. Each `PAYOUT` transaction can have at most one corresponding `RETURN` transaction in case of reversal. These relationships are bi-directional, meaning that both entities have references to each other. For instance, when a transaction of type RETURN occurs, it is linked to the original transaction being returned. Likewise, the original transaction has a reference back to the RETURN transaction that represents the return. This field is only populated for transactions of type `RETURN`, `FUNDS_SWEEP`, `REFUND` and `PAYOUT`. The relationship between a `PIS_PAY_IN` payment and its corresponding `REFUND` transactions is only available through `refund_ids` property in the payment object. See[`/payment_initiation/payment/get`](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-get-response-refund-ids). + * Transactions are related when they have a logical connection. For example, a `PAYOUT` transaction can be returned by the sender, creating a `RETURN` transaction. Each `PAYOUT` transaction can have at most one corresponding `RETURN` transaction in case of reversal. These relationships are bi-directional, meaning that both entities have references to each other. For instance, when a transaction of type RETURN occurs, it is linked to the original transaction being returned. Likewise, the original transaction has a reference back to the RETURN transaction that represents the return. This field is only populated for transactions of type `RETURN`, `FUNDS_SWEEP`, `REFUND` and `PAYOUT`. The relationship between a `PIS_PAY_IN` payment and its corresponding `REFUND` transactions is only available through the `refund_ids` property in the payment object. See [`/payment_initiation/payment/get`](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-get-response-refund-ids). * @export * @interface WalletTransactionRelation */ @@ -63430,7 +64144,7 @@ export interface Warning { */ warning_type: string; /** - * The warning code identifies a specific kind of warning. `OWNERS_UNAVAILABLE` indicates that account-owner information is not available.`INVESTMENTS_UNAVAILABLE` indicates that Investments specific information is not available. `TRANSACTIONS_UNAVAILABLE` indicates that transactions information associated with Credit and Depository accounts are unavailable. + * The warning code identifies a specific kind of warning. `OWNERS_UNAVAILABLE` indicates that account-owner information is not available. `INVESTMENTS_UNAVAILABLE` indicates that Investments specific information is not available. `TRANSACTIONS_UNAVAILABLE` indicates that transactions information associated with Credit and Depository accounts are unavailable. The `BANK_INCOME_INSIGHTS_*` codes apply to the Bank Income add-on: `BANK_INCOME_INSIGHTS_INSUFFICIENT_DATA` indicates there was not enough data to compute Bank Income Insights; `BANK_INCOME_INSIGHTS_INCOMPLETE` indicates the Bank Income Insights flow was not completed; `BANK_INCOME_INSIGHTS_STATUS_IN_PROGRESS` indicates Bank Income Insights are still being computed; `BANK_INCOME_INSIGHTS_INTERNAL_ERROR` indicates an internal error occurred while computing Bank Income Insights; `BANK_INCOME_INSIGHTS_MISMATCHED_DAYS_REQUESTED` indicates the days requested for Bank Income Insights did not match that of the Asset Report. * @type {string} * @memberof Warning */ @@ -63450,7 +64164,12 @@ export interface Warning { export enum WarningWarningCodeEnum { OwnersUnavailable = 'OWNERS_UNAVAILABLE', InvestmentsUnavailable = 'INVESTMENTS_UNAVAILABLE', - TransactionsUnavailable = 'TRANSACTIONS_UNAVAILABLE' + TransactionsUnavailable = 'TRANSACTIONS_UNAVAILABLE', + BankIncomeInsightsInsufficientData = 'BANK_INCOME_INSIGHTS_INSUFFICIENT_DATA', + BankIncomeInsightsIncomplete = 'BANK_INCOME_INSIGHTS_INCOMPLETE', + BankIncomeInsightsStatusInProgress = 'BANK_INCOME_INSIGHTS_STATUS_IN_PROGRESS', + BankIncomeInsightsInternalError = 'BANK_INCOME_INSIGHTS_INTERNAL_ERROR', + BankIncomeInsightsMismatchedDaysRequested = 'BANK_INCOME_INSIGHTS_MISMATCHED_DAYS_REQUESTED' } /** @@ -63519,7 +64238,7 @@ export enum WatchlistScreeningDocumentType { } /** - * Request input for creating an entity screening review + * Request input for creating an entity watchlist screening * @export * @interface WatchlistScreeningEntityCreateRequest */ @@ -64323,7 +65042,7 @@ export interface WatchlistScreeningHit { data?: ScreeningHitData; } /** - * Location information for the associated individual watchlist hit + * Location information for the associated watchlist hit * @export * @interface WatchlistScreeningHitLocations */ @@ -65435,7 +66154,7 @@ export interface YieldRate { type: YieldRateType | null; } /** - * The type of rate which indicates how the predicted yield was calculated. It is one of: `coupon`: the annualized interest rate for securities with a one-year term or longer, such as treasury notes and bonds. `coupon_equivalent`: the calculated equivalent for the annualized interest rate factoring in the discount rate and time to maturity, for shorter term, non-interest-bearing securities such as treasury bills. `discount`: the rate at which the present value or cost is discounted from the future value upon maturity, also known as the face value. `yield`: the total predicted rate of return factoring in both the discount rate and the coupon rate, applicable to securities such as exchange-traded bonds which can both be interest-bearing as well as sold at a discount off its face value. + * The type of rate which indicates how the predicted yield was calculated. It is one of: `coupon`: the annualized interest rate for securities with a one-year term or longer, such as treasury notes and bonds. `coupon_equivalent`: the calculated equivalent for the annualized interest rate factoring in the discount rate and time to maturity, for shorter term, non-interest-bearing securities such as treasury bills. `discount`: the rate at which the present value or cost is discounted from the future value upon maturity, also known as the face value. `yield`: the total predicted rate of return factoring in both the discount rate and the coupon rate, applicable to securities such as exchange-traded bonds which can both be interest-bearing as well as sold at a discount off their face value. * @export * @enum {string} */ @@ -65860,7 +66579,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -66131,7 +66850,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66176,7 +66895,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66221,7 +66940,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66356,7 +67075,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66401,7 +67120,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66446,7 +67165,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66491,7 +67210,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66536,7 +67255,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66581,7 +67300,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66626,7 +67345,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66671,7 +67390,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66716,7 +67435,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66761,7 +67480,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66806,7 +67525,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66851,7 +67570,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66896,7 +67615,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66940,8 +67659,8 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66986,7 +67705,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67031,7 +67750,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67076,7 +67795,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67120,8 +67839,8 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67480,7 +68199,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -67615,7 +68334,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -67810,6 +68529,10 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration // authentication clientId required await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + // authentication oauth2 required + // oauth required + await setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration) + // authentication plaidVersion required await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) @@ -67831,7 +68554,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -67855,6 +68578,10 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration // authentication clientId required await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + // authentication oauth2 required + // oauth required + await setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration) + // authentication plaidVersion required await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) @@ -67921,8 +68648,8 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67945,6 +68672,10 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration // authentication clientId required await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + // authentication oauth2 required + // oauth required + await setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration) + // authentication plaidVersion required await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) @@ -67966,7 +68697,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -67990,6 +68721,10 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration // authentication clientId required await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + // authentication oauth2 required + // oauth required + await setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration) + // authentication plaidVersion required await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) @@ -68011,7 +68746,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -68035,6 +68770,10 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration // authentication clientId required await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + // authentication oauth2 required + // oauth required + await setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration) + // authentication plaidVersion required await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) @@ -68056,7 +68795,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -68641,7 +69380,52 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet: async (craReportGetRequest: CraReportGetRequest, options: any = {}): Promise => { + // verify required parameter 'craReportGetRequest' is not null or undefined + assertParamExists('craReportGet', 'craReportGetRequest', craReportGetRequest) + const localVarPath = `/cra/report/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(craReportGetRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -69496,8 +70280,8 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -69713,7 +70497,97 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(creditSessionsGetRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(creditSessionsGetRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * The `/dashboard_user/get` endpoint provides details (such as email address) about a specific Dashboard user based on the `dashboard_user_id` field, which is returned in the `audit_trail` object of certain Monitor and Beacon endpoints. This can be used to identify the specific reviewer who performed a Dashboard action. + * @summary Retrieve a Dashboard user + * @param {DashboardUserGetRequest} dashboardUserGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + dashboardUserGet: async (dashboardUserGetRequest: DashboardUserGetRequest, options: any = {}): Promise => { + // verify required parameter 'dashboardUserGetRequest' is not null or undefined + assertParamExists('dashboardUserGet', 'dashboardUserGetRequest', dashboardUserGetRequest) + const localVarPath = `/dashboard_user/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(dashboardUserGetRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * The `/dashboard_user/list` endpoint provides details (such as email address) about all Dashboard users associated with your account. This can be used to audit or track the list of reviewers for Monitor, Beacon, and Identity Verification products. + * @summary List Dashboard users + * @param {DashboardUserListRequest} dashboardUserListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + dashboardUserList: async (dashboardUserListRequest: DashboardUserListRequest, options: any = {}): Promise => { + // verify required parameter 'dashboardUserListRequest' is not null or undefined + assertParamExists('dashboardUserList', 'dashboardUserListRequest', dashboardUserListRequest) + const localVarPath = `/dashboard_user/list`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(dashboardUserListRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -69721,16 +70595,16 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/dashboard_user/get` endpoint provides details (such as email address) about a specific Dashboard user based on the `dashboard_user_id` field, which is returned in the `audit_trail` object of certain Monitor and Beacon endpoints. This can be used to identify the specific reviewer who performed a Dashboard action. - * @summary Retrieve a Dashboard user - * @param {DashboardUserGetRequest} dashboardUserGetRequest + * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. + * @summary (Deprecated) Search employer database + * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - dashboardUserGet: async (dashboardUserGetRequest: DashboardUserGetRequest, options: any = {}): Promise => { - // verify required parameter 'dashboardUserGetRequest' is not null or undefined - assertParamExists('dashboardUserGet', 'dashboardUserGetRequest', dashboardUserGetRequest) - const localVarPath = `/dashboard_user/get`; + employersSearch: async (employersSearchRequest: EmployersSearchRequest, options: any = {}): Promise => { + // verify required parameter 'employersSearchRequest' is not null or undefined + assertParamExists('employersSearch', 'employersSearchRequest', employersSearchRequest) + const localVarPath = `/employers/search`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -69758,7 +70632,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(dashboardUserGetRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(employersSearchRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -69766,16 +70640,16 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/dashboard_user/list` endpoint provides details (such as email address) about all Dashboard users associated with your account. This can be used to audit or track the list of reviewers for Monitor, Beacon, and Identity Verification products. - * @summary List Dashboard users - * @param {DashboardUserListRequest} dashboardUserListRequest + * `/employment/verification/get` returns a list of employments through a user payroll that was verified by an end user. This endpoint has been deprecated; new integrations should use `/credit/employment/get` instead. + * @summary (Deprecated) Retrieve a summary of an individual\'s employment information + * @param {EmploymentVerificationGetRequest} employmentVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - dashboardUserList: async (dashboardUserListRequest: DashboardUserListRequest, options: any = {}): Promise => { - // verify required parameter 'dashboardUserListRequest' is not null or undefined - assertParamExists('dashboardUserList', 'dashboardUserListRequest', dashboardUserListRequest) - const localVarPath = `/dashboard_user/list`; + employmentVerificationGet: async (employmentVerificationGetRequest: EmploymentVerificationGetRequest, options: any = {}): Promise => { + // verify required parameter 'employmentVerificationGetRequest' is not null or undefined + assertParamExists('employmentVerificationGet', 'employmentVerificationGetRequest', employmentVerificationGetRequest) + const localVarPath = `/employment/verification/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -69803,7 +70677,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(dashboardUserListRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(employmentVerificationGetRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -69811,16 +70685,17 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database - * @param {EmployersSearchRequest} employersSearchRequest + * Returns a consent grant by its identifier + * @summary Get FDX Consent Grant + * @param {string} consentId Consent Grant Identifier. Uniquely identifies the consent grant * @param {*} [options] Override http request option. * @throws {RequiredError} */ - employersSearch: async (employersSearchRequest: EmployersSearchRequest, options: any = {}): Promise => { - // verify required parameter 'employersSearchRequest' is not null or undefined - assertParamExists('employersSearch', 'employersSearchRequest', employersSearchRequest) - const localVarPath = `/employers/search`; + fdxConsentsGet: async (consentId: string, options: any = {}): Promise => { + // verify required parameter 'consentId' is not null or undefined + assertParamExists('fdxConsentsGet', 'consentId', consentId) + const localVarPath = `/fdx/consents/{consentId}` + .replace(`{${"consentId"}}`, encodeURIComponent(String(consentId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -69828,7 +70703,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -69843,12 +70718,9 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration - localVarHeaderParameter['Content-Type'] = 'application/json'; - setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(employersSearchRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -69856,16 +70728,17 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/employment/verification/get` returns a list of employments through a user payroll that was verified by an end user. This endpoint has been deprecated; new integrations should use `/credit/employment/get` instead. - * @summary (Deprecated) Retrieve a summary of an individual\'s employment information - * @param {EmploymentVerificationGetRequest} employmentVerificationGetRequest + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. * @param {*} [options] Override http request option. * @throws {RequiredError} */ - employmentVerificationGet: async (employmentVerificationGetRequest: EmploymentVerificationGetRequest, options: any = {}): Promise => { - // verify required parameter 'employmentVerificationGetRequest' is not null or undefined - assertParamExists('employmentVerificationGet', 'employmentVerificationGetRequest', employmentVerificationGetRequest) - const localVarPath = `/employment/verification/get`; + fdxConsentsList: async (customerId: string, status?: FDXConsentGrantStatus, options: any = {}): Promise => { + // verify required parameter 'customerId' is not null or undefined + assertParamExists('fdxConsentsList', 'customerId', customerId) + const localVarPath = `/fdx/consents`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -69873,7 +70746,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -69886,51 +70759,13 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration // authentication secret required await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(employmentVerificationGetRequest, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * Returns a consent grant by its identifier - * @summary Get FDX Consent Grant - * @param {string} consentId Consent Grant Identifier. Uniquely identifies the consent grant - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - fdxConsentsGet: async (consentId: string, options: any = {}): Promise => { - // verify required parameter 'consentId' is not null or undefined - assertParamExists('fdxConsentsGet', 'consentId', consentId) - const localVarPath = `/fdx/consents/{consentId}` - .replace(`{${"consentId"}}`, encodeURIComponent(String(consentId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; + if (customerId !== undefined) { + localVarQueryParameter['customerId'] = customerId; } - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication clientId required - await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) - - // authentication plaidVersion required - await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) - - // authentication secret required - await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + if (status !== undefined) { + localVarQueryParameter['status'] = status; + } @@ -70393,7 +71228,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -71474,7 +72309,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -72643,7 +73478,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -72688,7 +73523,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -72913,7 +73748,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -73139,7 +73974,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73274,7 +74109,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73363,7 +74198,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -73993,7 +74828,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -74038,7 +74873,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -74083,7 +74918,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -74128,7 +74963,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -74444,7 +75279,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74489,7 +75324,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74534,7 +75369,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }, /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74622,6 +75457,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed: async (sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options: any = {}): Promise => { + // verify required parameter 'sandboxFdxConsentSeedRequest' is not null or undefined + assertParamExists('sandboxFdxConsentSeed', 'sandboxFdxConsentSeedRequest', sandboxFdxConsentSeedRequest) + const localVarPath = `/sandbox/fdx/consent/seed`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(sandboxFdxConsentSeedRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -74758,7 +75638,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -74893,7 +75773,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -75343,7 +76223,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -75658,7 +76538,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -76198,7 +77078,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -76243,7 +77123,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -76468,7 +77348,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -76648,7 +77528,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -76873,7 +77753,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -77233,7 +78113,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -77953,7 +78833,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -78357,6 +79237,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover: async (transferReturnRecoverRequest: TransferReturnRecoverRequest, options: any = {}): Promise => { + // verify required parameter 'transferReturnRecoverRequest' is not null or undefined + assertParamExists('transferReturnRecover', 'transferReturnRecoverRequest', transferReturnRecoverRequest) + const localVarPath = `/transfer/return/recover`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(transferReturnRecoverRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -78538,7 +79463,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -78563,6 +79488,10 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration // authentication clientId required await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + // authentication oauth2 required + // oauth required + await setOAuthToObject(localVarHeaderParameter, "oauth2", ["user:write"], configuration) + // authentication plaidVersion required await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) @@ -78588,7 +79517,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -79008,7 +79937,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -80472,7 +81401,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -80539,7 +81468,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80550,7 +81479,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80561,7 +81490,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80594,7 +81523,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80605,7 +81534,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80616,7 +81545,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80627,7 +81556,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80638,7 +81567,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80649,7 +81578,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80660,7 +81589,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80671,7 +81600,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80682,7 +81611,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80693,7 +81622,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80704,7 +81633,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80715,7 +81644,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80726,7 +81655,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80736,8 +81665,8 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80748,7 +81677,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80759,7 +81688,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80770,7 +81699,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80780,8 +81709,8 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80868,7 +81797,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -80901,7 +81830,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -80956,7 +81885,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -80978,8 +81907,8 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -80989,7 +81918,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -81000,7 +81929,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -81011,7 +81940,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -81154,7 +82083,18 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async craReportGet(craReportGetRequest: CraReportGetRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.craReportGet(craReportGetRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -81363,8 +82303,8 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -81441,7 +82381,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -81472,6 +82412,18 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.fdxConsentsGet(consentId, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async fdxConsentsList(customerId: string, status?: FDXConsentGrantStatus, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.fdxConsentsList(customerId, status, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -81584,7 +82536,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -81849,7 +82801,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -82134,7 +83086,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -82145,7 +83097,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -82200,7 +83152,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -82256,7 +83208,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -82289,7 +83241,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -82310,7 +83262,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -82464,7 +83416,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -82475,7 +83427,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -82486,7 +83438,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -82497,7 +83449,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -82575,7 +83527,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -82586,7 +83538,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -82597,7 +83549,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { }, /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -82617,6 +83569,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -82651,7 +83614,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -82684,7 +83647,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -82794,7 +83757,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -82871,7 +83834,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -83003,7 +83966,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -83014,7 +83977,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -83069,7 +84032,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -83113,7 +84076,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -83168,7 +84131,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -83256,7 +84219,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -83432,7 +84395,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -83530,6 +84493,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.transferRepaymentReturnList(transferRepaymentReturnListRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async transferReturnRecover(transferReturnRecoverRequest: TransferReturnRecoverRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.transferReturnRecover(transferReturnRecoverRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -83575,7 +84549,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -83587,7 +84561,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -83689,7 +84663,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -84120,7 +85094,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.assetReportFilter(assetReportFilterRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -84181,7 +85155,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84191,7 +85165,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84201,7 +85175,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84231,7 +85205,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84241,7 +85215,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84251,7 +85225,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84261,7 +85235,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84271,7 +85245,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84281,7 +85255,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84291,7 +85265,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84301,7 +85275,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84311,7 +85285,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84321,7 +85295,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84331,7 +85305,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84341,7 +85315,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84351,7 +85325,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84360,8 +85334,8 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84371,7 +85345,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84381,7 +85355,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84391,7 +85365,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84400,8 +85374,8 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.beaconUserReview(beaconUserReviewRequest, options).then((request) => request(axios, basePath)); }, /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84480,7 +85454,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.businessVerificationGet(businessVerificationGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -84510,7 +85484,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.cashflowReportRefresh(cashflowReportRefreshRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -84560,7 +85534,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -84580,8 +85554,8 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.craCheckReportCreate(craCheckReportCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -84590,7 +85564,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -84600,7 +85574,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.craCheckReportLendScoreGet(craCheckReportLendScoreGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -84610,7 +85584,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -84740,7 +85714,17 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.craPartnerInsightsGet(craPartnerInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet(craReportGetRequest: CraReportGetRequest, options?: any): AxiosPromise { + return localVarFp.craReportGet(craReportGetRequest, options).then((request) => request(axios, basePath)); + }, + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -84930,8 +85914,8 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.creditRelayGet(creditRelayGetRequest, options).then((request) => request(axios, basePath)); }, /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -85001,7 +85985,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -85029,6 +86013,17 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath fdxConsentsGet(consentId: string, options?: any): AxiosPromise { return localVarFp.fdxConsentsGet(consentId, options).then((request) => request(axios, basePath)); }, + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + fdxConsentsList(customerId: string, status?: FDXConsentGrantStatus, options?: any): AxiosPromise { + return localVarFp.fdxConsentsList(customerId, status, options).then((request) => request(axios, basePath)); + }, /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -85131,7 +86126,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -85372,7 +86367,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -85631,7 +86626,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options).then((request) => request(axios, basePath)); }, /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -85641,7 +86636,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -85691,7 +86686,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -85742,7 +86737,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -85772,7 +86767,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -85791,7 +86786,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.processorIdentityGet(processorIdentityGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -85931,7 +86926,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -85941,7 +86936,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.processorTransactionsGet(processorTransactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -85951,7 +86946,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options).then((request) => request(axios, basePath)); }, /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -85961,7 +86956,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.processorTransactionsRefresh(processorTransactionsRefreshRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -86032,7 +87027,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -86042,7 +87037,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -86052,7 +87047,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath }, /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -86070,6 +87065,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest: SandboxCraCashflowUpdatesUpdateRequest, options?: any): AxiosPromise { return localVarFp.sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options).then((request) => request(axios, basePath)); }, + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options?: any): AxiosPromise { + return localVarFp.sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options).then((request) => request(axios, basePath)); + }, /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -86101,7 +87106,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options).then((request) => request(axios, basePath)); }, /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -86131,7 +87136,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options).then((request) => request(axios, basePath)); }, /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -86231,7 +87236,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options).then((request) => request(axios, basePath)); }, /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -86301,7 +87306,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options).then((request) => request(axios, basePath)); }, /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -86421,7 +87426,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.transactionsEnrich(transactionsEnrichRequest, options).then((request) => request(axios, basePath)); }, /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -86431,7 +87436,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.transactionsGet(transactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -86481,7 +87486,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.transactionsRulesRemove(transactionsRulesRemoveRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -86521,7 +87526,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.transferAuthorizationCreate(transferAuthorizationCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -86571,7 +87576,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.transferCreate(transferCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -86651,7 +87656,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.transferLedgerDeposit(transferLedgerDepositRequest, options).then((request) => request(axios, basePath)); }, /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -86811,7 +87816,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -86900,6 +87905,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath transferRepaymentReturnList(transferRepaymentReturnListRequest: TransferRepaymentReturnListRequest, options?: any): AxiosPromise { return localVarFp.transferRepaymentReturnList(transferRepaymentReturnListRequest, options).then((request) => request(axios, basePath)); }, + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover(transferReturnRecoverRequest: TransferReturnRecoverRequest, options?: any): AxiosPromise { + return localVarFp.transferReturnRecover(transferReturnRecoverRequest, options).then((request) => request(axios, basePath)); + }, /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -86941,7 +87956,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.userAccountSessionGet(userAccountSessionGetRequest, options).then((request) => request(axios, basePath)); }, /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -86952,7 +87967,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.userCreate(userCreateRequest, plaidNewUserAPIEnabled, options).then((request) => request(axios, basePath)); }, /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -87045,7 +88060,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -87464,7 +88479,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -87537,7 +88552,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87549,7 +88564,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87561,7 +88576,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87597,7 +88612,7 @@ export class PlaidApi extends BaseAPI { /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87609,7 +88624,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87621,7 +88636,7 @@ export class PlaidApi extends BaseAPI { /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87633,7 +88648,7 @@ export class PlaidApi extends BaseAPI { /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87645,7 +88660,7 @@ export class PlaidApi extends BaseAPI { /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87657,7 +88672,7 @@ export class PlaidApi extends BaseAPI { /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87669,7 +88684,7 @@ export class PlaidApi extends BaseAPI { /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87681,7 +88696,7 @@ export class PlaidApi extends BaseAPI { /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87693,7 +88708,7 @@ export class PlaidApi extends BaseAPI { /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87705,7 +88720,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87717,7 +88732,7 @@ export class PlaidApi extends BaseAPI { /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87729,7 +88744,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87741,7 +88756,7 @@ export class PlaidApi extends BaseAPI { /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87752,8 +88767,8 @@ export class PlaidApi extends BaseAPI { } /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87765,7 +88780,7 @@ export class PlaidApi extends BaseAPI { /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87777,7 +88792,7 @@ export class PlaidApi extends BaseAPI { /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87789,7 +88804,7 @@ export class PlaidApi extends BaseAPI { /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87800,8 +88815,8 @@ export class PlaidApi extends BaseAPI { } /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -87896,7 +88911,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -87932,7 +88947,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -87992,7 +89007,7 @@ export class PlaidApi extends BaseAPI { } /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -88016,8 +89031,8 @@ export class PlaidApi extends BaseAPI { } /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -88028,7 +89043,7 @@ export class PlaidApi extends BaseAPI { } /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -88040,7 +89055,7 @@ export class PlaidApi extends BaseAPI { } /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -88052,7 +89067,7 @@ export class PlaidApi extends BaseAPI { } /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -88208,7 +89223,19 @@ export class PlaidApi extends BaseAPI { } /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public craReportGet(craReportGetRequest: CraReportGetRequest, options?: any) { + return PlaidApiFp(this.configuration).craReportGet(craReportGetRequest, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -88436,8 +89463,8 @@ export class PlaidApi extends BaseAPI { } /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -88521,7 +89548,7 @@ export class PlaidApi extends BaseAPI { /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -88555,6 +89582,19 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).fdxConsentsGet(consentId, options).then((request) => request(this.axios, this.basePath)); } + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public fdxConsentsList(customerId: string, status?: FDXConsentGrantStatus, options?: any) { + return PlaidApiFp(this.configuration).fdxConsentsList(customerId, status, options).then((request) => request(this.axios, this.basePath)); + } + /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -88677,7 +89717,7 @@ export class PlaidApi extends BaseAPI { } /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -88966,7 +90006,7 @@ export class PlaidApi extends BaseAPI { /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -89277,7 +90317,7 @@ export class PlaidApi extends BaseAPI { } /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -89289,7 +90329,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -89349,7 +90389,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -89410,7 +90450,7 @@ export class PlaidApi extends BaseAPI { /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -89446,7 +90486,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -89469,7 +90509,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -89637,7 +90677,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -89649,7 +90689,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -89661,7 +90701,7 @@ export class PlaidApi extends BaseAPI { } /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -89673,7 +90713,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -89758,7 +90798,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -89770,7 +90810,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -89782,7 +90822,7 @@ export class PlaidApi extends BaseAPI { /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -89804,6 +90844,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options?: any) { + return PlaidApiFp(this.configuration).sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -89841,7 +90893,7 @@ export class PlaidApi extends BaseAPI { } /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -89877,7 +90929,7 @@ export class PlaidApi extends BaseAPI { } /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -89997,7 +91049,7 @@ export class PlaidApi extends BaseAPI { } /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -90081,7 +91133,7 @@ export class PlaidApi extends BaseAPI { } /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -90225,7 +91277,7 @@ export class PlaidApi extends BaseAPI { } /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -90237,7 +91289,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -90297,7 +91349,7 @@ export class PlaidApi extends BaseAPI { } /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -90345,7 +91397,7 @@ export class PlaidApi extends BaseAPI { } /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -90405,7 +91457,7 @@ export class PlaidApi extends BaseAPI { } /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -90501,7 +91553,7 @@ export class PlaidApi extends BaseAPI { } /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -90693,7 +91745,7 @@ export class PlaidApi extends BaseAPI { } /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -90800,6 +91852,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).transferRepaymentReturnList(transferRepaymentReturnListRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public transferReturnRecover(transferReturnRecoverRequest: TransferReturnRecoverRequest, options?: any) { + return PlaidApiFp(this.configuration).transferReturnRecover(transferReturnRecoverRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -90849,7 +91913,7 @@ export class PlaidApi extends BaseAPI { } /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -90862,7 +91926,7 @@ export class PlaidApi extends BaseAPI { } /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -90973,7 +92037,7 @@ export class PlaidApi extends BaseAPI { } /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. diff --git a/base.ts b/base.ts index e730489e..0549a8b5 100644 --- a/base.ts +++ b/base.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/common.ts b/common.ts index f1c31ad0..5e5b0f40 100644 --- a/common.ts +++ b/common.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/configuration.ts b/configuration.ts index 3d32dde7..ef032817 100644 --- a/configuration.ts +++ b/configuration.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -96,7 +96,7 @@ export class Configuration { if(!this.baseOptions) this.baseOptions = {}; if(!this.baseOptions.headers) this.baseOptions.headers = {}; this.baseOptions.headers = { - ['User-Agent']: `Plaid Node v43.0.0`, + ['User-Agent']: `Plaid Node v44.0.0`, ['Plaid-Version']: '2020-09-14', ...this.baseOptions.headers, } diff --git a/dist/api.d.ts b/dist/api.d.ts index 041726b5..9f2092f7 100644 --- a/dist/api.d.ts +++ b/dist/api.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -250,7 +250,7 @@ export interface AccountAssets { */ subtype: AccountSubtype | null; /** - * The current verification status of an Auth Item initiated through Automated or Manual micro-deposits. Returned for Auth Items only. `pending_automatic_verification`: The Item is pending automatic verification. `pending_manual_verification`: The Item is pending manual micro-deposit verification. Items remain in this state until the user successfully verifies the micro-deposit. `automatically_verified`: The Item has successfully been automatically verified. `manually_verified`: The Item has successfully been manually verified. `verification_expired`: Plaid was unable to automatically verify the deposit within 7 calendar days and will no longer attempt to validate the Item. Users may retry by submitting their information again through Link. `verification_failed`: The Item failed manual micro-deposit verification because the user exhausted all 3 verification attempts. Users may retry by submitting their information again through Link. `database_matched`: The Item has successfully been verified using Plaid\'s data sources. Note: Database Match is currently a beta feature, please contact your account manager for more information. + * The current verification status of an Auth Item initiated through Automated or Manual micro-deposits. Returned for Auth Items only. `pending_automatic_verification`: The Item is pending automatic verification. `pending_manual_verification`: The Item is pending manual micro-deposit verification. Items remain in this state until the user successfully verifies the micro-deposit. `automatically_verified`: The Item has successfully been automatically verified. `manually_verified`: The Item has successfully been manually verified. `verification_expired`: Plaid was unable to automatically verify the deposit within 7 calendar days and will no longer attempt to validate the Item. Users may retry by submitting their information again through Link. `verification_failed`: The Item failed manual micro-deposit verification because the user exhausted all 3 verification attempts. Users may retry by submitting their information again through Link. `database_matched`: (deprecated) The Item has successfully been verified using Plaid\'s data sources. Only returned for Auth Items created via Database Match. * @type {string} * @memberof AccountAssets */ @@ -280,7 +280,7 @@ export interface AccountAssets { */ investments?: AssetReportInvestments; /** - * Data returned by the financial institution about the account owner or owners.For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29) + * Data returned by the financial institution about the account owner or owners. For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29) * @type {Array} * @memberof AccountAssets */ @@ -318,7 +318,7 @@ export declare enum AccountAssetsVerificationStatusEnum { DatabaseMatched = "database_matched" } /** - * A set of fields describing the balance for an account. Balance information may be cached unless the balance object was returned by `/accounts/balance/get` or `/signal/evaluate` (using a Balance-only ruleset). + * A set of fields describing the balance for an account. For real-time values, use `/accounts/balance/get` or `/signal/evaluate` (with a Balance-only ruleset), which are fetched live from the institution at request time. Values returned by other endpoints may be cached, or adjusted by Plaid to reflect transaction activity received since the last refresh. * @export * @interface AccountBalance */ @@ -2077,7 +2077,7 @@ export interface AssetDetail { */ AssetTypeAdditionalDescription: string | null; /** - * The Number of days requested made to the Financial Institution. Example When looking for 3 months of data from the FI, pass in 90 days. + * The number of days requested from the Financial Institution. Example: When looking for 3 months of data from the FI, pass in 90 days. * @type {number} * @memberof AssetDetail */ @@ -2106,16 +2106,16 @@ export interface AssetDetail { * @enum {string} */ export declare enum AssetDetailAssetRetirementIndicatorEnum { - True = "true", - False = "false" + Yes = "Yes", + No = "No" } /** * @export * @enum {string} */ export declare enum AssetDetailAssetEmployerSponsoredIndicatorEnum { - True = "true", - False = "false" + Yes = "Yes", + No = "No" } /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. @@ -2231,8 +2231,8 @@ export declare enum AssetHoldingAssetHoldingTypeEnum { * @enum {string} */ export declare enum AssetHoldingAssetHoldingRestrictedIndicatorEnum { - True = "true", - False = "false" + Yes = "Yes", + No = "No" } /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. @@ -2396,7 +2396,7 @@ export declare enum AssetReportAddOns { FastAssets = "fast_assets" } /** - * AssetReportAuditCopyCreateRequest defines the request schema for `/asset_report/audit_copy/get` + * AssetReportAuditCopyCreateRequest defines the request schema for `/asset_report/audit_copy/create` * @export * @interface AssetReportAuditCopyCreateRequest */ @@ -2427,7 +2427,7 @@ export interface AssetReportAuditCopyCreateRequest { auditor_id?: string; } /** - * AssetReportAuditCopyCreateResponse defines the response schema for `/asset_report/audit_copy/get` + * AssetReportAuditCopyCreateResponse defines the response schema for `/asset_report/audit_copy/create` * @export * @interface AssetReportAuditCopyCreateResponse */ @@ -2564,7 +2564,7 @@ export interface AssetReportCreateRequest { */ secret?: string; /** - * An array of access tokens corresponding to the Items that will be included in the report. The `assets` product must have been initialized for the Items during link; the Assets product cannot be added after initialization. + * An array of access tokens corresponding to the Items that will be included in the report. The `assets` product must have been initialized for the Items during Link; the Assets product cannot be added after initialization. * @type {Array} * @memberof AssetReportCreateRequest */ @@ -2615,7 +2615,7 @@ export interface AssetReportCreateRequestOptions { */ products?: Array; /** - * A list of add-ons that should be included in the Asset Report. When Fast Assets is requested, Plaid will create two versions of the Asset Report: the Fast Asset Report, which will contain only Identity and Balance information, and the Full Asset Report, which will also contain Transactions information. A `PRODUCT_READY` webhook will be fired for each Asset Report when it is ready, and the `report_type` field will indicate whether the webhook is firing for the `full` or `fast` Asset Report. To retrieve the Fast Asset Report, call `/asset_report/get` with `fast_report` set to `true`. There is no additional charge for using Fast Assets. To create a Fast Asset Report, Plaid must successfully retrieve both Identity and Balance data; if Plaid encounters an error obtaining this data, the Fast Asset Report will not be created. However, as long as Plaid can obtain Transactions data, the Full Asset Report will still be available. When Investments is requested, `investments` must be specified in the `optional_products` array when initializing Link. + * A list of add-ons that should be included in the Asset Report. When Fast Assets is requested, Plaid will create two versions of the Asset Report: the Fast Asset Report, which will contain only Identity and Balance information, and the Full Asset Report, which will also contain Transactions information. A `PRODUCT_READY` webhook will be fired for each Asset Report when it is ready, and the `report_type` field will indicate whether the webhook is firing for the `FULL` or `FAST` Asset Report. To retrieve the Fast Asset Report, call `/asset_report/get` with `fast_report` set to `true`. There is no additional charge for using Fast Assets. To create a Fast Asset Report, Plaid must successfully retrieve both Identity and Balance data; if Plaid encounters an error obtaining this data, the Fast Asset Report will not be created. However, as long as Plaid can obtain Transactions data, the Full Asset Report will still be available. When Investments is requested, `investments` must be specified in the `optional_products` array when initializing Link. * @type {Array} * @memberof AssetReportCreateRequestOptions */ @@ -2937,7 +2937,7 @@ export interface AssetReportInvestmentHolding { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof AssetReportInvestmentHolding */ @@ -3065,7 +3065,7 @@ export interface AssetReportInvestmentTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof AssetReportInvestmentTransaction */ @@ -3375,7 +3375,7 @@ export interface AssetReportTransaction { */ date: string; /** - * The date on which the transaction took place, in IS0 8601 format. + * The date on which the transaction took place, in ISO 8601 format. * @type {string} * @memberof AssetReportTransaction */ @@ -4310,7 +4310,7 @@ export declare enum BankIncomeRefreshCompleteResult { Failure = "FAILURE" } /** - * Fired when a refreshed bank income report has finished generating or failed to generate. The `/credit/bank_income/refresh` endpoint that previously triggered this webhook is deprecated; to refresh Bank Income data, send the user through Link\'s update mode, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To get this webhook, subscribe via the [Dashboard](https://dashboard.plaid.com/developers/webhooks). + * Fired when a refreshed bank income report has finished generating or failed to generate. To obtain refreshed Bank Income data, send the user through Link\'s update mode, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To get this webhook, subscribe via the [Dashboard](https://dashboard.plaid.com/developers/webhooks). * @export * @interface BankIncomeRefreshCompleteWebhook */ @@ -4347,7 +4347,7 @@ export interface BankIncomeRefreshCompleteWebhook { environment: WebhookEnvironmentValues; } /** - * Fired when a change to the user\'s income is detected. The `/credit/bank_income/refresh` endpoint that previously served this refresh is deprecated; to get updated income data, send the user through Link\'s update mode so they can confirm their income sources, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To receive this webhook, subscribe in the [Dashboard](https://dashboard.plaid.com/developers/webhooks). + * Fired when a change to the user\'s income is detected. To obtain refreshed Bank Income data, send the user through Link\'s update mode so they can confirm their income sources, or migrate to CRA Income Insights and call `/cra/check_report/create` for a backend refresh. To receive this webhook, subscribe in the [Dashboard](https://dashboard.plaid.com/developers/webhooks). * @export * @interface BankIncomeRefreshUpdateWebhook */ @@ -4876,6 +4876,12 @@ export interface BankTransferEvent { * @memberof BankTransferEvent */ direction: BankTransferDirection | null; + /** + * + * @type {ReceiverDetails} + * @memberof BankTransferEvent + */ + receiver_details: ReceiverDetails | null; } /** * The type of bank transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into your origination account; a `credit` indicates a transfer of money out of your origination account. @@ -6026,7 +6032,7 @@ export interface BaseReportInvestmentHolding { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof BaseReportInvestmentHolding */ @@ -6166,7 +6172,7 @@ export interface BaseReportInvestmentTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof BaseReportInvestmentTransaction */ @@ -6346,7 +6352,7 @@ export interface BaseReportTransaction { */ date: string; /** - * The date on which the transaction took place, in IS0 8601 format. + * The date on which the transaction took place, in ISO 8601 format. * @type {string} * @memberof BaseReportTransaction */ @@ -9030,7 +9036,7 @@ export interface BetaEwaReportV1GetResponse { */ generation_time?: string; /** - * A list of earned wage access (EWA) scoring entries that map potential advance amounts to repayment likelihood scores. The predefined advance amount ranges are `[0, 25]`, `[25, 50]`, `[50, 100]`, `[100, 200]`, `[200, 300]`, `[300, 400]`, and `[400, 500]`. + * A list of earned wage access (EWA) scoring entries that map potential advance amounts to repayment likelihood scores. The predefined advance amount ranges are `[0, 25)`, `[25, 50)`, `[50, 100)`, `[100, 200)`, `[200, 300)`, `[300, 400)`, and `[400, 500)`. * @type {Array} * @memberof BetaEwaReportV1GetResponse */ @@ -10786,7 +10792,7 @@ export interface CashflowReportGetResponse { */ transactions: Array; /** - * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched via manipulating the `offset` parameter. + * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched using the `cursor` parameter. * @type {number} * @memberof CashflowReportGetResponse */ @@ -11386,7 +11392,7 @@ export interface CashflowReportTransaction { */ account_id: string; /** - * The settled value of the transaction, denominated in the transactions\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. + * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. * @type {number} * @memberof CashflowReportTransaction */ @@ -11398,7 +11404,7 @@ export interface CashflowReportTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof CashflowReportTransaction */ @@ -11422,7 +11428,7 @@ export interface CashflowReportTransaction { */ location: Location; /** - * The merchant name or transaction description. Note: This is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The merchant name or transaction description. Note: This is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof CashflowReportTransaction */ @@ -11470,7 +11476,7 @@ export interface CashflowReportTransaction { */ transaction_id: string; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof CashflowReportTransaction */ @@ -11530,7 +11536,7 @@ export interface CashflowReportTransaction { */ transaction_code: TransactionCode | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof CashflowReportTransaction */ @@ -11623,7 +11629,7 @@ export interface CashflowReportTransactionsGetResponse { */ transactions: Array; /** - * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched via manipulating the `offset` parameter. + * The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched using the `cursor` parameter. * @type {number} * @memberof CashflowReportTransactionsGetResponse */ @@ -11815,7 +11821,7 @@ export interface Cause { */ error_code: string; /** - * The specific reason for the error code. Currently, reasons are only supported OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. + * The specific reason for the error code. Currently, reasons are only supported for OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. * @type {string} * @memberof Cause */ @@ -11895,7 +11901,44 @@ export interface CauseAllOf { item_id?: string; } /** - * It is possible for a Check Report product to be returned with missing information. In such cases, the product will contain warning data in the response, indicating why obtaining the owner information failed. + * An error object plus the `item_id` of an Item that the end user can repair via Link [update mode](https://plaid.com/docs/link/update-mode). The `error_code` will be in the `ITEM_LOGIN_REQUIRED` family. + * @export + * @interface CheckReportRepairableItem + */ +export interface CheckReportRepairableItem { + /** + * + * @type {PlaidErrorType} + * @memberof CheckReportRepairableItem + */ + error_type: PlaidErrorType; + /** + * The particular error code. Safe for programmatic use. + * @type {string} + * @memberof CheckReportRepairableItem + */ + error_code: string; + /** + * A developer-friendly representation of the error code. This may change over time and is not safe for programmatic use. + * @type {string} + * @memberof CheckReportRepairableItem + */ + error_message: string; + /** + * A user-friendly representation of the error code. `null` if the error is not related to user action. + * @type {string} + * @memberof CheckReportRepairableItem + */ + display_message: string | null; + /** + * The `item_id` of the Item associated with this webhook, warning, or error + * @type {string} + * @memberof CheckReportRepairableItem + */ + item_id: string; +} +/** + * It is possible for a Check Report product to be returned with missing information. In such cases, the product will contain warning data in the response, indicating why some of the requested information could not be retrieved. * @export * @interface CheckReportWarning */ @@ -12071,7 +12114,7 @@ export interface ClientProvidedRawTransaction { */ description: string; /** - * The value of the transaction with direction. (NOTE: this will affect enrichment results, so directions are important):. Negative (-) for credits (e.g., incoming transfers, refunds) Positive (+) for debits (e.g., purchases, fees, outgoing transfers) + * The value of the transaction with direction. (NOTE: this will affect enrichment results, so directions are important). Negative (-) for credits (e.g., incoming transfers, refunds) Positive (+) for debits (e.g., purchases, fees, outgoing transfers) * @type {number} * @memberof ClientProvidedRawTransaction */ @@ -12397,7 +12440,7 @@ export interface ConnectedApplication { */ reason_for_access?: string | null; /** - * The date this application was linked in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) (YYYY-MM-DD) format in UTC. + * The date and time this application was linked, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format in UTC (e.g. `\"2020-01-01T00:00:00Z\"`). Note that older, legacy integrations instead receive this value as a date only, in `YYYY-MM-DD` format (e.g. `\"2020-01-01\"`). * @type {string} * @memberof ConnectedApplication */ @@ -12765,7 +12808,7 @@ export interface Counterparty { */ website: string | null; /** - * The URL of a logo associated with the counterparty, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with the counterparty, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Counterparty */ @@ -13580,7 +13623,7 @@ export interface CraCashflowInsightsReport { attributes?: object; } /** - * BaseReportGetRequest defines the request schema for `/cra/check_report/base_report/get` + * CraCheckReportBaseReportGetRequest defines the request schema for `/cra/check_report/base_report/get` * @export * @interface CraCheckReportBaseReportGetRequest */ @@ -13627,6 +13670,18 @@ export interface CraCheckReportBaseReportGetRequest { * @memberof CraCheckReportBaseReportGetRequest */ user_tier?: CraUserTier | null; + /** + * The CRA report token (formatted `cra-report--`) identifying a specific consumer report. When provided alongside `consumer_report_permissible_purpose`, pins retrieval to that report and stamps its permissible purpose. If omitted, the most recently generated report for the user is returned. + * @type {string} + * @memberof CraCheckReportBaseReportGetRequest + */ + report_id?: string; + /** + * + * @type {CraCheckReportPermissiblePurpose} + * @memberof CraCheckReportBaseReportGetRequest + */ + consumer_report_permissible_purpose?: CraCheckReportPermissiblePurpose; } /** * CraCheckReportBaseReportGetResponse defines the response schema for `/cra/check_report/base_report/get` @@ -13654,7 +13709,7 @@ export interface CraCheckReportBaseReportGetResponse { request_id: string; } /** - * Defines configuration options to generate Cashflow Insights + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportCashflowInsightsGetOptions */ @@ -13706,6 +13761,7 @@ export interface CraCheckReportCashflowInsightsGetRequest { * * @type {CraCheckReportCashflowInsightsGetOptions} * @memberof CraCheckReportCashflowInsightsGetRequest + * @deprecated */ options?: CraCheckReportCashflowInsightsGetOptions | null; } @@ -13766,6 +13822,77 @@ export interface CraCheckReportCreateBaseReportOptions { */ home_lending_report_options?: CraCheckReportHomeLendingReportOptions | null; } +/** + * Defines configuration options to generate Cashflow Insights + * @export + * @interface CraCheckReportCreateCashflowInsightsOptions + */ +export interface CraCheckReportCreateCashflowInsightsOptions { + /** + * + * @type {CashflowAttributesVersion} + * @memberof CraCheckReportCreateCashflowInsightsOptions + */ + attributes_version?: CashflowAttributesVersion | null; +} +/** + * Defines configuration options for the Employment Refresh Report. + * @export + * @interface CraCheckReportCreateEmploymentRefreshOptions + */ +export interface CraCheckReportCreateEmploymentRefreshOptions { + /** + * The number of days of data to request for the report. This field is required if an Employment Refresh Report is requested. Maximum is 731. + * @type {number} + * @memberof CraCheckReportCreateEmploymentRefreshOptions + */ + days_requested: number; +} +/** + * Defines configuration options to generate Income Insights. + * @export + * @interface CraCheckReportCreateIncomeInsightsOptions + */ +export interface CraCheckReportCreateIncomeInsightsOptions { + /** + * + * @type {IncomeInsightsFilter} + * @memberof CraCheckReportCreateIncomeInsightsOptions + */ + income_insights_filter?: IncomeInsightsFilter | null; + /** + * + * @type {IncomeInsightsVersion} + * @memberof CraCheckReportCreateIncomeInsightsOptions + */ + income_insights_version: IncomeInsightsVersion | null; +} +/** + * Defines configuration options to generate the LendScore + * @export + * @interface CraCheckReportCreateLendScoreOptions + */ +export interface CraCheckReportCreateLendScoreOptions { + /** + * + * @type {PlaidLendScoreVersion} + * @memberof CraCheckReportCreateLendScoreOptions + */ + lend_score_version?: PlaidLendScoreVersion | null; +} +/** + * Defines configuration options to generate Network Insights + * @export + * @interface CraCheckReportCreateNetworkInsightsOptions + */ +export interface CraCheckReportCreateNetworkInsightsOptions { + /** + * + * @type {NetworkInsightsVersion} + * @memberof CraCheckReportCreateNetworkInsightsOptions + */ + network_insights_version?: NetworkInsightsVersion | null; +} /** * Defines configuration to generate Partner Insights. * @export @@ -13840,7 +13967,7 @@ export interface CraCheckReportCreateRequest { */ client_report_id?: string | null; /** - * Specifies a list of products that will be eagerly generated when creating the report (in addition to the Base Report, which is always eagerly generated). These products will be made available before a success webhook is sent. Use this option to minimize response latency for product `/get` endpoints. Note that specifying `cra_partner_insights` in this field will trigger a billable event. Other products are not billed until the respective reports are fetched via product-specific `/get` endpoints. + * Specifies a list of products to generate when creating the report (in addition to the Base Report, which is always generated). These products will be made available before a success webhook is sent. Note that specifying `cra_partner_insights` in this field will trigger a billable event. Other products are not billed until the respective reports are retrieved via their product-specific `/get` endpoints. * @type {Array} * @memberof CraCheckReportCreateRequest */ @@ -13853,10 +13980,10 @@ export interface CraCheckReportCreateRequest { base_report?: CraCheckReportCreateBaseReportOptions | null; /** * - * @type {CraCheckReportCashflowInsightsGetOptions} + * @type {CraCheckReportCreateCashflowInsightsOptions} * @memberof CraCheckReportCreateRequest */ - cashflow_insights?: CraCheckReportCashflowInsightsGetOptions | null; + cashflow_insights?: CraCheckReportCreateCashflowInsightsOptions | null; /** * * @type {CraCheckReportCreatePartnerInsightsOptions} @@ -13865,16 +13992,16 @@ export interface CraCheckReportCreateRequest { partner_insights?: CraCheckReportCreatePartnerInsightsOptions | null; /** * - * @type {CraCheckReportLendScoreGetOptions} + * @type {CraCheckReportCreateLendScoreOptions} * @memberof CraCheckReportCreateRequest */ - lend_score?: CraCheckReportLendScoreGetOptions | null; + lend_score?: CraCheckReportCreateLendScoreOptions | null; /** * - * @type {CraCheckReportNetworkInsightsGetOptions} + * @type {CraCheckReportCreateNetworkInsightsOptions} * @memberof CraCheckReportCreateRequest */ - network_insights?: CraCheckReportNetworkInsightsGetOptions | null; + network_insights?: CraCheckReportCreateNetworkInsightsOptions | null; /** * Indicates that investment data should be extracted from the linked account(s). * @type {boolean} @@ -13883,10 +14010,10 @@ export interface CraCheckReportCreateRequest { include_investments?: boolean | null; /** * - * @type {CraCheckReportIncomeInsightsGetOptions} + * @type {CraCheckReportCreateIncomeInsightsOptions} * @memberof CraCheckReportCreateRequest */ - income_insights?: CraCheckReportIncomeInsightsGetOptions | null; + income_insights?: CraCheckReportCreateIncomeInsightsOptions | null; /** * * @type {ConsumerReportPermissiblePurpose} @@ -13931,6 +14058,24 @@ export interface CraCheckReportFailedWebhook { * @memberof CraCheckReportFailedWebhook */ user_id: string; + /** + * Details on why the Check Report failed and how to resolve it. + * @type {PlaidError} + * @memberof CraCheckReportFailedWebhook + */ + error?: PlaidError | null; + /** + * A list of Items that the end user can repair via Link [update mode](https://plaid.com/docs/link/update-mode). Empty when no Item is user-repairable. After repairing these Items, call `/cra/check_report/create` to regenerate the report. + * @type {Array} + * @memberof CraCheckReportFailedWebhook + */ + repairable_items?: Array; + /** + * Specifies a list of products that failed to generate for the report. Populated when generation was attempted and all requested products failed. Additional detail on what caused the failure can be found by calling the product /get endpoint. + * @type {Array} + * @memberof CraCheckReportFailedWebhook + */ + failed_products?: Array; /** * A list of `item_ids` included in the Check Report. Access to this field is in closed beta. * @type {Array} @@ -14046,13 +14191,13 @@ export interface CraCheckReportHomeLendingReportOptions { reports_requested: Array; /** * - * @type {CraCheckReportVerificationGetEmploymentRefreshOptions} + * @type {CraCheckReportCreateEmploymentRefreshOptions} * @memberof CraCheckReportHomeLendingReportOptions */ - employment_refresh_options?: CraCheckReportVerificationGetEmploymentRefreshOptions | null; + employment_refresh_options?: CraCheckReportCreateEmploymentRefreshOptions | null; } /** - * Defines configuration options to generate Income Insights. + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportIncomeInsightsGetOptions */ @@ -14110,8 +14255,21 @@ export interface CraCheckReportIncomeInsightsGetRequest { * * @type {CraCheckReportIncomeInsightsGetOptions} * @memberof CraCheckReportIncomeInsightsGetRequest + * @deprecated */ options?: CraCheckReportIncomeInsightsGetOptions | null; + /** + * The CRA report token (formatted `cra-report--`) identifying a specific consumer report. When provided alongside `consumer_report_permissible_purpose`, pins retrieval to that report and stamps its permissible purpose. If omitted, the most recently generated report for the user is returned. + * @type {string} + * @memberof CraCheckReportIncomeInsightsGetRequest + */ + report_id?: string; + /** + * + * @type {CraCheckReportPermissiblePurpose} + * @memberof CraCheckReportIncomeInsightsGetRequest + */ + consumer_report_permissible_purpose?: CraCheckReportPermissiblePurpose; } /** * CraCheckReportIncomeInsightsGetResponse defines the response schema for `/cra/check_report/income_insights/get`. @@ -14139,7 +14297,7 @@ export interface CraCheckReportIncomeInsightsGetResponse { warnings?: Array; } /** - * Defines configuration options to generate the LendScore + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportLendScoreGetOptions */ @@ -14191,6 +14349,7 @@ export interface CraCheckReportLendScoreGetRequest { * * @type {CraCheckReportLendScoreGetOptions} * @memberof CraCheckReportLendScoreGetRequest + * @deprecated */ options?: CraCheckReportLendScoreGetOptions | null; } @@ -14220,7 +14379,7 @@ export interface CraCheckReportLendScoreGetResponse { warnings?: Array; } /** - * Defines configuration options to generate Network Insights + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `options`. * @export * @interface CraCheckReportNetworkInsightsGetOptions */ @@ -14260,6 +14419,7 @@ export interface CraCheckReportNetworkInsightsGetRequest { * * @type {CraCheckReportNetworkInsightsGetOptions} * @memberof CraCheckReportNetworkInsightsGetRequest + * @deprecated */ options?: CraCheckReportNetworkInsightsGetOptions | null; /** @@ -14358,7 +14518,7 @@ export interface CraCheckReportPartnerInsightsGetOptions { prism_versions?: PrismVersionsDeprecated | null; } /** - * Defines configuration to generate Partner Insights. + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `partner_insights`. * @export * @interface CraCheckReportPartnerInsightsGetPartnerInsights */ @@ -14422,6 +14582,7 @@ export interface CraCheckReportPartnerInsightsGetRequest { * * @type {CraCheckReportPartnerInsightsGetPartnerInsights} * @memberof CraCheckReportPartnerInsightsGetRequest + * @deprecated */ partner_insights?: CraCheckReportPartnerInsightsGetPartnerInsights; /** @@ -14457,6 +14618,15 @@ export interface CraCheckReportPartnerInsightsGetResponse { */ warnings?: Array; } +/** + * The permissible purpose under the FCRA for retrieving this consumer report. Restricted to permissible purposes related to loan servicing only. Required when `report_id` is provided. + * @export + * @enum {string} + */ +export declare enum CraCheckReportPermissiblePurpose { + AccountReviewCredit = "ACCOUNT_REVIEW_CREDIT", + WrittenInstructionOther = "WRITTEN_INSTRUCTION_OTHER" +} /** * Fired when the Check Report is ready to be retrieved. Once this webhook has fired, the report will be available to retrieve for 24 hours. * @export @@ -14507,7 +14677,7 @@ export interface CraCheckReportReadyWebhook { environment: WebhookEnvironmentValues; } /** - * Defines configuration options for the Employment Refresh Report. + * Deprecated. This field is no longer accepted for new clients (created on or after 2026-07-01). New clients should specify required products when creating the Consumer Report. Existing integrations may continue to pass `employment_refresh_options`. * @export * @interface CraCheckReportVerificationGetEmploymentRefreshOptions */ @@ -14563,6 +14733,7 @@ export interface CraCheckReportVerificationGetRequest { * * @type {CraCheckReportVerificationGetEmploymentRefreshOptions} * @memberof CraCheckReportVerificationGetRequest + * @deprecated */ employment_refresh_options?: CraCheckReportVerificationGetEmploymentRefreshOptions | null; /** @@ -14640,6 +14811,12 @@ export interface CraCheckReportVerificationPdfGetRequest { * @memberof CraCheckReportVerificationPdfGetRequest */ reports_requested?: Set; + /** + * If `true`, the GSE identifiers (the Report ID and `gse_reference_id`) are omitted from the returned Home Lending Report PDF. Defaults to `false`. These identifiers are always present in the `/cra/check_report/verification/get` JSON response regardless of this field. + * @type {boolean} + * @memberof CraCheckReportVerificationPdfGetRequest + */ + hide_gse_details?: boolean; /** * The user token associated with the user for which data is being requested. This field is used only by customers with pre-existing integrations that already use the `user_token` field. All other customers should use the `user_id` instead. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). * @type {string} @@ -15891,7 +16068,7 @@ export interface CraMonitoringInsightsGetRequest { user_token?: string; } /** - * CraMonitoringInsightsGetResponse defines the response schema for `cra/monitoring_insights/get` + * CraMonitoringInsightsGetResponse defines the response schema for `/cra/monitoring_insights/get` * @export * @interface CraMonitoringInsightsGetResponse */ @@ -16014,7 +16191,7 @@ export interface CraMonitoringInsightsSubscribeRequest { user_token?: string; } /** - * CraMonitoringInsightsSubscribeResponse defines the response schema for `cra/monitoring_insights/subscribe` + * CraMonitoringInsightsSubscribeResponse defines the response schema for `/cra/monitoring_insights/subscribe` * @export * @interface CraMonitoringInsightsSubscribeResponse */ @@ -16058,7 +16235,7 @@ export interface CraMonitoringInsightsUnsubscribeRequest { subscription_id: string; } /** - * CraMonitoringInsightsUnsubscribeResponse defines the response schema for `cra/monitoring_insights/unsubscribe` + * CraMonitoringInsightsUnsubscribeResponse defines the response schema for `/cra/monitoring_insights/unsubscribe` * @export * @interface CraMonitoringInsightsUnsubscribeResponse */ @@ -16880,6 +17057,12 @@ export interface CraPartnerInsightsUltraFicoScoreResult { * @memberof CraPartnerInsightsUltraFicoScoreResult */ error_reason?: string; + /** + * FICO exclusion code indicating why an UltraFICO® score could not be computed due to consumer-data conditions (e.g. insufficient account history). `null` when the exclusion code is not set; \"0\" when a score was produced. + * @type {string} + * @memberof CraPartnerInsightsUltraFicoScoreResult + */ + exclusion_code?: string | null; } /** * The version of the UltraFICO® score. @@ -16933,6 +17116,202 @@ export interface CraProjectedModeledIncome { */ annual: CraAnnualIncomeValues; } +/** + * The stage in the lending lifecycle for which the report is being retrieved. + * @export + * @enum {string} + */ +export declare enum CraReportDecisionStage { + Prequalification = "PREQUALIFICATION", + Decisioning = "DECISIONING", + Servicing = "SERVICING" +} +/** + * The CRA report returned by `/cra/report/get`. + * @export + * @interface CraReportGetReport + */ +export interface CraReportGetReport { + /** + * The date and time the report was retrieved. + * @type {string} + * @memberof CraReportGetReport + */ + retrieved_time: string; + /** + * + * @type {CraReportScope} + * @memberof CraReportGetReport + */ + scope: CraReportScope; + /** + * + * @type {CraReportDecisionStage} + * @memberof CraReportGetReport + */ + decision_stage: CraReportDecisionStage; + /** + * + * @type {ConsumerReportPermissiblePurpose} + * @memberof CraReportGetReport + */ + consumer_report_permissible_purpose: ConsumerReportPermissiblePurpose; + /** + * Per-product report data. Each entry corresponds to one requested product. + * @type {Array} + * @memberof CraReportGetReport + */ + products: Array; +} +/** + * CraReportGetRequest defines the request schema for `/cra/report/get`. + * @export + * @interface CraReportGetRequest + */ +export interface CraReportGetRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof CraReportGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof CraReportGetRequest + */ + secret?: string; + /** + * A unique user identifier, created by `/user/create`. Integrations that began using `/user/create` after December 10, 2025 use this field to identify a user instead of the `user_token`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). + * @type {string} + * @memberof CraReportGetRequest + */ + user_id: string; + /** + * The requested products and their versions, e.g. `[{\"product\":\"cra_qualify\",\"version\":\"V1\"}]`. + * @type {Array} + * @memberof CraReportGetRequest + */ + products: Array; + /** + * + * @type {CraReportScope} + * @memberof CraReportGetRequest + */ + scope?: CraReportScope; + /** + * + * @type {CraReportDecisionStage} + * @memberof CraReportGetRequest + */ + decision_stage: CraReportDecisionStage; + /** + * + * @type {ConsumerReportPermissiblePurpose} + * @memberof CraReportGetRequest + */ + consumer_report_permissible_purpose: ConsumerReportPermissiblePurpose; +} +/** + * CraReportGetRequestProduct specifies a product and version for a `/cra/report/get` call. + * @export + * @interface CraReportGetRequestProduct + */ +export interface CraReportGetRequestProduct { + /** + * + * @type {Products} + * @memberof CraReportGetRequestProduct + */ + product: Products; + /** + * The version of the product that was generated. + * @type {string} + * @memberof CraReportGetRequestProduct + */ + version: string; +} +/** + * CraReportGetResponse defines the response schema for `/cra/report/get`. + * @export + * @interface CraReportGetResponse + */ +export interface CraReportGetResponse { + /** + * + * @type {CraReportGetReport} + * @memberof CraReportGetResponse + */ + report: CraReportGetReport; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof CraReportGetResponse + */ + request_id: string; + /** + * A unique user identifier, created by `/user/create`. Integrations that began using `/user/create` after December 10, 2025 use this field to identify a user instead of the `user_token`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). + * @type {string} + * @memberof CraReportGetResponse + */ + user_id: string; + /** + * User or report-level errors that affected the overall report but do not map to a specific product failure. + * @type {Array} + * @memberof CraReportGetResponse + */ + warnings: Array; +} +/** + * Per-product report data. `attributes` is an opaque map of key-value pairs; for a full list of attributes per product and version, see the data dictionary. + * @export + * @interface CraReportGetResponseProduct + */ +export interface CraReportGetResponseProduct { + /** + * + * @type {Products} + * @memberof CraReportGetResponseProduct + */ + product: Products; + /** + * The version of the product that was generated. + * @type {string} + * @memberof CraReportGetResponseProduct + */ + version: string; + /** + * A map of product report metadata, where the key is a string and the value varies by product. For a full list of metadata fields per product, see the data dictionary. May be `null` if metadata was not available. + * @type {{ [key: string]: object; }} + * @memberof CraReportGetResponseProduct + */ + metadata: { + [key: string]: object; + } | null; + /** + * A map of product attributes, where the key is a string and the value is a float, int, or boolean. The specific list of attributes depends on the product and version. For a full list, see the data dictionary. May be `null` if attributes were not available. + * @type {{ [key: string]: object; }} + * @memberof CraReportGetResponseProduct + */ + attributes: { + [key: string]: object; + } | null; + /** + * Product-level errors. Non-empty when this product failed to generate; empty on success. + * @type {Array} + * @memberof CraReportGetResponseProduct + */ + errors: Array; +} +/** + * Determines whose items are used. `PLAID_NETWORK` (default) uses the Plaid Network view of the user\'s profile. `CLIENT_USER` uses only the items linked by this client. + * @export + * @enum {string} + */ +export declare enum CraReportScope { + PlaidNetwork = "PLAID_NETWORK", + ClientUser = "CLIENT_USER" +} /** * Fired when a Check Report upgrade attempt has failed * @export @@ -16994,6 +17373,24 @@ export interface CraUserCheckReportFailedWebhook { * @memberof CraUserCheckReportFailedWebhook */ user_id: string; + /** + * Details on why the Check Report failed and how to resolve it. + * @type {PlaidError} + * @memberof CraUserCheckReportFailedWebhook + */ + error?: PlaidError | null; + /** + * A list of Items that the end user can repair via Link [update mode](https://plaid.com/docs/link/update-mode). Empty when no Item is user-repairable. After repairing these Items, call `/cra/check_report/create` to regenerate the report. + * @type {Array} + * @memberof CraUserCheckReportFailedWebhook + */ + repairable_items?: Array; + /** + * Specifies a list of products that failed to generate for the report. Populated when generation was attempted and all requested products failed. Additional detail on what caused the failure can be found by calling the product /get endpoint. + * @type {Array} + * @memberof CraUserCheckReportFailedWebhook + */ + failed_products?: Array; /** * A list of `item_ids` included in the Check Report. Access to this field is in closed beta. * @type {Array} @@ -19242,7 +19639,7 @@ export interface CreditBankIncomeSummary { */ export interface CreditBankIncomeTransaction { /** - * The settled value of the transaction, denominated in the transactions\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. + * The settled value of the transaction, denominated in the transaction\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. * @type {number} * @memberof CreditBankIncomeTransaction */ @@ -19658,7 +20055,7 @@ export interface CreditBankStatementsUploadsGetRequest { */ export interface CreditBankStatementsUploadsGetRequestOptions { /** - * An array of `item_id`s whose bank statements information is returned. Each `item_id` should uniquely identify a bank statements uploaded item. If this field is not provided, all `item_id`s associated with the `user_token` will returned in the response. + * An array of `item_id`s whose bank statements information is returned. Each `item_id` should uniquely identify a bank statements uploaded item. If this field is not provided, all `item_id`s associated with the `user_token` will be returned in the response. * @type {Array} * @memberof CreditBankStatementsUploadsGetRequestOptions */ @@ -19776,13 +20173,13 @@ export interface CreditDocumentMetadata { */ name: string; /** - * The type of document. `PAYSTUB`: A paystub. `BANK_STATEMENT`: A bank statement. `US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `NONE`: Used to indicate that there is no underlying document for the data. `UNKNOWN`: Document type could not be determined. + * The type of document. `PAYSTUB`: A paystub. `BANK_STATEMENT`: A bank statement. `US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `US_TAX_1099_MISC`: A 1099-MISC tax form reporting miscellaneous income. `US_TAX_1099_K`: A 1099-K tax form reporting payment card and third-party network transactions. `US_STUDENT_I20`: A Certificate of Eligibility for Nonimmigrant Student Status (Form I-20) issued by a US school. `US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `NONE`: Used to indicate that there is no underlying document for the data. `UNKNOWN`: Document type could not be determined. * @type {string} * @memberof CreditDocumentMetadata */ document_type: string | null; /** - * Signed URL to retrieve the document(s). The payload will be a .zip file containing the document(s). For Payroll Income, the file type of the documents will always be PDF, and the documents may not be available, in which case the field will be `null`. If you would like Plaid to generate a PDF if the original is not available, contact your account manager. [Example generated pay stub](https://plaid.com/documents/plaid-generated-mock-paystub.pdf). For Document Income, this field will not be `null`, and the file type of the underlying document(s) will be the original file type uploaded by the user. For more details on available file types, see the [Document Income](https://plaid.com/docs/income/payroll-income) documentation. This download URL can only be used once and expires after two minutes. To generate a new download URL, call `/credit/payroll_income/get` again. + * Signed URL to retrieve the document(s). The payload will be a .zip file containing the document(s). For Payroll Income, the file type of the documents will always be PDF, and the documents may not be available, in which case the field will be `null`. If you would like Plaid to generate a PDF if the original is not available, contact your account manager. [Example generated pay stub](https://plaid.com/documents/plaid-generated-mock-paystub.pdf). For Document Income, this field will not be `null`, and the file type of the underlying document(s) will be the original file type uploaded by the user. For more details on available file types, see the [Document Income](https://plaid.com/docs/income/document-income) documentation. This download URL can only be used once and expires after two minutes. To generate a new download URL, call `/credit/payroll_income/get` again. * @type {string} * @memberof CreditDocumentMetadata */ @@ -20134,7 +20531,7 @@ export interface CreditFreddieMacParties { PARTY: Array; } /** - * A collection of information about a single party to a transaction. Included direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. + * A collection of information about a single party to a transaction. Includes direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. * @export * @interface CreditFreddieMacParty */ @@ -20347,6 +20744,134 @@ export interface CreditFreddieMacVerificationOfAssetsDeal { */ SERVICES: CreditFreddieMacServices; } +/** + * An object representing an end user\'s Form I-20 US immigration student document. + * @export + * @interface CreditI20 + */ +export interface CreditI20 { + /** + * An identifier of the document referenced by the document metadata. + * @type {string} + * @memberof CreditI20 + */ + document_id?: string | null; + /** + * + * @type {CreditDocumentMetadata} + * @memberof CreditI20 + */ + document_metadata?: CreditDocumentMetadata; + /** + * + * @type {CreditI20Student} + * @memberof CreditI20 + */ + student?: CreditI20Student; + /** + * Amount of the student\'s personal funds. + * @type {number} + * @memberof CreditI20 + */ + personal_funds?: number | null; + /** + * Amount of funds from on-campus employment. + * @type {number} + * @memberof CreditI20 + */ + on_campus_employment?: number | null; + /** + * Amount of funds provided by the issuing school. + * @type {number} + * @memberof CreditI20 + */ + funds_from_this_school?: number | null; + /** + * Total amount of funds available to the student. + * @type {number} + * @memberof CreditI20 + */ + students_funding_total?: number | null; + /** + * Amount of funds from another source. + * @type {number} + * @memberof CreditI20 + */ + funds_from_another_source?: number | null; + /** + * Estimated total average costs for the program period. + * @type {number} + * @memberof CreditI20 + */ + estimated_average_costs_total?: number | null; + /** + * Estimated average living expenses. + * @type {number} + * @memberof CreditI20 + */ + estimated_average_living_expenses?: number | null; + /** + * Number of months the student\'s funding covers. + * @type {number} + * @memberof CreditI20 + */ + students_funding_period_months?: number | null; + /** + * Number of months the estimated average costs cover. + * @type {number} + * @memberof CreditI20 + */ + estimated_average_costs_period_months?: number | null; +} +/** + * An object representing the student named on a Form I-20. + * @export + * @interface CreditI20Student + */ +export interface CreditI20Student { + /** + * Given name of the student. + * @type {string} + * @memberof CreditI20Student + */ + given_name?: string | null; + /** + * Surname or primary name of the student. + * @type {string} + * @memberof CreditI20Student + */ + surname_primary_name?: string | null; + /** + * Name of the student as it appears on their passport. + * @type {string} + * @memberof CreditI20Student + */ + passport_name?: string | null; + /** + * Preferred name of the student. + * @type {string} + * @memberof CreditI20Student + */ + preferred_name?: string | null; + /** + * Name of the school issuing the Form I-20. + * @type {string} + * @memberof CreditI20Student + */ + school_name?: string | null; + /** + * Start date of the program in ISO 8601 format (YYYY-MM-DD). + * @type {string} + * @memberof CreditI20Student + */ + program_start_date?: string | null; + /** + * End date of the program in ISO 8601 format (YYYY-MM-DD). + * @type {string} + * @memberof CreditI20Student + */ + program_end_date?: string | null; +} /** * An object representing an end user\'s pay stub. * @export @@ -20496,7 +21021,7 @@ export interface CreditPayStubEmployee { */ name: string | null; /** - * Marital status of the employee - either `SINGLE` or `MARRIED` or `NOT LISTED`. + * Marital status of the employee - one of `SINGLE`, `MARRIED`, or `NOT LISTED`. * @type {string} * @memberof CreditPayStubEmployee */ @@ -20552,7 +21077,7 @@ export interface CreditPayStubNetPay { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof CreditPayStubNetPay */ @@ -20618,7 +21143,7 @@ export interface CreditPayrollIncomeGetRequest { */ export interface CreditPayrollIncomeGetRequestOptions { /** - * An array of `item_id`s whose payroll information is returned. Each `item_id` should uniquely identify a payroll income item. If this field is not provided, all `item_id`s associated with the `user_token` will returned in the response. + * An array of `item_id`s whose payroll information is returned. Each `item_id` should uniquely identify a payroll income item. If this field is not provided, all `item_id`s associated with the `user_token` will be returned in the response. * @type {Array} * @memberof CreditPayrollIncomeGetRequestOptions */ @@ -20886,7 +21411,7 @@ export interface CreditPayrollIncomeRiskSignalsGetRequest { user_id?: string; } /** - * CreditPayrollIncomeRiskSignalsGetRequest defines the response schema for `/credit/payroll_income/risk_signals/get` + * CreditPayrollIncomeRiskSignalsGetResponse defines the response schema for `/credit/payroll_income/risk_signals/get` * @export * @interface CreditPayrollIncomeRiskSignalsGetResponse */ @@ -21300,6 +21825,12 @@ export interface CreditSessionDocumentIncomeResult { * @memberof CreditSessionDocumentIncomeResult */ num_1099s_uploaded: number; + /** + * The number of I-20s uploaded by the user + * @type {number} + * @memberof CreditSessionDocumentIncomeResult + */ + num_i20s_uploaded: number; } /** * The details of a Link error. @@ -21506,7 +22037,7 @@ export interface CreditW2 { */ tax_year: string | null; /** - * An employee identification number or EIN. + * An employer identification number or EIN. * @type {string} * @memberof CreditW2 */ @@ -21652,7 +22183,7 @@ export interface CustomSandboxTransaction { iso_currency_code?: string; } /** - * The object contains a risk score and a risk tier that evaluate the transaction return risk of an unauthorized debit. Common return codes in this category include: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, the customer of financial institutions can dispute a transaction as unauthorized. + * The object contains a risk score and a risk tier that evaluate the transaction return risk of an unauthorized debit. Common return codes in this category include: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, customers of financial institutions can dispute a transaction as unauthorized. * @export * @interface CustomerInitiatedReturnRisk */ @@ -21911,7 +22442,7 @@ export interface DeductionsBreakdown { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof DeductionsBreakdown */ @@ -21942,7 +22473,7 @@ export interface DeductionsTotal { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof DeductionsTotal */ @@ -22121,7 +22652,7 @@ export interface DetectedAccount { total_inflows: number; } /** - * Device Id associated with the device used during the previous link session + * Device ID associated with the device used during the previous Link session * @export * @interface DeviceId */ @@ -22182,7 +22713,7 @@ export interface DistributionBreakdown { */ type?: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof DistributionBreakdown */ @@ -22196,7 +22727,7 @@ export interface DistributionBreakdown { current_pay?: Pay; } /** - * The type of document. `DOCUMENT_TYPE_PAYSTUB`: A paystub. `DOCUMENT_TYPE_BANK_STATEMENT`: A bank statement. `DOCUMENT_TYPE_US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `DOCUMENT_TYPE_US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `DOCUMENT_TYPE_GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `DOCUMENT_TYPE_NONE`: Used to indicate that there is no underlying document for the data. `DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `UNKNOWN`: Document type could not be determined. + * The type of document. `DOCUMENT_TYPE_PAYSTUB`: A paystub. `DOCUMENT_TYPE_BANK_STATEMENT`: A bank statement. `DOCUMENT_TYPE_US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `DOCUMENT_TYPE_US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `DOCUMENT_TYPE_GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `DOCUMENT_TYPE_NONE`: Used to indicate that there is no underlying document for the data. `DOCUMENT_TYPE_US_TAX_1099_MISC`: A Form 1099-MISC information return reporting miscellaneous income. `DOCUMENT_TYPE_US_TAX_1099_K`: A Form 1099-K information return reporting payment card and third-party network transactions. `DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `DOCUMENT_TYPE_US_STUDENT_I20`: A Form I-20 Certificate of Eligibility for Nonimmigrant Student Status. `UNKNOWN`: Document type could not be determined. * @export * @enum {string} */ @@ -22212,7 +22743,8 @@ export declare enum DocType { DocumentTypeNone = "DOCUMENT_TYPE_NONE", DocumentTypeUsTax1099Misc = "DOCUMENT_TYPE_US_TAX_1099_MISC", DocumentTypeUsTax1099K = "DOCUMENT_TYPE_US_TAX_1099_K", - DocumentTypePlaidGeneratedPaystubPdf = "DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF" + DocumentTypePlaidGeneratedPaystubPdf = "DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF", + DocumentTypeUsStudentI20 = "DOCUMENT_TYPE_US_STUDENT_I20" } /** * High level descriptions of how the associated document was processed. If a document fails verification, the details in the `analysis` object should help clarify why the document was rejected. @@ -22581,13 +23113,13 @@ export interface EarningsBreakdown { */ rate?: number | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof EarningsBreakdown */ unofficial_currency_code?: string | null; /** - * The year-to-date amount of the deduction. + * The year-to-date amount of the line item. * @type {number} * @memberof EarningsBreakdown */ @@ -22649,7 +23181,7 @@ export interface EarningsTotal { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof EarningsTotal */ @@ -23016,7 +23548,7 @@ export interface Enhancements { */ website?: string | null; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enhancements */ @@ -23058,7 +23590,7 @@ export interface Enhancements { */ personal_finance_category?: PersonalFinanceCategory | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enhancements */ @@ -23124,7 +23656,7 @@ export interface Enrichments { */ location: Location; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enrichments */ @@ -23154,7 +23686,7 @@ export interface Enrichments { */ personal_finance_category: PersonalFinanceCategory | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof Enrichments */ @@ -23487,7 +24019,7 @@ export interface EntityScreeningStatusUpdatedWebhook { environment: WebhookEnvironmentValues; } /** - * Shorthand identifier for a specific screening list for entities. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_SOE`: State Owned Enterprise List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `US_CAP`: US OFAC Correspondent Account or Payable-Through Account Sanctions `US_FSE`: US OFAC Foreign Sanctions Evaders `US_MBS`: US Non-SDN Menu-Based Sanctions `US_SDN`: US Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `US_CMC`: US OFAC Non-SDN Chinese Military-Industrial Complex List `US_UVL`: Bureau of Industry and Security Unverified List `US_SAM`: US System for Award Management Exclusion List `US_TEL`: US Terrorist Exclusion List `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List + * Shorthand identifier for a specific screening list for entities. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_SOE`: State Owned Enterprise List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `US_CAP`: US OFAC Correspondent Account or Payable-Through Account Sanctions `US_FSE`: US OFAC Foreign Sanctions Evaders `US_MBS`: US Non-SDN Menu-Based Sanctions `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `US_CMC`: US OFAC Non-SDN Chinese Military-Industrial Complex List `US_UVL`: Bureau of Industry and Security Unverified List `US_SAM`: US System for Award Management Exclusion List `US_TEL`: US Terrorist Exclusion List `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List * @export * @enum {string} */ @@ -23997,7 +24529,7 @@ export interface ExtendedRecipientMetadata { */ joined_date: string; /** - * The number of Data Partner consumers that are connected to the recipient for the specific Data Partner + * The number of consumers connected to the recipient through this Data Partner * @type {number} * @memberof ExtendedRecipientMetadata */ @@ -24022,7 +24554,7 @@ export interface ExtendedRecipientMetadataAllOf { */ joined_date: string; /** - * The number of Data Partner consumers that are connected to the recipient for the specific Data Partner + * The number of consumers connected to the recipient through this Data Partner * @type {number} * @memberof ExtendedRecipientMetadataAllOf */ @@ -24512,10 +25044,10 @@ export interface FDXInitiatorFiAttribute { name?: string; /** * - * @type {FDXPartyType} + * @type {string} * @memberof FDXInitiatorFiAttribute */ - value?: FDXPartyType; + value?: string; } /** * Details of consent or payment network identifier or other entity\'s revocation request or other lifecycle status change event @@ -24548,7 +25080,7 @@ export interface FDXLifecycleEvent { */ initiator?: FDXPartyType; /** - * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14) + * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://datatracker.ietf.org/doc/html/rfc3339) * @type {string} * @memberof FDXLifecycleEvent */ @@ -24579,7 +25111,7 @@ export interface FDXNotification { */ subtype?: string; /** - * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14) + * ISO 8601 date-time in format \'YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]\' according to [IETF RFC3339](https://datatracker.ietf.org/doc/html/rfc3339) * @type {string} * @memberof FDXNotification */ @@ -25206,6 +25738,19 @@ export interface GenericScreeningHitLocationItems { */ data?: WatchlistScreeningHitLocations; } +/** + * GetConsentsResponse defines the response schema for `/fdx/consents` + * @export + * @interface GetConsentsResponse + */ +export interface GetConsentsResponse { + /** + * Consent grants matching the customerId (and optional status) filter. + * @type {Array} + * @memberof GetConsentsResponse + */ + consent_grants: Array; +} /** * GetRecipientResponse defines the response schema for `/fdx/recipient/{recipientId}` * @export @@ -25448,7 +25993,7 @@ export interface Holding { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof Holding */ @@ -25951,7 +26496,7 @@ export interface IdentityDocumentUploadRiskSignal { */ type?: string | null; /** - * Indicates whether fraud risk was detected on the field. + * Indicates whether fraud risk was detected for this risk signal. * @type {boolean} * @memberof IdentityDocumentUploadRiskSignal */ @@ -26378,13 +26923,14 @@ export interface IdentityVerification { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerification + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerification */ @@ -26554,7 +27100,7 @@ export interface IdentityVerificationCreateRequest { */ client_user_id?: string; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationCreateRequest */ @@ -26596,14 +27142,14 @@ export interface IdentityVerificationCreateRequest { */ secret?: string; /** - * An optional flag specifying how you would like Plaid to handle attempts to create an Identity Verification when an Identity Verification already exists for the provided `client_user_id` and `template_id`. If idempotency is enabled, Plaid will return the existing Identity Verification. If idempotency is disabled, Plaid will reject the request with a `400 Bad Request` status code if an Identity Verification already exists for the supplied `client_user_id` and `template_id`. + * An optional flag specifying how you would like Plaid to handle attempts to create an Identity Verification when an Identity Verification already exists for the provided `client_user_id` and/or `user_id`, and `template_id`. If idempotency is enabled, Plaid will return the existing Identity Verification. If idempotency is disabled, Plaid will reject the request with a `400 Bad Request` status code if an Identity Verification already exists for the supplied `client_user_id` and/or `user_id`, and `template_id`. * @type {boolean} * @memberof IdentityVerificationCreateRequest */ is_idempotent?: boolean | null; } /** - * User information collected outside of Link, most likely via your own onboarding process. Each of the following identity fields are optional: `email_address` `phone_number` `date_of_birth` `name` `address` `id_number` Specifically, these fields are optional in that they can either be fully provided (satisfying every required field in their subschema) or omitted from the request entirely by not providing the key or value. Providing these fields via the API will result in Link skipping the data collection process for the associated user. All verification steps enabled in the associated Identity Verification Template will still be run. Verification steps will either be run immediately, or once the user completes the `accept_tos` step, depending on the value provided to the `gave_consent` field. If you are not using the shareable URL feature, you can optionally provide these fields via `/link/token/create` instead; both `/identity_verification/create` and `/link/token/create` are valid ways to provide this information. Note that if you provide a non-`null` user data object via `/identity_verification/create`, any user data fields entered via `/link/token/create` for the same `client_user_id` will be ignored when prefilling Link. + * User information collected outside of Link, most likely via your own onboarding process. Each of the following identity fields are optional: `email_address` `phone_number` `date_of_birth` `name` `address` `id_number` Specifically, these fields are optional in that they can either be fully provided (satisfying every required field in their subschema) or omitted from the request entirely by not providing the key or value. Providing these fields via the API will result in Link skipping the data collection process for the associated user. All verification steps enabled in the associated Identity Verification Template will still be run. Verification steps will either be run immediately, or once the user completes the `accept_tos` step, depending on the value provided to the `gave_consent` field. If you are not using the shareable URL feature, you can optionally provide these fields via `/link/token/create` instead; both `/identity_verification/create` and `/link/token/create` are valid ways to provide this information. Note that if you provide a non-`null` user data object via `/identity_verification/create`, any user data fields entered via `/link/token/create` for the same `client_user_id` will be ignored when prefilling Link. The `ip_address` field is optional. Provide the end user\'s IP address to enable IP-based risk checks for backend-only integrations that do not use the Link SDK; when the Link SDK is used, the IP address is collected automatically. Unlike the identity fields above, `ip_address` cannot be provided via `/link/token/create`. * @export * @interface IdentityVerificationCreateRequestUser */ @@ -26651,6 +27197,12 @@ export interface IdentityVerificationCreateRequestUser { * @deprecated */ client_user_id?: string | null; + /** + * An IPv4 or IPv6 address. + * @type {string} + * @memberof IdentityVerificationCreateRequestUser + */ + ip_address?: string | null; } /** * An identity verification attempt represents a customer\'s attempt to verify their identity, reflecting the required steps for completing the session, the results for each step, and information collected in the process. @@ -26755,13 +27307,14 @@ export interface IdentityVerificationCreateResponse { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerificationCreateResponse + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationCreateResponse */ @@ -26969,13 +27522,14 @@ export interface IdentityVerificationGetResponse { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerificationGetResponse + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationGetResponse */ @@ -27030,7 +27584,7 @@ export interface IdentityVerificationListRequest { */ client_user_id?: string; /** - * A unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and the `client_user_id` are present in the request, the `user_id` must have been created from the provided `client_user_id`. + * A unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and the `client_user_id` are present in the request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationListRequest */ @@ -27368,13 +27922,14 @@ export interface IdentityVerificationRetryResponse { */ watchlist_screening_id: string | null; /** - * ID of the associated Beacon User. + * Beacon is deprecated in favor of Plaid Protect. This field is only populated for users of the deprecated Beacon product. * @type {string} * @memberof IdentityVerificationRetryResponse + * @deprecated */ beacon_user_id: string | null; /** - * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025; for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. + * Unique user identifier, created by calling `/user/create`. Either a `user_id` or the `client_user_id` must be provided. The `user_id` may only be used instead of the `client_user_id` if you were not a pre-existing user of `/user/create` as of December 10, 2025, or if you have since [migrated to the new User APIs](https://plaid.com/docs/api/users/migrate-to-new-user-apis); for more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). If both this field and a `client_user_id` are present in a request, the `user_id` must have been created from the provided `client_user_id`. * @type {string} * @memberof IdentityVerificationRetryResponse */ @@ -27818,7 +28373,7 @@ export interface IncomeInsightsFilter { excluded_categories?: Array; } /** - * The version of Income Insights to use. + * The version of Income Insights to use. This value is not shared across API calls for the same resource. If it is omitted from a request, the default version is used, even if a version was set in an earlier call such as `/link/token/create` or `/cra/check_report/create`. * @export * @enum {string} */ @@ -28645,7 +29200,7 @@ export interface IndividualScreeningHitNames { weak_alias_determination: WeakAliasDetermination; } /** - * Shorthand identifier for a specific screening list for individuals. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_CIA`: CIA List of Chiefs of State and Cabinet Members `IZ_IPL`: Interpol Red Notices for Wanted Persons List `IZ_PEP`: Politically Exposed Persons List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List `US_DPL`: Bureau of Industry and Security Denied Persons List `US_DTC`: US Department of State AECA Debarred `US_FBI`: US Department of Justice FBI Wanted List `US_FSE`: US OFAC Foreign Sanctions Evaders `US_ISN`: US Department of State Nonproliferation Sanctions `US_PLC`: US OFAC Palestinian Legislative Council `US_SAM`: US System for Award Management Exclusion List `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `SG_SOF`: Government of Singapore Terrorists and Terrorist Entities `TR_TWL`: Government of Turkey Terrorist Wanted List `TR_DFD`: Government of Turkey Domestic Freezing Decisions `TR_FOR`: Government of Turkey Foreign Freezing Requests `TR_WMD`: Government of Turkey Weapons of Mass Destruction `TR_CMB`: Government of Turkey Capital Markets Board + * Shorthand identifier for a specific screening list for individuals. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_CIA`: CIA List of Chiefs of State and Cabinet Members `IZ_IPL`: Interpol Red Notices for Wanted Persons List `IZ_PEP`: Politically Exposed Persons List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List `US_DPL`: Bureau of Industry and Security Denied Persons List `US_DTC`: US Department of State AECA Debarred `US_FBI`: US Department of Justice FBI Wanted List `US_FSE`: US OFAC Foreign Sanctions Evaders `US_ISN`: US Department of State Nonproliferation Sanctions `US_MBS`: US Non-SDN Menu-Based Sanctions `US_PLC`: US OFAC Palestinian Legislative Council `US_SAM`: US System for Award Management Exclusion List `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `SG_SOF`: Government of Singapore Terrorists and Terrorist Entities `TR_TWL`: Government of Turkey Terrorist Wanted List `TR_DFD`: Government of Turkey Domestic Freezing Decisions `TR_FOR`: Government of Turkey Foreign Freezing Requests `TR_WMD`: Government of Turkey Weapons of Mass Destruction `TR_CMB`: Government of Turkey Capital Markets Board * @export * @enum {string} */ @@ -28732,7 +29287,7 @@ export interface IndividualWatchlistProgram { is_archived: boolean; } /** - * The `inflow_model` allows you to model a test account that receives regular income or make regular payments on a loan. Any transactions generated by the `inflow_model` will appear in addition to randomly generated test data or transactions specified by `override_accounts`. + * The `inflow_model` allows you to model a test account that receives regular income or makes regular payments on a loan. Any transactions generated by the `inflow_model` will appear in addition to randomly generated test data or transactions specified by `override_accounts`. * @export * @interface InflowModel */ @@ -28750,7 +29305,7 @@ export interface InflowModel { */ income_amount: number; /** - * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the income transaction will appear. The name of the income transaction. This field is required if `type` is `monthly-income`, `monthly-balance-payment` or `monthly-interest-only-payment`. + * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the income transaction will appear. This field is required if `type` is `monthly-income`, `monthly-balance-payment` or `monthly-interest-only-payment`. * @type {number} * @memberof InflowModel */ @@ -28762,7 +29317,7 @@ export interface InflowModel { */ transaction_name: string; /** - * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the balance is calculated for the next payment. The name of the income transaction. This field is required if `type` is `monthly-balance-payment` or `monthly-interest-only-payment`. + * Number between 1 and 28, or `last` meaning the last day of the month. The day of the month on which the balance is calculated for the next payment. This field is required if `type` is `monthly-balance-payment` or `monthly-interest-only-payment`. * @type {string} * @memberof InflowModel */ @@ -29738,7 +30293,7 @@ export interface InvestmentTransaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the holding. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof InvestmentTransaction */ @@ -29931,7 +30486,7 @@ export interface InvestmentsAuthDataSources { holdings?: DataSources; } /** - * Identifying information for transferring holdings to an investments account. + * Identifying information for transferring holdings to an investment account. * @export * @interface InvestmentsAuthGetNumbers */ @@ -30061,7 +30616,7 @@ export interface InvestmentsAuthGetResponse { request_id: string; } /** - * Information on the ownership of an investments account + * Information on the ownership of an investment account * @export * @interface InvestmentsAuthOwner */ @@ -30135,7 +30690,7 @@ export interface InvestmentsDefaultUpdateWebhook { environment: WebhookEnvironmentValues; } /** - * Fired after an asynchronous extraction on an investments account. + * Fired after an asynchronous extraction on an investment account. * @export * @interface InvestmentsHistoricalUpdateWebhook */ @@ -30480,7 +31035,7 @@ export interface InvestmentsTransactionsOverride { security?: SecurityOverride; } /** - * Information on an issue encountered with financial institutions interactions with financial institutions during Linking. + * Information on an issue encountered with financial institution interactions during Linking. * @export * @interface Issue */ @@ -31111,7 +31666,7 @@ export interface ItemApplicationScopesUpdateResponse { request_id: string; } /** - * ItemApplicationUnlinkRequest defines the request schema for `/item/application/unlink/` + * ItemApplicationUnlinkRequest defines the request schema for `/item/application/unlink` * @export * @interface ItemApplicationUnlinkRequest */ @@ -31155,7 +31710,7 @@ export interface ItemApplicationUnlinkResponse { request_id: string; } /** - * The method used to populate Auth data for the Item. This field is only populated for Items that have had Auth numbers data set on at least one of its accounts, and will be `null` otherwise. For info about the various flows, see our [Auth coverage documentation](https://plaid.com/docs/auth/coverage/). `INSTANT_AUTH`: The Item\'s Auth data was provided directly by the user\'s institution connection. `INSTANT_MATCH`: The Item\'s Auth data was provided via the Instant Match fallback flow. `AUTOMATED_MICRODEPOSITS`: The Item\'s Auth data was provided via the Automated Micro-deposits flow. `SAME_DAY_MICRODEPOSITS`: The Item\'s Auth data was provided via the Same-Day Micro-deposits flow. `INSTANT_MICRODEPOSITS`: The Item\'s Auth data was provided via the Instant Micro-deposits flow. `DATABASE_MATCH`: The Item\'s Auth data was provided via the Database Match flow. `DATABASE_INSIGHTS`: The Item\'s Auth data was provided via the Database Insights flow. `TRANSFER_MIGRATED`: The Item\'s Auth data was provided via [`/transfer/migrate_account`](https://plaid.com/docs/api/products/transfer/account-linking/#migrate-account-into-transfers). `INVESTMENTS_FALLBACK`: The Item\'s Auth data for Investments Move was provided via a [fallback flow](https://plaid.com/docs/investments-move/#fallback-flows). + * The method used to populate Auth data for the Item. This field is only populated for Items that have had Auth numbers data set on at least one of their accounts, and will be `null` otherwise. For info about the various flows, see our [Auth coverage documentation](https://plaid.com/docs/auth/coverage/). `INSTANT_AUTH`: The Item\'s Auth data was provided directly by the user\'s institution connection. `INSTANT_MATCH`: The Item\'s Auth data was provided via the Instant Match fallback flow. `AUTOMATED_MICRODEPOSITS`: The Item\'s Auth data was provided via the Automated Micro-deposits flow. `SAME_DAY_MICRODEPOSITS`: The Item\'s Auth data was provided via the Same-Day Micro-deposits flow. `INSTANT_MICRODEPOSITS`: The Item\'s Auth data was provided via the Instant Micro-deposits flow. `DATABASE_MATCH`: The Item\'s Auth data was provided via the Database Match flow. `DATABASE_INSIGHTS`: The Item\'s Auth data was provided via the Database Insights flow. `TRANSFER_MIGRATED`: The Item\'s Auth data was provided via [`/transfer/migrate_account`](https://plaid.com/docs/api/products/transfer/account-linking/#migrate-account-into-transfers). `INVESTMENTS_FALLBACK`: The Item\'s Auth data for Investments Move was provided via a [fallback flow](https://plaid.com/docs/investments-move/#fallback-flows). * @export * @enum {string} */ @@ -31464,13 +32019,6 @@ export interface ItemProductReadyWebhook { */ environment: WebhookEnvironmentValues; } -/** - * The reason for terminating products on the Item. - * @export - * @interface ItemProductsTerminateReasonCode - */ -export interface ItemProductsTerminateReasonCode { -} /** * ItemProductsTerminateRequest defines the request schema for `/item/products/terminate` * @export @@ -31497,10 +32045,10 @@ export interface ItemProductsTerminateRequest { access_token: string; /** * - * @type {ItemProductsTerminateReasonCode} + * @type {ProductsTerminateReasonCode} * @memberof ItemProductsTerminateRequest */ - reason_code: ItemProductsTerminateReasonCode; + reason_code: ProductsTerminateReasonCode; /** * Additional context or details about the reason for terminating products on the Item. Personally identifiable information, such as an email address or phone number, should not be included in the `reason_note`. * @type {string} @@ -31748,7 +32296,7 @@ export interface ItemStatusLastWebhook { code_sent?: string; } /** - * Information about the last successful and failed transactions update for the Item. + * An object with information about the status of the Item. * @export * @interface ItemStatusNullable */ @@ -33026,7 +33574,7 @@ export interface LinkDeliveryGetRequest { link_delivery_session_id: string; } /** - * LinkDeliveryGetRequest defines the response schema for `/link_delivery/get` + * LinkDeliveryGetResponse defines the response schema for `/link_delivery/get` * @export * @interface LinkDeliveryGetResponse */ @@ -33088,7 +33636,7 @@ export interface LinkDeliveryInstitution { institution_id?: string; } /** - * Information related to the related to the delivery of the link session to users + * Information related to the delivery of the link session to users * @export * @interface LinkDeliveryMetadata */ @@ -33310,7 +33858,7 @@ export interface LinkEventMetadata { */ match_reason?: string; /** - * The routing number submitted by user at the micro-deposits routing number pane. Emitted by `SUBMIT_ROUTING_NUMBER`. + * The routing number submitted by the user at the micro-deposits routing number pane. Emitted by `SUBMIT_ROUTING_NUMBER`. * @type {string} * @memberof LinkEventMetadata */ @@ -33391,6 +33939,12 @@ export interface LinkEventsWebhook { * @memberof LinkEventsWebhook */ link_token: string; + /** + * + * @type {WebhookEnvironmentValues} + * @memberof LinkEventsWebhook + */ + environment: WebhookEnvironmentValues; } /** * LinkOAuthCorrelationIdExchangeRequest defines the request schema for `/link/oauth/correlation_id/exchange` @@ -33487,7 +34041,7 @@ export interface LinkSessionBankIncomeResult { institution: LinkSessionSuccessMetadataInstitution | null; } /** - * The details of a document upload CRA session in link + * The details of a document upload CRA session in Link * @export * @interface LinkSessionCraDocumentUploadResult */ @@ -34166,7 +34720,7 @@ export interface LinkTokenCreateRequest { */ user_id?: string; /** - * List of Plaid product(s) that the linked Item must support. If launching Link in update mode, should be omitted (unless you are using update mode to add a credit product, such as Assets, Statements, Income, or Plaid Check Consumer Report, to an existing Item); at least one `product` is required otherwise. To maximize the number of institutions and accounts available, initialize Link with the minimal product set required for your use case, as the products specified will limit which institutions and account types will be available to your users in Link. Only institutions that support *all* requested products can be selected; if a user attempts to select an institution that does not support a listed product, a \"Connectivity not supported\" error message will appear in Link. For each specified product, the Item connected by the user must contain at least one compatible account. For details on compatible product / account type combinations, see [the account type/product support matrix](https://plaid.com/docs/api/accounts/#account-type--product-support-matrix). To add products without limiting the institution list or account types, use the [`optional_products`](https://plaid.com/docs/api/link/#link-token-create-request-optional-products) or [`required_if_supported_products`](https://plaid.com/docs/api/link/#link-token-create-request-required-if-supported-products) fields. Products can also be added to an Item by calling the product endpoint after obtaining an access token; this may require the product to be listed in the [`additional_consented_products`](https://plaid.com/docs/api/link/#link-token-create-request-additional-consented-products) array. For details, see [Choosing when to initialize products](https://plaid.com/docs/link/initializing-products/). `balance` is *not* a valid value, the Balance product does not require explicit initialization and will automatically be initialized when any other product is initialized. If launching Link with CRA products, `cra_base_reports` is required and must be included in the `products` array. Note that, unless you have opted to disable Instant Match support, institutions that support Instant Match will also be shown in Link if `auth` is specified as a product, even though these institutions do not contain `auth` in their product array. In Production, you will be billed for each product that you specify when initializing Link. Note that a product cannot be removed from an Item once the Item has been initialized with that product. To stop billing on an Item for subscription-based products, such as Liabilities, Investments, and Transactions, remove the Item via `/item/remove`. + * List of Plaid product(s) that the linked Item must support. If launching Link in update mode, should be omitted (unless you are using update mode to add a credit product, such as Assets, Statements, Income, or Plaid Check Consumer Report, to an existing Item); at least one `product` is required otherwise. To maximize the number of institutions and accounts available, initialize Link with the minimal product set required for your use case, as the products specified will limit which institutions and account types will be available to your users in Link. Only institutions that support *all* requested products can be selected; if a user attempts to select an institution that does not support a listed product, a \"Connectivity not supported\" error message will appear in Link. For each specified product, the Item connected by the user must contain at least one compatible account. For details on compatible product / account type combinations, see [the account type/product support matrix](https://plaid.com/docs/api/accounts/#account-type--product-support-matrix). To add products without limiting the institution list or account types, use the [`optional_products`](https://plaid.com/docs/api/link/#link-token-create-request-optional-products) or [`required_if_supported_products`](https://plaid.com/docs/api/link/#link-token-create-request-required-if-supported-products) fields. Products can also be added to an Item by calling the product endpoint after obtaining an access token; this may require the product to be listed in the [`additional_consented_products`](https://plaid.com/docs/api/link/#link-token-create-request-additional-consented-products) array. For details, see [Choosing when to initialize products](https://plaid.com/docs/link/initializing-products/). `balance` is *not* a valid value, the Balance product does not require explicit initialization and will automatically be initialized when any other product is initialized. If launching Link with CRA products, `cra_base_report` is required and must be included in the `products` array. Note that, unless you have opted to disable Instant Match support, institutions that support Instant Match will also be shown in Link if `auth` is specified as a product, even though these institutions do not contain `auth` in their product array. In Production, you will be billed for each product that you specify when initializing Link. Note that a product cannot be removed from an Item once the Item has been initialized with that product. To stop billing on an Item for subscription-based products, such as Liabilities, Investments, and Transactions, remove the Item via `/item/remove`. * @type {Array} * @memberof LinkTokenCreateRequest */ @@ -34500,7 +35054,7 @@ export interface LinkTokenCreateRequestAuth { */ database_match_enabled?: boolean; /** - * Database Insights has been deprecated and replaced with Database Auth. Use the [Account Verification Dashboard](https://dashboard.plaid.com/account-verification) to enable Database Auth. + * Database Insights has been deprecated and replaced with Database Auth. Use the [Account Verification Dashboard](https://dashboard.plaid.com/account-verification) to enable Database Auth. In Canada, Database Auth is in early availability and cannot yet be managed via the Dashboard; it must be enabled by passing `database_insights_enabled: true` in `/link/token/create`. * @type {boolean} * @memberof LinkTokenCreateRequestAuth * @deprecated @@ -34846,7 +35400,7 @@ export interface LinkTokenCreateRequestIncomeVerification { */ asset_report_id?: string; /** - * An array of access tokens corresponding to Items that a user has previously connected with. Data from these institutions will be cross-referenced with document data received during the Document Income flow to help verify that the uploaded documents are accurate. If the `transactions` product was not initialized for these Items during link, it will be initialized after this Link session. This field should only be used with the `payroll` income source type. + * An array of access tokens corresponding to Items that a user has previously connected with. Data from these institutions will be cross-referenced with document data received during the Document Income flow to help verify that the uploaded documents are accurate. If the `transactions` product was not initialized for these Items during Link, it will be initialized after this Link session. This field should only be used with the `payroll` income source type. * @type {Array} * @memberof LinkTokenCreateRequestIncomeVerification */ @@ -35565,7 +36119,7 @@ export interface LoanDisbursementsIndicators { */ monthly_average?: MonthlyAverage | null; /** - * Up to 3 top service providers that the user had the most transactions for in the given time window, in descending order of total spend. If the user has received money from any provider in the given time window, this list will be empty. + * Up to 3 top service providers that the user had the most transactions for in the given time window, in descending order of total spend. If the user has not received money from any provider in the given time window, this list will be empty. * @type {Array} * @memberof LoanDisbursementsIndicators */ @@ -35855,7 +36409,7 @@ export interface MFA { */ selection_rounds: number; /** - * Number of available answers per question, used if `type` is `selection`. Defaults to 2. + * Number of available answers per question, used if `type` is `selections`. Defaults to 2. * @type {number} * @memberof MFA */ @@ -36495,7 +37049,7 @@ export interface NetPay { */ iso_currency_code?: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof NetPay */ @@ -36712,7 +37266,7 @@ export interface Numbers { bacs_sort_code?: string; } /** - * Identifying information for transferring holdings to an investments account via ACATS. + * Identifying information for transferring holdings to an investment account via ACATS. * @export * @interface NumbersACATS */ @@ -36749,7 +37303,7 @@ export interface NumbersACH { */ account_id: string; /** - * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive \"tokenized\" routing and account numbers, which are not the user\'s actual account and routing numbers. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive a \"tokenized\" account number, which is not the user\'s actual account number. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACH */ @@ -36761,7 +37315,7 @@ export interface NumbersACH { */ is_tokenized_account_number?: boolean; /** - * The ACH routing number for the account. This may be a tokenized routing number. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH routing number for the account. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACH */ @@ -36798,7 +37352,7 @@ export interface NumbersACHNullable { */ account_id: string; /** - * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive \"tokenized\" routing and account numbers, which are not the user\'s actual account and routing numbers. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH account number for the account. At certain institutions, including Chase, PNC, and US Bank, you will receive a \"tokenized\" account number, which is not the user\'s actual account number. For important details on how this may impact your integration and on how to avoid fraud, user confusion, and ACH returns, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACHNullable */ @@ -36810,7 +37364,7 @@ export interface NumbersACHNullable { */ is_tokenized_account_number?: boolean; /** - * The ACH routing number for the account. This may be a tokenized routing number. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). + * The ACH routing number for the account. For more information, see [Tokenized account numbers](https://plaid.com/docs/auth/#tokenized-account-numbers). * @type {string} * @memberof NumbersACHNullable */ @@ -36835,7 +37389,7 @@ export interface NumbersACHNullable { can_transfer_out?: boolean | null; } /** - * Identifying information for transferring holdings to an investments account via ATON. + * Identifying information for transferring holdings to an investment account via ATON. * @export * @interface NumbersATON */ @@ -37164,7 +37718,7 @@ export interface OAuthIntrospectResponse { */ active: boolean; /** - * A JSON string containing a space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` grant type. `mcp:dashboard` allows access to the MCP dashboard server. + * A space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` subject token type. `mcp:dashboard` allows access to the MCP dashboard server. * @type {string} * @memberof OAuthIntrospectResponse */ @@ -37309,7 +37863,7 @@ export interface OAuthTokenRequest { */ secret?: string; /** - * A JSON string containing a space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` grant type. `mcp:dashboard` allows access to the MCP dashboard server. + * A space-separated list of scopes associated with this token, in the format described in [https://datatracker.ietf.org/doc/html/rfc6749#section-3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3). Currently accepted values are: `user:read` allows reading user data. `user:write` allows writing user data. `exchange` allows exchanging a token using the `urn:plaid:params:oauth:user-token` subject token type. `mcp:dashboard` allows access to the MCP dashboard server. * @type {string} * @memberof OAuthTokenRequest */ @@ -37364,7 +37918,7 @@ export interface OAuthTokenResponse { */ refresh_token: string; /** - * Type of token the access token is. Currently it is always Bearer + * The type of the returned token. `Bearer` for OAuth access tokens. * @type {string} * @memberof OAuthTokenResponse */ @@ -37544,7 +38098,7 @@ export declare enum OverrideAccountType { Other = "other" } /** - * Data to use to set values of test accounts. Some values cannot be specified in the schema and will instead will be calculated from other test data in order to achieve more consistent, realistic test data. + * Data to use to set values of test accounts. Some values cannot be specified in the schema and will instead be calculated from other test data in order to achieve more consistent, realistic test data. * @export * @interface OverrideAccounts */ @@ -38640,7 +39194,7 @@ export interface PartnerEndCustomerWithSecretsAllOf { secrets?: PartnerEndCustomerSecrets; } /** - * A collection of information about a single party to a transaction. Included direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. + * A collection of information about a single party to a transaction. Includes direct participants like the borrower and seller as well as indirect participants such as the flood certificate provider. * @export * @interface Party */ @@ -38830,7 +39384,7 @@ export interface PayStubDeductionsBreakdown { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubDeductionsBreakdown */ @@ -38861,7 +39415,7 @@ export interface PayStubDeductionsTotal { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubDeductionsTotal */ @@ -38916,7 +39470,7 @@ export interface PayStubDistributionBreakdown { */ type: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubDistributionBreakdown */ @@ -38965,13 +39519,13 @@ export interface PayStubEarningsBreakdown { */ rate: number | null; /** - * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubEarningsBreakdown */ unofficial_currency_code: string | null; /** - * The year-to-date amount of the deduction. + * The year-to-date amount of the line item. * @type {number} * @memberof PayStubEarningsBreakdown */ @@ -39002,7 +39556,7 @@ export interface PayStubEarningsTotal { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the line item. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubEarningsTotal */ @@ -39075,7 +39629,7 @@ export interface PayStubPayPeriodDetails { */ start_date: string | null; /** - * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the net pay. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof PayStubPayPeriodDetails */ @@ -39644,7 +40198,7 @@ export interface PaymentInitiationConsentPayerDetails { emails?: Array; } /** - * The counterparty\'s bank account numbers. Exactly one of IBAN or Bacs data is required. + * The payer\'s bank account numbers. Exactly one of IBAN or Bacs data is required. * @export * @interface PaymentInitiationConsentPayerNumbers */ @@ -39988,7 +40542,7 @@ export interface PaymentInitiationPayment { */ adjusted_reference?: string | null; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof PaymentInitiationPayment */ @@ -40222,7 +40776,7 @@ export interface PaymentInitiationPaymentGetResponse { */ adjusted_reference?: string | null; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof PaymentInitiationPaymentGetResponse */ @@ -40787,7 +41341,7 @@ export interface PaymentInitiationStandingOrderMetadata { valid_standing_order_intervals: Array; } /** - * Transaction information specific to inter-bank transfers. If the transaction was not an inter-bank transfer, all fields will be `null`. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, the `payment_meta` key will always appear, but no data elements are guaranteed. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * Transaction information specific to inter-bank transfers. If the transaction was not an inter-bank transfer, all fields will be `null`. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, the `payment_meta` key will always appear, but no data elements are guaranteed. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @export * @interface PaymentMeta */ @@ -41011,7 +41565,7 @@ export declare enum PaymentScheme { SepaCreditTransferInstant = "SEPA_CREDIT_TRANSFER_INSTANT" } /** - * Fired when the status of a payment has changed. For a full explanation of payment statuses and how to handle each, see the [Payment Status guide](https://plaid.com/docs/payment-initiation/payment-status/). Note: Plaid payment statuses do not constitute proof that funds have arrived in the recipient\'s account. Do not use `new_payment_status` to confirm fund settlement. + * Fired when the status of a payment has changed. For a full explanation of payment statuses and how to handle each, see the [Payment Status guide](https://plaid.com/docs/payment-initiation/payment-status/). Note: For standard Payment Initiation, Plaid payment statuses do not constitute proof that funds have arrived in the recipient\'s account, and you should not use `new_payment_status` to confirm fund settlement. For options that provide confirmation of fund receipt, see [Virtual Accounts](https://plaid.com/docs/payment-initiation/virtual-accounts/payment-confirmation/). * @export * @interface PaymentStatusUpdateWebhook */ @@ -41150,6 +41704,12 @@ export interface PayrollIncomeObject { * @memberof PayrollIncomeObject */ form1099s: Array; + /** + * Array of Form I-20 US immigration student documents. + * @type {Array} + * @memberof PayrollIncomeObject + */ + i20s: Array; } /** * An object representing the rate at which an individual is paid. @@ -41393,7 +41953,7 @@ export interface PaystubAddress { */ export interface PaystubDeduction { /** - * The description of the deduction, as provided on the paystub. For example: `\"401(k)\"`, `\"FICA MED TAX\"`. + * The type of the deduction, as provided on the paystub. For example: `\"401(k)\"`, `\"FICA MED TAX\"`. * @type {string} * @memberof PaystubDeduction */ @@ -41697,7 +42257,7 @@ export interface PaystubOverrideEarningsBreakdown { */ rate?: number | null; /** - * The year-to-date amount of the deduction. + * The year-to-date amount of the line item. * @type {number} * @memberof PaystubOverrideEarningsBreakdown */ @@ -42116,7 +42676,7 @@ export interface PersonalFinanceCategory { version?: PersonalFinanceCategoryVersion; } /** - * Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 2025, you may only receive the `v2` taxonomy. + * Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 3, 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 3, 2025, you may only receive the `v2` taxonomy. * @export * @enum {string} */ @@ -42344,7 +42904,7 @@ export interface PlaidError { */ error_code: string; /** - * The specific reason for the error code. Currently, reasons are only supported OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. + * The specific reason for the error code. Currently, reasons are only supported for OAuth-based item errors; `null` will be returned otherwise. Safe for programmatic use. Possible values: `OAUTH_INVALID_TOKEN`: The user\'s OAuth connection to this institution has been invalidated. `OAUTH_CONSENT_EXPIRED`: The user\'s access consent for this OAuth connection to this institution has expired. `OAUTH_USER_REVOKED`: The user\'s OAuth connection to this institution is invalid because the user revoked their connection. * @type {string} * @memberof PlaidError */ @@ -42434,7 +42994,20 @@ export declare enum PlaidErrorType { CheckReportError = "CHECK_REPORT_ERROR", ConsumerReportError = "CONSUMER_REPORT_ERROR", UserError = "USER_ERROR", - IdempotencyError = "IDEMPOTENCY_ERROR" + IdempotencyError = "IDEMPOTENCY_ERROR", + AssetsError = "ASSETS_ERROR", + CraMonitoringError = "CRA_MONITORING_ERROR", + CreditProfileReportError = "CREDIT_PROFILE_REPORT_ERROR", + EncompassError = "ENCOMPASS_ERROR", + EnrichError = "ENRICH_ERROR", + FraudInsightsError = "FRAUD_INSIGHTS_ERROR", + FreddieMacError = "FREDDIE_MAC_ERROR", + LinkDeliveryError = "LINK_DELIVERY_ERROR", + ProfileError = "PROFILE_ERROR", + RecurringTransactionsError = "RECURRING_TRANSACTIONS_ERROR", + StatementsError = "STATEMENTS_ERROR", + TransferRecurringError = "TRANSFER_RECURRING_ERROR", + TransferRefundError = "TRANSFER_REFUND_ERROR" } /** * The version of the LendScore to use. Required if using LendScore. @@ -43579,7 +44152,7 @@ export interface ProcessorInvestmentsTransactionsGetRequest { end_date: string; } /** - * ProcessorInvestmentsTransactionsGetRequest defines the response schema for `/processor/investments/transactions/get` + * ProcessorInvestmentsTransactionsGetResponse defines the response schema for `/processor/investments/transactions/get` * @export * @interface ProcessorInvestmentsTransactionsGetResponse */ @@ -43862,7 +44435,7 @@ export interface ProcessorSignalEvaluateRequest { */ is_recurring?: boolean | null; /** - * The default ACH or non-ACH payment method to complete the transaction. `SAME_DAY_ACH`: Same Day ACH by Nacha. The debit transaction is processed and settled on the same day. `STANDARD_ACH`: Standard ACH by Nacha. `MULTIPLE_PAYMENT_METHODS`: If there is no default debit rail or there are multiple payment methods. Possible values: `SAME_DAY_ACH`, `STANDARD_ACH`, `MULTIPLE_PAYMENT_METHODS` + * The default ACH payment method to complete the transaction. `SAME_DAY_ACH`: Same Day ACH by Nacha. The debit transaction is processed and settled on the same day. `STANDARD_ACH`: Standard ACH by Nacha. `MULTIPLE_PAYMENT_METHODS`: If there is no default debit rail or there are multiple payment methods. Possible values: `SAME_DAY_ACH`, `STANDARD_ACH`, `MULTIPLE_PAYMENT_METHODS` * @type {string} * @memberof ProcessorSignalEvaluateRequest */ @@ -44068,7 +44641,7 @@ export interface ProcessorStripeBankAccountTokenCreateResponse { request_id: string; } /** - * This webhook is only sent to [Plaid processor partners](https://plaid.com/docs/auth/partnerships/). Fired when an Item\'s transactions change. This can be due to any event resulting in new changes, such as an initial 30-day transactions fetch upon the initialization of an Item with transactions, the backfill of historical transactions that occurs shortly after, or when changes are populated from a regularly-scheduled transactions update job. It is recommended to listen for the `SYNC_UPDATES_AVAILABLE` webhook when using the `/processor/transactions/sync` endpoint. Note that when using `/processor/transactions/sync` the older webhooks `INITIAL_UPDATE`, `HISTORICAL_UPDATE`, `DEFAULT_UPDATE`, and `TRANSACTIONS_REMOVED`, which are intended for use with `/processor/transactions/get`, will also continue to be sent in order to maintain backwards compatibility. It is not necessary to listen for and respond to those webhooks when using `/processor/transactions/sync`. After receipt of this webhook, the new changes can be fetched for the Item from `/processor/transactions/sync`. Note that to receive this webhook for an Item, `/processor/transactions/sync` must have been called at least once on that Item. This means that, unlike the `INITIAL_UPDATE` and `HISTORICAL_UPDATE` webhooks, it will not fire immediately upon Item creation. If `/transactions/sync` is called on an Item that was *not* initialized with Transactions, the webhook will fire twice: once the first 30 days of transactions data has been fetched, and a second time when all available historical transactions data has been fetched. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic transactions data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. + * This webhook is only sent to [Plaid processor partners](https://plaid.com/docs/auth/partnerships/). Fired when an Item\'s transactions change. This can be due to any event resulting in new changes, such as an initial 30-day transactions fetch upon the initialization of an Item with transactions, the backfill of historical transactions that occurs shortly after, or when changes are populated from a regularly-scheduled transactions update job. It is recommended to listen for the `SYNC_UPDATES_AVAILABLE` webhook when using the `/processor/transactions/sync` endpoint. Note that when using `/processor/transactions/sync` the older webhooks `INITIAL_UPDATE`, `HISTORICAL_UPDATE`, `DEFAULT_UPDATE`, and `TRANSACTIONS_REMOVED`, which are intended for use with `/processor/transactions/get`, will also continue to be sent in order to maintain backwards compatibility. It is not necessary to listen for and respond to those webhooks when using `/processor/transactions/sync`. After receipt of this webhook, the new changes can be fetched for the Item from `/processor/transactions/sync`. Note that to receive this webhook for an Item, `/processor/transactions/sync` must have been called at least once on that Item. This means that, unlike the `INITIAL_UPDATE` and `HISTORICAL_UPDATE` webhooks, it will not fire immediately upon Item creation. If `/processor/transactions/sync` is called on an Item that was *not* initialized with Transactions, the webhook will fire twice: once the first 30 days of transactions data has been fetched, and a second time when all available historical transactions data has been fetched. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic transactions data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. * @export * @interface ProcessorSyncUpdatesAvailableWebhook */ @@ -44229,7 +44802,8 @@ export declare enum ProcessorTokenCreateRequestProcessorEnum { Atomicfi = "atomicfi", Pay = "pay", Natural = "natural", - Kanmon = "kanmon" + Kanmon = "kanmon", + Kick = "kick" } /** * ProcessorTokenCreateResponse defines the response schema for `/processor/token/create` and `/processor/apex/processor_token/create` @@ -44583,7 +45157,7 @@ export interface ProcessorTransactionsRecurringGetRequest { */ export interface ProcessorTransactionsRecurringGetResponse { /** - * An array of depository transaction streams. + * An array of inflow transaction streams. * @type {Array} * @memberof ProcessorTransactionsRecurringGetResponse */ @@ -44793,7 +45367,7 @@ export interface ProcessorTransactionsSyncResponse { request_id: string; } /** - * The product access being requested. Used to or disallow product access across all accounts. If unset, defaults to all products allowed. + * The product access being requested. Used to allow or disallow product access across all accounts. If unset, defaults to all products allowed. * @export * @interface ProductAccess */ @@ -44951,7 +45525,7 @@ export declare enum ProductStatusStatusEnum { Down = "DOWN" } /** - * A detailed breakdown of the institution\'s performance for a request type. The values for `success`, `error_plaid`, and `error_institution` sum to 1. The time range used for calculating the breakdown may range from the most recent few minutes to the past six hours. In general, smaller institutions will show status that was calculated over a longer period of time. For Investment updates, which are refreshed less frequently, the period assessed may be 24 hours or more. For more details, see [Institution status details](https://plaid.com/docs/account/activity/#institution-status-details). + * A detailed breakdown of the institution\'s performance for a request type. The values for `success`, `error_plaid`, and `error_institution` sum to 1. The time range used for calculating the breakdown may range from the most recent few minutes to the past six hours. In general, smaller institutions will show status that was calculated over a longer period of time. For Investment updates, which are refreshed less frequently, the period assessed may be 24 hours or more. For more details, see [Institution status details](https://plaid.com/docs/account/activity/#troubleshooting-institution-insights). * @export * @interface ProductStatusBreakdown */ @@ -45037,7 +45611,7 @@ export declare enum Products { ProtectTransactions = "protect_transactions" } /** - * The reason for terminating products. `FRAUD_FIRST_PARTY`: The end user who owns the connected bank account committed fraud `FRAUD_FALSE_IDENTITY`: The end user created the connection using false identity information or stolen credentials `FRAUD_ABUSE`: The end user is abusing the client\'s service or platform through their connected account `FRAUD_OTHER`: Other fraud-related reasons involving the end user not covered by the specific fraud categories `FRAUD_TRANSACTION`: Fraud occurred at the transaction level, such as an unauthorized transaction, card testing, chargeback, ACH return, or dispute `CONSUMER_LOAN_PAID_OFF`: The end user paid off their loan and no longer needs the product `CONSUMER_ACCOUNT_CLOSED`: The end user closed their account with the client and no longer needs the product `CONSUMER_CHARGE_OFF`: The end user\'s account has been charged off `CONSUMER_PAYMENT_METHOD_SWITCHED`: The end user switched to a different payment method and no longer needs the product `USER_OFFBOARDING`: The user is offboarding from the service or platform `DUPLICATE_ITEM`: The connection is a duplicate of another existing connection for the same user `BILLING_TERMINATION`: The user\'s billing or subscription relationship has ended `OTHER`: Any other reason for terminating products not covered by the above categories + * The reason for terminating products. `FRAUD_FIRST_PARTY`: The end user who owns the connected bank account committed fraud using their real identity `FRAUD_FALSE_IDENTITY`: The connection was created using a false or stolen identity `FRAUD_ABUSE`: The end user is abusing the client\'s service or platform (for example, automation or excessive retries) through their connected account `FRAUD_OTHER`: Fraud-related, but not covered by the specific fraud categories above; `reason_note` should clarify `FRAUD_TRANSACTION`: Fraud occurred at the transaction level, such as an unauthorized transaction, card testing, chargeback, ACH return, or dispute `CONSUMER_LOAN_PAID_OFF`: The end user paid off their loan and no longer needs the product `CONSUMER_ACCOUNT_CLOSED`: The end user closed their account with the client and no longer needs the product `CONSUMER_CHARGE_OFF`: The end user\'s account has been charged off `CONSUMER_PAYMENT_METHOD_SWITCHED`: The end user switched to a different payment method and no longer needs the product `USER_OFFBOARDING`: The user is offboarding from the client\'s service or platform `DUPLICATE_ITEM`: This Item is a duplicate of another active Item for the same user `BILLING_TERMINATION`: The client\'s billing or subscription relationship with the end user has ended `OTHER`: None of the above; `reason_note` should clarify * @export * @enum {string} */ @@ -45224,6 +45798,12 @@ export interface ProtectComputeResponse { * @memberof ProtectComputeResponse */ subscores?: ProtectComputeSubscores | null; + /** + * The timestamp when the Trust Index score and fraud attributes were computed, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format, e.g. `\"2017-09-14T14:42:19.350Z\"` + * @type {string} + * @memberof ProtectComputeResponse + */ + timestamp?: string | null; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -45293,7 +45873,7 @@ export interface ProtectEvent { */ timestamp: string; /** - * If present, contains the current Protect Session ID from the Plaid Pixel SDK. + * If present, contains the current Protect Session ID from the Protect SDK. * @type {string} * @memberof ProtectEvent */ @@ -46138,6 +46718,19 @@ export interface RecaptchaRequiredError { */ troubleshooting_steps?: string; } +/** + * Additional details for receiver events. Currently always `null`. + * @export + * @interface ReceiverDetails + */ +export interface ReceiverDetails { + /** + * The available balance associated with the receiver event. + * @type {string} + * @memberof ReceiverDetails + */ + available_balance: string | null; +} /** * An object containing a Bacs account number and sort code. If an IBAN is not provided or if you need to accept domestic GBP-denominated payments, Bacs data is required. * @export @@ -47964,7 +48557,7 @@ export interface SandboxCraCashflowUpdatesUpdateRequest { user_id?: string; } /** - * SandboxCraCashflowUpdatesUpdateResponse defines the response schema for `sandbox/cashflow_updates/update` + * SandboxCraCashflowUpdatesUpdateResponse defines the response schema for `/sandbox/cra/cashflow_updates/update` * @export * @interface SandboxCraCashflowUpdatesUpdateResponse */ @@ -47976,6 +48569,62 @@ export interface SandboxCraCashflowUpdatesUpdateResponse { */ request_id: string; } +/** + * Request to seed an FDX consent grant, and its backing item, for the given end user and recipient application so the FDX Consent API can be exercised in Sandbox. + * @export + * @interface SandboxFdxConsentSeedRequest + */ +export interface SandboxFdxConsentSeedRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + secret?: string; + /** + * The data provider\'s identifier for the end user to associate the seeded consent grant with. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + customer_id: string; + /** + * This field will map to the application ID that is returned from `/item/application/list`, or provided to the institution in an oauth redirect. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + application_id: string; + /** + * Optional UUIDv4 identifier for the seeded consent grant. If omitted, one is generated. Seeding fails if a grant with this identifier already exists. + * @type {string} + * @memberof SandboxFdxConsentSeedRequest + */ + consent_id?: string; +} +/** + * Response containing the identifier of the seeded FDX consent grant, which can then be listed, retrieved, and revoked through the FDX Consent API. + * @export + * @interface SandboxFdxConsentSeedResponse + */ +export interface SandboxFdxConsentSeedResponse { + /** + * The identifier of the newly seeded FDX consent grant. + * @type {string} + * @memberof SandboxFdxConsentSeedResponse + */ + consent_id: string; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof SandboxFdxConsentSeedResponse + */ + request_id: string; +} /** * SandboxIncomeFireWebhookRequest defines the request schema for `/sandbox/income/fire_webhook` * @export @@ -48283,7 +48932,7 @@ export interface SandboxItemSetVerificationStatusResponse { request_id: string; } /** - * Defines the request schema for `sandbox/oauth/select_accounts` + * Defines the request schema for `/sandbox/oauth/select_accounts` * @export * @interface SandboxOauthSelectAccountsRequest */ @@ -48445,13 +49094,13 @@ export interface SandboxProcessorTokenCreateRequest { */ export interface SandboxProcessorTokenCreateRequestOptions { /** - * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. + * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. You can also use a custom test user — either set this to the username of a custom user configured in the Dashboard, or set it to `user_custom` and pass the JSON-stringified custom user configuration object as `override_password` to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxProcessorTokenCreateRequestOptions */ override_username?: string | null; /** - * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. + * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. You can also use a custom test user — reference one configured in the Dashboard via `override_username`, or set `override_username` to `user_custom` and pass the JSON-stringified custom user configuration object as this field to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxProcessorTokenCreateRequestOptions */ @@ -48551,13 +49200,13 @@ export interface SandboxPublicTokenCreateRequestOptions { */ webhook?: string; /** - * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. + * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. You can also use a custom test user — either set this to the username of a custom user configured in the Dashboard, or set it to `user_custom` and pass the JSON-stringified custom user configuration object as `override_password` to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxPublicTokenCreateRequestOptions */ override_username?: string | null; /** - * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. + * Test password to use for the creation of the Sandbox Item. Default value is `pass_good`. You can also use a custom test user — reference one configured in the Dashboard via `override_username`, or set `override_username` to `user_custom` and pass the JSON-stringified custom user configuration object as this field to define one entirely via API. See [Sandbox Custom Users](https://plaid.com/docs/sandbox/user-custom) for more details. * @type {string} * @memberof SandboxPublicTokenCreateRequestOptions */ @@ -48814,7 +49463,7 @@ export interface SandboxTransferLedgerSimulateAvailableRequest { */ secret?: string; /** - * Specify which ledger balance to simulate converting pending balance to available balance. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to simulate converting pending balance to available balance. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof SandboxTransferLedgerSimulateAvailableRequest */ @@ -49723,7 +50372,7 @@ export interface Security { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the security. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof Security */ @@ -49752,6 +50401,12 @@ export interface Security { * @memberof Security */ cfi_code: string | null; + /** + * 12-character FIGI, a unique Financial Instrument Global Identifier assigned to securities that is immutable and stays consistent across most corporate actions. This is an open data standard issued by the Object Management Group and administered by Bloomberg L.P. + * @type {string} + * @memberof Security + */ + figi: string | null; /** * * @type {OptionContract} @@ -50826,7 +51481,7 @@ export interface SignalEvaluateCoreAttributes { */ p50_eod_balance_31d_to_60d?: number | null; /** - * The 50th percentile of the end-of-day available balance between day 61 and day 90 over the past 60 days of the account that will be debited + * The 50th percentile of the end-of-day available balance between day 61 and day 90 over the past 90 days of the account that will be debited * @type {number} * @memberof SignalEvaluateCoreAttributes */ @@ -50838,7 +51493,7 @@ export interface SignalEvaluateCoreAttributes { */ p90_eod_balance_31d_to_60d?: number | null; /** - * The 90th percentile of the end-of-day available balance between day 61 and day 90 over the past 60 days of the account that will be debited + * The 90th percentile of the end-of-day available balance between day 61 and day 90 over the past 90 days of the account that will be debited * @type {number} * @memberof SignalEvaluateCoreAttributes */ @@ -50850,7 +51505,7 @@ export interface SignalEvaluateCoreAttributes { */ p10_eod_balance_31d_to_60d?: number | null; /** - * The 10th percentile of the end-of-day available balance between day 61 and day 90 over the past 60 days of the account that will be debited + * The 10th percentile of the end-of-day available balance between day 61 and day 90 over the past 90 days of the account that will be debited * @type {number} * @memberof SignalEvaluateCoreAttributes */ @@ -50862,13 +51517,13 @@ export interface SignalEvaluateCoreAttributes { */ transactions_last_updated?: string | null; /** - * Indicates if the receiver bank account is closed + * Indicates if the account that will be debited is closed * @type {boolean} * @memberof SignalEvaluateCoreAttributes */ is_account_closed?: boolean | null; /** - * Indicates if the receiver bank account is either frozen or restricted + * Indicates if the account that will be debited is either frozen or restricted * @type {boolean} * @memberof SignalEvaluateCoreAttributes */ @@ -50989,7 +51644,7 @@ export interface SignalEvaluateRequest { */ account_id: string; /** - * The unique ID that you would like to use to refer to this evaluation attempt - for example, a payment attempt ID. You will use this later to debug this evaluation, and/or report an ACH return, etc. The max length for this field is 36 characters. + * The unique ID that you would like to use to refer to this evaluation attempt - for example, a payment attempt ID. You will use this later to debug this evaluation, and/or report an ACH return, etc. The max length for this field is 36 characters. The `client_transaction_id` also functions as an idempotency key; calling `/signal/evaluate` with a previously used `client_transaction_id` will return the results of the previous evaluation rather than triggering a fresh evaluation. * @type {string} * @memberof SignalEvaluateRequest */ @@ -51201,7 +51856,7 @@ export interface SignalReturnReportRequest { */ secret?: string; /** - * Must be the same as the `client_transaction_id` supplied when calling `/signal/evaluate` or `/accounts/balance/get`. + * Must be the same as the `client_transaction_id` supplied when calling `/signal/evaluate`. * @type {string} * @memberof SignalReturnReportRequest */ @@ -51533,7 +52188,7 @@ export interface SingleDocumentRiskSignal { risk_summary: DocumentRiskSummary; } /** - * A type indicating whether a dashboard user, an API-based user, or Plaid last touched this object. + * A type indicating who or what last touched this object. `dashboard`, `link`, and `api` indicate the originating surface; `system` indicates Plaid. `retro` indicates a screening created retroactively via a bulk screening creation. * @export * @enum {string} */ @@ -51541,7 +52196,8 @@ export declare enum Source { Dashboard = "dashboard", Link = "link", Api = "api", - System = "system" + System = "system", + Retro = "retro" } /** * The schema below describes the various `types` and corresponding `subtypes` that Plaid recognizes and reports for financial institution accounts. For a mapping of supported types and subtypes to Plaid products, see the [Account type / product support matrix](https://plaid.com/docs/api/accounts/#account-type--product-support-matrix). @@ -51791,7 +52447,7 @@ export interface StatementsListResponse { request_id: string; } /** - * The result of the statement refresh extraction `SUCCESS`: The statements were successfully extracted and can be listed via `/statements/list/` and downloaded via `/statements/download/`. `FAILURE`: The statements failed to be extracted. + * The result of the statement refresh extraction `SUCCESS`: The statements were successfully extracted and can be listed via `/statements/list` and downloaded via `/statements/download`. `FAILURE`: The statements failed to be extracted. * @export * @enum {string} */ @@ -51950,7 +52606,7 @@ export interface Statuses { STATUS: Status; } /** - * An instruction specifying what steps the new Identity Verification attempt should require the user to complete: `reset` - Restart the user at the beginning of the session, regardless of whether they successfully completed part of their previous session. `incomplete` - Start the new session at the step that the user failed in the previous session, skipping steps that have already been successfully completed. `infer` - If the most recent Identity Verification attempt associated with the given `client_user_id` has a status of `failed` or `expired`, retry using the `incomplete` strategy. Otherwise, use the `reset` strategy. `custom` - Start the new session with a custom configuration, specified by the value of the `steps` field Note: The `incomplete` strategy cannot be applied if the session\'s failing step is `screening` or `risk_check`. The `infer` strategy cannot be applied if the session\'s status is still `active` + * An instruction specifying what steps the new Identity Verification attempt should require the user to complete: `reset` - Restart the user at the beginning of the session, regardless of whether they successfully completed part of their previous session. `incomplete` - Start the new session at the step that the user failed in the previous session, skipping steps that have already been successfully completed. `infer` - If the most recent Identity Verification attempt associated with the given `client_user_id` has a status of `failed` or `expired`, retry using the `incomplete` strategy. Otherwise, use the `reset` strategy. `custom` - Start the new session with a custom configuration, specified by the value of the `steps` field Note: The `incomplete` strategy cannot be applied if the session\'s failing step is `watchlist_screening` or `risk_check`. The `infer` strategy cannot be applied if the session\'s status is still `active` * @export * @enum {string} */ @@ -52075,7 +52731,7 @@ export interface StudentLoan { */ outstanding_interest_amount: number | null; /** - * The relevant account number that should be used to reference this loan for payments. In the majority of cases, `payment_reference_number` will match `account_number,` but in some institutions, such as Great Lakes (`ins_116861`), it will be different. + * The relevant account number that should be used to reference this loan for payments. In the majority of cases, `payment_reference_number` will match `account_number`, but in some institutions, such as Great Lakes (`ins_116861`), it will be different. * @type {string} * @memberof StudentLoan */ @@ -52217,7 +52873,7 @@ export declare enum StudentRepaymentPlanTypeEnum { IncomeContingentRepayment = "income-contingent repayment", IncomeBasedRepayment = "income-based repayment", IncomeSensitiveRepayment = "income-sensitive repayment", - InterestOnly = "interest-only", + InterestOnly = "interest only", Other = "other", PayAsYouEarn = "pay as you earn", RevisedPayAsYouEarn = "revised pay as you earn", @@ -52601,7 +53257,7 @@ export interface TotalMonthlyIncomeInsights { current_amount: number; } /** - * Total amount of credit transactions into the account in the time period of the report. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the time period of the report. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount */ @@ -52626,7 +53282,7 @@ export interface TotalOutflowAmount { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the account in the last 30 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the last 30 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount30d */ @@ -52651,7 +53307,7 @@ export interface TotalOutflowAmount30d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the account in the last 60 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the last 60 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount60d */ @@ -52676,7 +53332,7 @@ export interface TotalOutflowAmount60d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the account in the last 90 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Total amount of credit transactions out of the account in the last 90 days. This field will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @export * @interface TotalOutflowAmount90d */ @@ -52801,7 +53457,7 @@ export interface TotalReportInflowAmount90d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the time period of the report. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the time period of the report. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount */ @@ -52826,7 +53482,7 @@ export interface TotalReportOutflowAmount { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the last 30 days. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the last 30 days. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount30d */ @@ -52851,7 +53507,7 @@ export interface TotalReportOutflowAmount30d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the last 60 days. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the last 60 days. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount60d */ @@ -52876,7 +53532,7 @@ export interface TotalReportOutflowAmount60d { unofficial_currency_code: string | null; } /** - * Total amount of credit transactions into the report\'s accounts in the last 90 days. This field only takes into account USD transactions from the accounts. + * Total amount of credit transactions out of the report\'s accounts in the last 90 days. This field only takes into account USD transactions from the accounts. * @export * @interface TotalReportOutflowAmount90d */ @@ -52913,7 +53569,7 @@ export interface Transaction { */ account_id: string; /** - * The settled value of the transaction, denominated in the transactions\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. + * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. * @type {number} * @memberof Transaction */ @@ -52925,20 +53581,20 @@ export interface Transaction { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof Transaction */ unofficial_currency_code: string | null; /** - * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {Array} * @memberof Transaction * @deprecated */ category?: Array | null; /** - * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof Transaction * @deprecated @@ -52963,7 +53619,7 @@ export interface Transaction { */ location: Location; /** - * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof Transaction * @deprecated @@ -53019,7 +53675,7 @@ export interface Transaction { */ transaction_type?: TransactionTransactionTypeEnum; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof Transaction */ @@ -53073,7 +53729,7 @@ export interface Transaction { */ transaction_code: TransactionCode | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof Transaction */ @@ -53165,7 +53821,7 @@ export interface TransactionAllOf { */ transaction_code: TransactionCode | null; /** - * The URL of an icon associated with the primary personal finance category. The icon will always be 100×100 pixel PNG file. + * The URL of an icon associated with the primary personal finance category. The icon will always be a 100×100 pixel PNG file. * @type {string} * @memberof TransactionAllOf */ @@ -53211,7 +53867,7 @@ export interface TransactionBase { */ account_id: string; /** - * The settled value of the transaction, denominated in the transactions\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. + * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. For all products except Income: Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. For Income endpoints, values are positive when representing income. * @type {number} * @memberof TransactionBase */ @@ -53223,20 +53879,20 @@ export interface TransactionBase { */ iso_currency_code: string | null; /** - * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s. + * The unofficial currency code associated with the transaction. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s. * @type {string} * @memberof TransactionBase */ unofficial_currency_code: string | null; /** - * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * A hierarchical array of the categories to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {Array} * @memberof TransactionBase * @deprecated */ category?: Array | null; /** - * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The ID of the category to which this transaction belongs. For a full list of categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). All Transactions implementations are recommended to use the new `personal_finance_category` instead of `category`, as it provides greater accuracy and more meaningful categorization. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof TransactionBase * @deprecated @@ -53261,7 +53917,7 @@ export interface TransactionBase { */ location?: Location; /** - * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get/` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. + * The merchant name or transaction description. Note: While Plaid does not currently plan to remove this field, it is a legacy field that is not actively maintained. Use `merchant_name` instead for the merchant name. If the `transactions` object was returned by a Transactions endpoint such as `/transactions/sync` or `/transactions/get`, this field will always appear. If the `transactions` object was returned by an Assets endpoint such as `/asset_report/get` or `/asset_report/pdf/get`, this field will only appear in an Asset Report with Insights. * @type {string} * @memberof TransactionBase * @deprecated @@ -53317,7 +53973,7 @@ export interface TransactionBase { */ transaction_type?: TransactionBaseTransactionTypeEnum; /** - * The URL of a logo associated with this transaction, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with this transaction, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof TransactionBase */ @@ -53340,7 +53996,7 @@ export declare enum TransactionBaseTransactionTypeEnum { Unresolved = "unresolved" } /** - * An identifier classifying the transaction type. This field is populated for European institutions, as well as certain institutions in the United States. For institutions where this classification is not available, this field is set to `null`. `adjustment:` Bank adjustment `atm:` Cash deposit or withdrawal via an automated teller machine `bank charge:` Charge or fee levied by the institution `bill payment`: Payment of a bill `cash:` Cash deposit or withdrawal `cashback:` Cash withdrawal while making a debit card purchase `cheque:` Document ordering the payment of money to another person or organization `direct debit:` Automatic withdrawal of funds initiated by a third party at a regular interval `interest:` Interest earned or incurred `payment:` One-off outbound payment not classified as a bill payment, direct debit, or standing order `purchase:` Purchase made with a debit or credit card `refund:` Merchant credit or return, such as a refund of a prior purchase `standing order:` Payment instructed by the account holder to a third party at a regular interval `transfer:` Transfer of money between accounts + * An identifier classifying the transaction type. This field is populated for European institutions, as well as certain institutions in the United States. For institutions where this classification is not available, this field is set to `null`. `adjustment:` Bank adjustment `atm:` Cash deposit or withdrawal via an automated teller machine `bank charge:` Charge or fee levied by the institution `bill payment`: Payment of a bill `cash:` Cash deposit or withdrawal `cash advance:` Cash advance drawn against a credit card or line of credit `cashback:` Cash withdrawal while making a debit card purchase `cheque:` Document ordering the payment of money to another person or organization `direct debit:` Automatic withdrawal of funds initiated by a third party at a regular interval `interest:` Interest earned or incurred `late fee:` Fee associated with a late or past-due payment `membership fee:` Annual or recurring membership fee `payment:` One-off outbound payment not classified as a bill payment, direct debit, or standing order `purchase:` Purchase made with a debit or credit card `refund:` Merchant credit or return, such as a refund of a prior purchase `returned item fee:` Fee for a returned item, such as a returned check or stop payment `standing order:` Payment instructed by the account holder to a third party at a regular interval `transfer:` Transfer of money between accounts * @export * @enum {string} */ @@ -53350,13 +54006,17 @@ export declare enum TransactionCode { BankCharge = "bank charge", BillPayment = "bill payment", Cash = "cash", + CashAdvance = "cash advance", Cashback = "cashback", Cheque = "cheque", DirectDebit = "direct debit", Interest = "interest", + LateFee = "late fee", + MembershipFee = "membership fee", Payment = "payment", Purchase = "purchase", Refund = "refund", + ReturnedItemFee = "returned item fee", StandingOrder = "standing order", Transfer = "transfer", Null = "null" @@ -53392,7 +54052,7 @@ export interface TransactionCounterparty { */ website: string | null; /** - * The URL of a logo associated with the counterparty, if available. The logo will always be 100×100 pixel PNG file. + * The URL of a logo associated with the counterparty, if available. The logo will always be a 100×100 pixel PNG file. * @type {string} * @memberof TransactionCounterparty */ @@ -53965,7 +54625,7 @@ export interface TransactionsRecurringCreateInput { transaction_ids?: Array; } /** - * TransactionsRecurringCreateRequest defined the request schema for `/transactions/recurring/streams/create` endpoint. + * TransactionsRecurringCreateRequest defines the request schema for `/transactions/recurring/streams/create` endpoint. * @export * @interface TransactionsRecurringCreateRequest */ @@ -54084,7 +54744,7 @@ export interface TransactionsRecurringGetRequestOptions { */ export interface TransactionsRecurringGetResponse { /** - * An array of depository transaction streams. + * An array of inflow transaction streams. * @type {Array} * @memberof TransactionsRecurringGetResponse */ @@ -54128,7 +54788,7 @@ export interface TransactionsRecurringMergeInput { stream_ids: Array; } /** - * TransactionsRecurringMergeRequest defined the request schema for `/transactions/recurring/streams/merge` endpoint. + * TransactionsRecurringMergeRequest defines the request schema for `/transactions/recurring/streams/merge` endpoint. * @export * @interface TransactionsRecurringMergeRequest */ @@ -54184,20 +54844,20 @@ export interface TransactionsRecurringMergeResponse { */ export interface TransactionsRecurringUpdateInput { /** - * ID of the stream that all the transactions will be added in to. + * ID of the stream that all the transactions will be added into. * @type {string} * @memberof TransactionsRecurringUpdateInput */ stream_id: string; /** - * IDs of all the transactions that will be added into the stream. If any transaction currently exist in another stream, it will be removed from the other stream. + * IDs of all the transactions that will be added into the stream. If any transaction currently exists in another stream, it will be removed from the other stream. * @type {Array} * @memberof TransactionsRecurringUpdateInput */ transaction_ids: Array; } /** - * TransactionsRecurringUpdateRequest defined the request schema for `/transactions/recurring/streams/update` endpoint. + * TransactionsRecurringUpdateRequest defines the request schema for `/transactions/recurring/streams/update` endpoint. * @export * @interface TransactionsRecurringUpdateRequest */ @@ -54346,7 +55006,7 @@ export interface TransactionsRuleDetails { */ type: TransactionsRuleType; /** - * For `TRANSACTION_ID` field, provide `transaction_id`. For `NAME` field, provide a string pattern. + * For `TRANSACTION_ID` field, provide `transaction_id`. For `MERCHANT_NAME` field, provide a string pattern. * @type {string} * @memberof TransactionsRuleDetails */ @@ -54371,7 +55031,7 @@ export declare enum TransactionsRuleType { SubstringMatch = "SUBSTRING_MATCH" } /** - * TransactionsRulesCreateRequest defines the request schema for `beta/transactions/rules/v1/create` + * TransactionsRulesCreateRequest defines the request schema for `/beta/transactions/rules/v1/create` * @export * @interface TransactionsRulesCreateRequest */ @@ -54886,7 +55546,7 @@ export interface Transfer { */ standard_return_window: string | null; /** - * The date 61 business days from settlement date indicating the following ACH returns can no longer happen: R05, R07, R10, R11, R51, R33, R37, R38, R51, R52, R53. This will be of the form YYYY-MM-DD. + * The date 61 business days from settlement date indicating the following ACH returns can no longer happen: R05, R07, R10, R11, R51, R33, R37, R38, R52, R53. This will be of the form YYYY-MM-DD. * @type {string} * @memberof Transfer */ @@ -55096,7 +55756,7 @@ export interface TransferAuthorizationCreateRequest { */ funding_account_id?: string | null; /** - * Specify which ledger balance should be used to fund the transfer. You can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance should be used to fund the transfer. You can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferAuthorizationCreateRequest */ @@ -55175,7 +55835,7 @@ export interface TransferAuthorizationCreateRequest { */ user_present?: boolean | null; /** - * If set to `false`, Plaid will not offer a `guarantee_decision` for this request (Guarantee customers only). This field is deprecated in favor for `guarantee`. + * If set to `false`, Plaid will not offer a `guarantee_decision` for this request (Guarantee customers only). This field is deprecated in favor of `guarantee`. * @type {boolean} * @memberof TransferAuthorizationCreateRequest * @deprecated @@ -55191,6 +55851,7 @@ export interface TransferAuthorizationCreateRequest { * The unique identifier returned by Plaid\'s [beacon](https://plaid.com/docs/transfer/guarantee/#using-a-beacon) when it is run on your webpage. * @type {string} * @memberof TransferAuthorizationCreateRequest + * @deprecated */ beacon_session_id?: string | null; /** @@ -55364,7 +56025,7 @@ export interface TransferAuthorizationPaymentRisk { */ bank_initiated_return_score: number | null; /** - * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. The score evaluates the transaction return risk of an unauthorized debit and covers return codes: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, the customer of financial institutions can dispute a transaction as unauthorized. + * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. The score evaluates the transaction return risk of an unauthorized debit and covers return codes: \"R05\", \"R07\", \"R10\", \"R11\", \"R29\". These returns typically have a return time frame of up to 60 calendar days. During this period, customers of financial institutions can dispute a transaction as unauthorized. * @type {number} * @memberof TransferAuthorizationPaymentRisk */ @@ -55531,7 +56192,7 @@ export interface TransferBalance { */ available: string; /** - * The available balance, plus amount of pending funds that in processing (decimal string with two digits of precision e.g. \"10.00\"). + * The available balance, plus the amount of pending funds that are in processing (decimal string with two digits of precision e.g. \"10.00\"). * @type {string} * @memberof TransferBalance */ @@ -56271,6 +56932,12 @@ export interface TransferEvent { * @memberof TransferEvent */ sweep_amount: string | null; + /** + * A signed amount associated with this event (decimal string with two digits of precision e.g. \"10.00\" or \"-10.00\"). + * @type {string} + * @memberof TransferEvent + */ + event_amount?: string | null; /** * Plaid\'s unique identifier for a refund. A non-null value indicates the event is for the associated refund of the transfer. * @type {string} @@ -56480,7 +57147,7 @@ export interface TransferEventSyncResponse { request_id: string; } /** - * The type of event that this transfer represents. Event types with prefix `sweep` represents events for Plaid Ledger sweeps. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer has been successfully completed by the payment network. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `returned`: A posted transfer was returned. `swept`: The transfer was swept to / from the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer\'s business checking account. `return_swept`: Due to the transfer being returned, funds were pulled from or pushed back to the sweep account. `sweep.pending`: A new ledger sweep was created; it is in the pending state. `sweep.posted`: The ledger sweep has been successfully submitted to the payment network. `sweep.settled`: The transaction has settled in the funding account. This means that funds withdrawn from Plaid Ledger balance have reached the funding account, or funds to be deposited into the Plaid Ledger Balance have been pulled, and the hold period has begun. `sweep.returned`: A posted ledger sweep was returned. `sweep.failed`: The ledger sweep failed, no funds were moved. `sweep.funds_available`: Funds from the ledger sweep have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `refund.pending`: A new refund was created; it is in the pending state. `refund.cancelled`: The refund was cancelled. `refund.failed`: The refund failed, no funds were moved. `refund.posted`: The refund has been successfully submitted to the payment network. `refund.settled`: The refund transaction has settled in the Plaid linked account. `refund.returned`: A posted refund was returned. `refund.swept`: The refund was swept from the sweep account. `refund.return_swept`: Due to the refund being returned, funds were pushed back to the sweep account. + * The type of event that this transfer represents. Event types with prefix `sweep` represent events for Plaid Ledger sweeps. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer has been successfully completed by the payment network. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `guaranteed`: The transfer has been fully guaranteed by Plaid. `returned`: A posted transfer was returned. `guarantee_reimbursed`: Plaid reimbursed the client for the loss on a returned guaranteed transfer. The `event_amount` is the reimbursed amount. `client_return_recovered`: The client reported recovering the loss on a returned transfer via `/transfer/return/recover`, and Plaid debited the recovered amount from the client\'s ledger. The `event_amount` is the recovered amount. `plaid_return_recovered`: Plaid recovered the loss on a returned transfer by successfully reinitiating it. The `event_amount` is the recovered amount. Client should stop their return recovery effort. `swept`: The transfer was swept to / from the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer\'s business checking account. `return_swept`: Due to the transfer being returned, funds were pulled from or pushed back to the sweep account. `sweep.pending`: A new ledger sweep was created; it is in the pending state. `sweep.posted`: The ledger sweep has been successfully submitted to the payment network. `sweep.settled`: The transaction has settled in the funding account. This means that funds withdrawn from Plaid Ledger balance have reached the funding account, or funds to be deposited into the Plaid Ledger Balance have been pulled, and the hold period has begun. `sweep.returned`: A posted ledger sweep was returned. `sweep.failed`: The ledger sweep failed, no funds were moved. `sweep.funds_available`: Funds from the ledger sweep have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `refund.pending`: A new refund was created; it is in the pending state. `refund.cancelled`: The refund was cancelled. `refund.failed`: The refund failed, no funds were moved. `refund.posted`: The refund has been successfully submitted to the payment network. `refund.settled`: The refund transaction has settled in the Plaid linked account. `refund.returned`: A posted refund was returned. `refund.swept`: The refund was swept from the sweep account. `refund.return_swept`: Due to the refund being returned, funds were pushed back to the sweep account. * @export * @enum {string} */ @@ -56491,7 +57158,11 @@ export declare enum TransferEventType { Posted = "posted", Settled = "settled", FundsAvailable = "funds_available", + Guaranteed = "guaranteed", Returned = "returned", + GuaranteeReimbursed = "guarantee_reimbursed", + ClientReturnRecovered = "client_return_recovered", + PlaidReturnRecovered = "plaid_return_recovered", Swept = "swept", SweptSettled = "swept_settled", ReturnSwept = "return_swept", @@ -56845,7 +57516,7 @@ export interface TransferIntentCreate { */ user: TransferUserInResponse; /** - * A description for the underlying transfer. Maximum of 8 characters. + * A description for the underlying transfer. Maximum of 15 characters. * @type {string} * @memberof TransferIntentCreate */ @@ -57101,7 +57772,7 @@ export interface TransferIntentGet { */ user: TransferUserInResponse; /** - * A description for the underlying transfer. Maximum of 8 characters. + * A description for the underlying transfer. Maximum of 15 characters. * @type {string} * @memberof TransferIntentGet */ @@ -57258,7 +57929,7 @@ export interface TransferLedgerDepositRequest { */ secret?: string; /** - * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to payout or collect funds. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. + * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to pay out to or collect funds from. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. * @type {string} * @memberof TransferLedgerDepositRequest */ @@ -57270,7 +57941,7 @@ export interface TransferLedgerDepositRequest { */ funding_account_id?: string | null; /** - * Specify which ledger balance to deposit to. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to deposit to. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferLedgerDepositRequest */ @@ -57571,7 +58242,7 @@ export interface TransferLedgerGetRequest { */ secret?: string; /** - * Specify which ledger balance to get. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to get. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferLedgerGetRequest */ @@ -57650,7 +58321,7 @@ export interface TransferLedgerWithdrawRequest { */ secret?: string; /** - * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to payout or collect funds. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. + * Client ID of the customer that owns the Ledger balance. This is so Plaid knows which of your customers to pay out to or collect funds from. Only applicable for [Platform customers](https://plaid.com/docs/transfer/application/#originators-vs-platforms). Do not include if you\'re paying out to yourself. * @type {string} * @memberof TransferLedgerWithdrawRequest */ @@ -57662,7 +58333,7 @@ export interface TransferLedgerWithdrawRequest { */ funding_account_id?: string | null; /** - * Specify which ledger balance to withdraw from. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance. + * Specify which ledger balance to withdraw from. Customers can find a list of `ledger_id`s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to the id of the default ledger balance. * @type {string} * @memberof TransferLedgerWithdrawRequest */ @@ -58017,7 +58688,7 @@ export interface TransferMigrateAccountResponse { request_id: string; } /** - * The network or rails used for the transfer. For transfers submitted as `ach` or `same-day-ach`, the Standard ACH cutoff is 8:30 PM Eastern Time. For transfers submitted as `same-day-ach`, the Same Day ACH cutoff is 3:00 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail. For transfers submitted as `rtp`, Plaid will automatically route between the Real-Time Payments (RTP) rail by TCH or FedNow rails as necessary. If a transfer is submitted as `rtp` and the counterparty account is not eligible for RTP, the `/transfer/authorization/create` request will fail with an `INVALID_FIELD` error code. To pre-check to determine whether a counterparty account can support RTP, call `/transfer/capabilities/get` before calling `/transfer/authorization/create`. Wire transfers are currently in early availability. To request access to `wire` as a payment network, contact your account manager. For transfers submitted as `wire`, the `type` must be `credit`; wire debits are not supported. The cutoff to submit a wire payment is 6:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail. + * The network or rails used for the transfer. For transfers submitted as `ach` or `same-day-ach`, the Standard ACH cutoff is 8:30 PM Eastern Time. For transfers submitted as `same-day-ach`, the Same Day ACH cutoff is 3:00 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail. For transfers submitted as `rtp`, Plaid will automatically route between the Real-Time Payments (RTP) rail by TCH or FedNow rails as necessary. If a transfer is submitted as `rtp` and the counterparty account is not eligible for RTP, the `/transfer/authorization/create` request will fail with an `INVALID_FIELD` error code. To pre-check to determine whether a counterparty account can support RTP, call `/transfer/capabilities/get` before calling `/transfer/authorization/create`. Wire transfers are currently in early availability. To request access to `wire` as a payment network, contact your account manager. For transfers submitted as `wire`, the `type` must be `credit`; wire debits are not supported. The cutoff to submit a wire payment is 6:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail. Support for `rfp` (request for payment) is currently in closed beta. To learn more, contact your Plaid account manager. For transfers submitted as `rfp`, the `type` must be `debit`. * @export * @enum {string} */ @@ -58025,7 +58696,8 @@ export declare enum TransferNetwork { Ach = "ach", SameDayAch = "same-day-ach", Rtp = "rtp", - Wire = "wire" + Wire = "wire", + Rfp = "rfp" } /** * The originator\'s address. @@ -58849,7 +59521,7 @@ export interface TransferRecurringCreateRequest { */ access_token: string; /** - * A random key provided by the client, per unique recurring transfer. Maximum of 50 characters. The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to create a recurring fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single recurring transfer is created. + * A random key provided by the client, per unique recurring transfer. Maximum of 50 characters. The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to create a recurring transfer fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single recurring transfer is created. * @type {string} * @memberof TransferRecurringCreateRequest */ @@ -59285,7 +59957,7 @@ export interface TransferRefundCreateResponse { request_id: string; } /** - * The failure reason if the event type for a refund is `\"failed\"` or `\"returned\"`. Null value otherwise. + * The failure reason if the status for a refund is `\"failed\"` or `\"returned\"`. Null value otherwise. * @export * @interface TransferRefundFailure */ @@ -59547,6 +60219,56 @@ export interface TransferRepaymentReturnListResponse { */ request_id: string; } +/** + * Defines the request schema for `/transfer/return/recover` + * @export + * @interface TransferReturnRecoverRequest + */ +export interface TransferReturnRecoverRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + secret?: string; + /** + * The ID of the returned transfer that was recovered. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + transfer_id: string; + /** + * The amount being recovered (decimal string with two digits of precision e.g. \"10.00\"). The sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + amount: string; + /** + * A random key provided by the client, per unique recovery. Maximum of 50 characters. The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to report a recovery fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single recovery is recorded. + * @type {string} + * @memberof TransferReturnRecoverRequest + */ + idempotency_key: string; +} +/** + * Defines the response schema for `/transfer/return/recover` + * @export + * @interface TransferReturnRecoverResponse + */ +export interface TransferReturnRecoverResponse { + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof TransferReturnRecoverResponse + */ + request_id: string; +} /** * The unit of the recurring interval. * @export @@ -60800,7 +61522,7 @@ export interface UserDataOverview { total_inflows: number; } /** - * UserFinancialDataRefreshRequest defines the request schema for `user/financial_data/refresh` + * UserFinancialDataRefreshRequest defines the request schema for `/user/financial_data/refresh` * @export * @interface UserFinancialDataRefreshRequest */ @@ -60825,7 +61547,7 @@ export interface UserFinancialDataRefreshRequest { secret?: string; } /** - * UserFinancialDataRefreshResponse defines the response schema for `user/financial_data/refresh` + * UserFinancialDataRefreshResponse defines the response schema for `/user/financial_data/refresh` * @export * @interface UserFinancialDataRefreshResponse */ @@ -61161,13 +61883,6 @@ export interface UserPermissionRevokedWebhook { */ environment: WebhookEnvironmentValues; } -/** - * The reason for terminating user-based products. - * @export - * @interface UserProductsTerminateReasonCode - */ -export interface UserProductsTerminateReasonCode { -} /** * UserProductsTerminateRequest defines the request schema for `/user/products/terminate` * @export @@ -61194,10 +61909,10 @@ export interface UserProductsTerminateRequest { user_id: string; /** * - * @type {UserProductsTerminateReasonCode} + * @type {ProductsTerminateReasonCode} * @memberof UserProductsTerminateRequest */ - reason_code: UserProductsTerminateReasonCode; + reason_code: ProductsTerminateReasonCode; /** * Additional context or details about the reason for terminating user-based products. Personally identifiable information, such as an email address or phone number, should not be included in the `reason_note`. * @type {string} @@ -61365,7 +62080,7 @@ export interface UserThirdPartyTokenCreateResponse { third_party_user_token: string; } /** - * UserThirdPartyTokenCreateRequest defines the request schema for `/user/third_party_token/remove` + * UserThirdPartyTokenRemoveRequest defines the request schema for `/user/third_party_token/remove` * @export * @interface UserThirdPartyTokenRemoveRequest */ @@ -61390,7 +62105,7 @@ export interface UserThirdPartyTokenRemoveRequest { third_party_user_token: string; } /** - * UserThirdPartyTokenCreateResponse defines the response schema for `/user/third_party_token/remove` + * UserThirdPartyTokenRemoveResponse defines the response schema for `/user/third_party_token/remove` * @export * @interface UserThirdPartyTokenRemoveResponse */ @@ -61409,7 +62124,7 @@ export interface UserThirdPartyTokenRemoveResponse { request_id: string; } /** - * UserTransactionsRefreshRequest defines the request schema for `user/transactions/refresh` + * UserTransactionsRefreshRequest defines the request schema for `/user/transactions/refresh` * @export * @interface UserTransactionsRefreshRequest */ @@ -61434,7 +62149,7 @@ export interface UserTransactionsRefreshRequest { secret?: string; } /** - * UserTransactionsRefreshResponse defines the response schema for `user/transactions/refresh` + * UserTransactionsRefreshResponse defines the response schema for `/user/transactions/refresh` * @export * @interface UserTransactionsRefreshResponse */ @@ -61702,7 +62417,7 @@ export interface W2 { */ tax_year?: string | null; /** - * An employee identification number or EIN. + * An employer identification number or EIN. * @type {string} * @memberof W2 */ @@ -62401,7 +63116,7 @@ export interface WalletTransaction { */ transaction_id: string; /** - * The EMI (E-Money Institution) wallet that this payment is associated with, if any. This wallet is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. + * The ID of the e-wallet that this transaction is associated with. * @type {string} * @memberof WalletTransaction */ @@ -62449,7 +63164,7 @@ export interface WalletTransaction { */ created_at: string; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof WalletTransaction */ @@ -62733,7 +63448,7 @@ export interface WalletTransactionGetResponse { */ transaction_id: string; /** - * The EMI (E-Money Institution) wallet that this payment is associated with, if any. This wallet is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. + * The ID of the e-wallet that this transaction is associated with. * @type {string} * @memberof WalletTransactionGetResponse */ @@ -62781,7 +63496,7 @@ export interface WalletTransactionGetResponse { */ created_at: string; /** - * The date and time of the last time the `status` was updated, in IS0 8601 format + * The date and time of the last time the `status` was updated, in ISO 8601 format * @type {string} * @memberof WalletTransactionGetResponse */ @@ -62938,7 +63653,7 @@ export declare enum WalletTransactionPayeeVerificationStatus { CheckNotPossible = "CHECK_NOT_POSSIBLE" } /** - * Transactions are related when they have a logical connection. For example, a `PAYOUT` transaction can be returned by the sender, creating a `RETURN` transaction. Each `PAYOUT` transaction can have at most one corresponding `RETURN` transaction in case of reversal. These relationships are bi-directional, meaning that both entities have references to each other. For instance, when a transaction of type RETURN occurs, it is linked to the original transaction being returned. Likewise, the original transaction has a reference back to the RETURN transaction that represents the return. This field is only populated for transactions of type `RETURN`, `FUNDS_SWEEP`, `REFUND` and `PAYOUT`. The relationship between a `PIS_PAY_IN` payment and its corresponding `REFUND` transactions is only available through `refund_ids` property in the payment object. See[`/payment_initiation/payment/get`](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-get-response-refund-ids). + * Transactions are related when they have a logical connection. For example, a `PAYOUT` transaction can be returned by the sender, creating a `RETURN` transaction. Each `PAYOUT` transaction can have at most one corresponding `RETURN` transaction in case of reversal. These relationships are bi-directional, meaning that both entities have references to each other. For instance, when a transaction of type RETURN occurs, it is linked to the original transaction being returned. Likewise, the original transaction has a reference back to the RETURN transaction that represents the return. This field is only populated for transactions of type `RETURN`, `FUNDS_SWEEP`, `REFUND` and `PAYOUT`. The relationship between a `PIS_PAY_IN` payment and its corresponding `REFUND` transactions is only available through the `refund_ids` property in the payment object. See [`/payment_initiation/payment/get`](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-get-response-refund-ids). * @export * @interface WalletTransactionRelation */ @@ -63108,7 +63823,7 @@ export interface Warning { */ warning_type: string; /** - * The warning code identifies a specific kind of warning. `OWNERS_UNAVAILABLE` indicates that account-owner information is not available.`INVESTMENTS_UNAVAILABLE` indicates that Investments specific information is not available. `TRANSACTIONS_UNAVAILABLE` indicates that transactions information associated with Credit and Depository accounts are unavailable. + * The warning code identifies a specific kind of warning. `OWNERS_UNAVAILABLE` indicates that account-owner information is not available. `INVESTMENTS_UNAVAILABLE` indicates that Investments specific information is not available. `TRANSACTIONS_UNAVAILABLE` indicates that transactions information associated with Credit and Depository accounts are unavailable. The `BANK_INCOME_INSIGHTS_*` codes apply to the Bank Income add-on: `BANK_INCOME_INSIGHTS_INSUFFICIENT_DATA` indicates there was not enough data to compute Bank Income Insights; `BANK_INCOME_INSIGHTS_INCOMPLETE` indicates the Bank Income Insights flow was not completed; `BANK_INCOME_INSIGHTS_STATUS_IN_PROGRESS` indicates Bank Income Insights are still being computed; `BANK_INCOME_INSIGHTS_INTERNAL_ERROR` indicates an internal error occurred while computing Bank Income Insights; `BANK_INCOME_INSIGHTS_MISMATCHED_DAYS_REQUESTED` indicates the days requested for Bank Income Insights did not match that of the Asset Report. * @type {string} * @memberof Warning */ @@ -63127,7 +63842,12 @@ export interface Warning { export declare enum WarningWarningCodeEnum { OwnersUnavailable = "OWNERS_UNAVAILABLE", InvestmentsUnavailable = "INVESTMENTS_UNAVAILABLE", - TransactionsUnavailable = "TRANSACTIONS_UNAVAILABLE" + TransactionsUnavailable = "TRANSACTIONS_UNAVAILABLE", + BankIncomeInsightsInsufficientData = "BANK_INCOME_INSIGHTS_INSUFFICIENT_DATA", + BankIncomeInsightsIncomplete = "BANK_INCOME_INSIGHTS_INCOMPLETE", + BankIncomeInsightsStatusInProgress = "BANK_INCOME_INSIGHTS_STATUS_IN_PROGRESS", + BankIncomeInsightsInternalError = "BANK_INCOME_INSIGHTS_INTERNAL_ERROR", + BankIncomeInsightsMismatchedDaysRequested = "BANK_INCOME_INSIGHTS_MISMATCHED_DAYS_REQUESTED" } /** * Information about the last change made to the parent object specifying what caused the change as well as when it occurred. @@ -63194,7 +63914,7 @@ export declare enum WatchlistScreeningDocumentType { VoterId = "voter_id" } /** - * Request input for creating an entity screening review + * Request input for creating an entity watchlist screening * @export * @interface WatchlistScreeningEntityCreateRequest */ @@ -63997,7 +64717,7 @@ export interface WatchlistScreeningHit { data?: ScreeningHitData; } /** - * Location information for the associated individual watchlist hit + * Location information for the associated watchlist hit * @export * @interface WatchlistScreeningHitLocations */ @@ -65103,7 +65823,7 @@ export interface YieldRate { type: YieldRateType | null; } /** - * The type of rate which indicates how the predicted yield was calculated. It is one of: `coupon`: the annualized interest rate for securities with a one-year term or longer, such as treasury notes and bonds. `coupon_equivalent`: the calculated equivalent for the annualized interest rate factoring in the discount rate and time to maturity, for shorter term, non-interest-bearing securities such as treasury bills. `discount`: the rate at which the present value or cost is discounted from the future value upon maturity, also known as the face value. `yield`: the total predicted rate of return factoring in both the discount rate and the coupon rate, applicable to securities such as exchange-traded bonds which can both be interest-bearing as well as sold at a discount off its face value. + * The type of rate which indicates how the predicted yield was calculated. It is one of: `coupon`: the annualized interest rate for securities with a one-year term or longer, such as treasury notes and bonds. `coupon_equivalent`: the calculated equivalent for the annualized interest rate factoring in the discount rate and time to maturity, for shorter term, non-interest-bearing securities such as treasury bills. `discount`: the rate at which the present value or cost is discounted from the future value upon maturity, also known as the face value. `yield`: the total predicted rate of return factoring in both the discount rate and the coupon rate, applicable to securities such as exchange-traded bonds which can both be interest-bearing as well as sold at a discount off their face value. * @export * @enum {string} */ @@ -65192,7 +65912,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ assetReportFilter: (assetReportFilterRequest: AssetReportFilterRequest, options?: any) => Promise; /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -65241,7 +65961,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | authVerify: (authVerifyRequest: AuthVerifyRequest, options?: any) => Promise; /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65249,7 +65969,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferBalanceGet: (bankTransferBalanceGetRequest: BankTransferBalanceGetRequest, options?: any) => Promise; /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65257,7 +65977,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferCancel: (bankTransferCancelRequest: BankTransferCancelRequest, options?: any) => Promise; /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65281,7 +66001,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferEventSync: (bankTransferEventSyncRequest: BankTransferEventSyncRequest, options?: any) => Promise; /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65289,7 +66009,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferGet: (bankTransferGetRequest: BankTransferGetRequest, options?: any) => Promise; /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65297,7 +66017,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferList: (bankTransferListRequest: BankTransferListRequest, options?: any) => Promise; /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65305,7 +66025,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferMigrateAccount: (bankTransferMigrateAccountRequest: BankTransferMigrateAccountRequest, options?: any) => Promise; /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65313,7 +66033,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferSweepGet: (bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any) => Promise; /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65321,7 +66041,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | bankTransferSweepList: (bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any) => Promise; /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65329,7 +66049,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconAccountRiskEvaluate: (beaconAccountRiskEvaluateRequest: BeaconAccountRiskEvaluateRequest, options?: any) => Promise; /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65337,7 +66057,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconDuplicateGet: (beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any) => Promise; /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65345,7 +66065,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconReportCreate: (beaconReportCreateRequest: BeaconReportCreateRequest, options?: any) => Promise; /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65353,7 +66073,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconReportGet: (beaconReportGetRequest: BeaconReportGetRequest, options?: any) => Promise; /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65361,7 +66081,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconReportList: (beaconReportListRequest: BeaconReportListRequest, options?: any) => Promise; /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65369,7 +66089,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconReportSyndicationGet: (beaconReportSyndicationGetRequest: BeaconReportSyndicationGetRequest, options?: any) => Promise; /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65377,15 +66097,15 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconReportSyndicationList: (beaconReportSyndicationListRequest: BeaconReportSyndicationListRequest, options?: any) => Promise; /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserAccountInsightsGet: (beaconUserAccountInsightsGetRequest: BeaconUserAccountInsightsGetRequest, options?: any) => Promise; /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65393,7 +66113,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconUserCreate: (beaconUserCreateRequest: BeaconUserCreateRequest, options?: any) => Promise; /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65401,7 +66121,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconUserGet: (beaconUserGetRequest: BeaconUserGetRequest, options?: any) => Promise; /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65409,15 +66129,15 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | beaconUserHistoryList: (beaconUserHistoryListRequest: BeaconUserHistoryListRequest, options?: any) => Promise; /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserReview: (beaconUserReviewRequest: BeaconUserReviewRequest, options?: any) => Promise; /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65484,7 +66204,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ businessVerificationGet: (businessVerificationGetRequest: BusinessVerificationGetRequest, options?: any) => Promise; /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -65508,7 +66228,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ cashflowReportRefresh: (cashflowReportRefreshRequest: CashflowReportRefreshRequest, options?: any) => Promise; /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -65548,7 +66268,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ craCheckReportBaseReportGet: (craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any) => Promise; /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -65564,15 +66284,15 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ craCheckReportCreate: (craCheckReportCreateRequest: CraCheckReportCreateRequest, options?: any) => Promise; /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportIncomeInsightsGet: (craCheckReportIncomeInsightsGetRequest: CraCheckReportIncomeInsightsGetRequest, options?: any) => Promise; /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -65580,7 +66300,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ craCheckReportLendScoreGet: (craCheckReportLendScoreGetRequest: CraCheckReportLendScoreGetRequest, options?: any) => Promise; /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -65588,7 +66308,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ craCheckReportNetworkInsightsGet: (craCheckReportNetworkInsightsGetRequest: CraCheckReportNetworkInsightsGetRequest, options?: any) => Promise; /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -65692,7 +66412,15 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ craPartnerInsightsGet: (craPartnerInsightsGetRequest: CraPartnerInsightsGetRequest, options?: any) => Promise; /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet: (craReportGetRequest: CraReportGetRequest, options?: any) => Promise; + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -65848,8 +66576,8 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ creditRelayGet: (creditRelayGetRequest: CreditRelayGetRequest, options?: any) => Promise; /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65905,7 +66633,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | dashboardUserList: (dashboardUserListRequest: DashboardUserListRequest, options?: any) => Promise; /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -65927,6 +66655,15 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ fdxConsentsGet: (consentId: string, options?: any) => Promise; + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + fdxConsentsList: (customerId: string, status?: FDXConsentGrantStatus | undefined, options?: any) => Promise; /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -66011,7 +66748,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ identityVerificationAutofillCreate: (identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any) => Promise; /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -66204,7 +66941,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | itemApplicationUnlink: (itemApplicationUnlinkRequest: ItemApplicationUnlinkRequest, options?: any) => Promise; /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66411,7 +67148,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ paymentInitiationConsentRevoke: (paymentInitiationConsentRevokeRequest: PaymentInitiationConsentRevokeRequest, options?: any) => Promise; /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -66419,7 +67156,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ paymentInitiationPaymentCreate: (paymentInitiationPaymentCreateRequest: PaymentInitiationPaymentCreateRequest, options?: any) => Promise; /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -66459,7 +67196,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ paymentInitiationRecipientGet: (paymentInitiationRecipientGetRequest: PaymentInitiationRecipientGetRequest, options?: any) => Promise; /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -66500,7 +67237,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | processorAccountGet: (processorAccountGetRequest: ProcessorAccountGetRequest, options?: any) => Promise; /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66524,7 +67261,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | processorBalanceGet: (processorBalanceGetRequest: ProcessorBalanceGetRequest, options?: any) => Promise; /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66539,7 +67276,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ processorIdentityGet: (processorIdentityGetRequest: ProcessorIdentityGetRequest, options?: any) => Promise; /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -66651,7 +67388,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ processorTokenWebhookUpdate: (processorTokenWebhookUpdateRequest: ProcessorTokenWebhookUpdateRequest, options?: any) => Promise; /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -66659,7 +67396,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ processorTransactionsGet: (processorTransactionsGetRequest: ProcessorTransactionsGetRequest, options?: any) => Promise; /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -66667,7 +67404,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ processorTransactionsRecurringGet: (processorTransactionsRecurringGetRequest: ProcessorTransactionsRecurringGetRequest, options?: any) => Promise; /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -66675,7 +67412,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ processorTransactionsRefresh: (processorTransactionsRefreshRequest: ProcessorTransactionsRefreshRequest, options?: any) => Promise; /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -66732,7 +67469,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | protectUserInsightsGet: (protectUserInsightsGetRequest: ProtectUserInsightsGetRequest, options?: any) => Promise; /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66740,7 +67477,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | sandboxBankIncomeFireWebhook: (sandboxBankIncomeFireWebhookRequest: SandboxBankIncomeFireWebhookRequest, options?: any) => Promise; /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66748,7 +67485,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | sandboxBankTransferFireWebhook: (sandboxBankTransferFireWebhookRequest: SandboxBankTransferFireWebhookRequest, options?: any) => Promise; /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -66762,6 +67499,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ sandboxCraCashflowUpdatesUpdate: (sandboxCraCashflowUpdatesUpdateRequest: SandboxCraCashflowUpdatesUpdateRequest, options?: any) => Promise; + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed: (sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options?: any) => Promise; /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -66787,7 +67532,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ sandboxItemFireWebhook: (sandboxItemFireWebhookRequest: SandboxItemFireWebhookRequest, options?: any) => Promise; /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -66811,7 +67556,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ sandboxOauthSelectAccounts: (sandboxOauthSelectAccountsRequest: SandboxOauthSelectAccountsRequest, options?: any) => Promise; /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -66891,7 +67636,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ sandboxTransferRefundSimulate: (sandboxTransferRefundSimulateRequest: SandboxTransferRefundSimulateRequest, options?: any) => Promise; /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -66947,7 +67692,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ sandboxTransferTestClockList: (sandboxTransferTestClockListRequest: SandboxTransferTestClockListRequest, options?: any) => Promise; /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -67043,7 +67788,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ transactionsEnrich: (transactionsEnrichRequest: TransactionsEnrichRequest, options?: any) => Promise; /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -67051,7 +67796,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ transactionsGet: (transactionsGetRequest: TransactionsGetRequest, options?: any) => Promise; /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -67091,7 +67836,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ transactionsRulesRemove: (transactionsRulesRemoveRequest: TransactionsRulesRemoveRequest, options?: any) => Promise; /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -67123,7 +67868,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ transferAuthorizationCreate: (transferAuthorizationCreateRequest: TransferAuthorizationCreateRequest, options?: any) => Promise; /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -67163,7 +67908,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ transferCreate: (transferCreateRequest: TransferCreateRequest, options?: any) => Promise; /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -67227,7 +67972,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ transferLedgerDeposit: (transferLedgerDepositRequest: TransferLedgerDepositRequest, options?: any) => Promise; /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -67355,7 +68100,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ transferQuestionnaireCreate: (transferQuestionnaireCreateRequest: TransferQuestionnaireCreateRequest, options?: any) => Promise; /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -67426,6 +68171,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ transferRepaymentReturnList: (transferRepaymentReturnListRequest: TransferRepaymentReturnListRequest, options?: any) => Promise; + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover: (transferReturnRecoverRequest: TransferReturnRecoverRequest, options?: any) => Promise; /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -67459,7 +68212,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ userAccountSessionGet: (userAccountSessionGetRequest: UserAccountSessionGetRequest, options?: any) => Promise; /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -67468,7 +68221,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ userCreate: (userCreateRequest: UserCreateRequest, plaidNewUserAPIEnabled?: boolean | undefined, options?: any) => Promise; /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -67543,7 +68296,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ userThirdPartyTokenCreate: (userThirdPartyTokenCreateRequest: UserThirdPartyTokenCreateRequest, options?: any) => Promise; /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -67862,7 +68615,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ assetReportFilter(assetReportFilterRequest: AssetReportFilterRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -67911,7 +68664,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => authVerify(authVerifyRequest: AuthVerifyRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67919,7 +68672,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferBalanceGet(bankTransferBalanceGetRequest: BankTransferBalanceGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67927,7 +68680,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferCancel(bankTransferCancelRequest: BankTransferCancelRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67951,7 +68704,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferEventSync(bankTransferEventSyncRequest: BankTransferEventSyncRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67959,7 +68712,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferGet(bankTransferGetRequest: BankTransferGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67967,7 +68720,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferList(bankTransferListRequest: BankTransferListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67975,7 +68728,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferMigrateAccount(bankTransferMigrateAccountRequest: BankTransferMigrateAccountRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67983,7 +68736,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferSweepGet(bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67991,7 +68744,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -67999,7 +68752,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest: BeaconAccountRiskEvaluateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68007,7 +68760,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68015,7 +68768,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconReportCreate(beaconReportCreateRequest: BeaconReportCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68023,7 +68776,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconReportGet(beaconReportGetRequest: BeaconReportGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68031,7 +68784,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconReportList(beaconReportListRequest: BeaconReportListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68039,7 +68792,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconReportSyndicationGet(beaconReportSyndicationGetRequest: BeaconReportSyndicationGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68047,15 +68800,15 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconReportSyndicationList(beaconReportSyndicationListRequest: BeaconReportSyndicationListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest: BeaconUserAccountInsightsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68063,7 +68816,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconUserCreate(beaconUserCreateRequest: BeaconUserCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68071,7 +68824,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconUserGet(beaconUserGetRequest: BeaconUserGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68079,15 +68832,15 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => beaconUserHistoryList(beaconUserHistoryListRequest: BeaconUserHistoryListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserReview(beaconUserReviewRequest: BeaconUserReviewRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68154,7 +68907,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ businessVerificationGet(businessVerificationGetRequest: BusinessVerificationGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -68178,7 +68931,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ cashflowReportRefresh(cashflowReportRefreshRequest: CashflowReportRefreshRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -68218,7 +68971,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -68234,15 +68987,15 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ craCheckReportCreate(craCheckReportCreateRequest: CraCheckReportCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest: CraCheckReportIncomeInsightsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -68250,7 +69003,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ craCheckReportLendScoreGet(craCheckReportLendScoreGetRequest: CraCheckReportLendScoreGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -68258,7 +69011,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest: CraCheckReportNetworkInsightsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -68362,7 +69115,15 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ craPartnerInsightsGet(craPartnerInsightsGetRequest: CraPartnerInsightsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet(craReportGetRequest: CraReportGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -68518,8 +69279,8 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ creditRelayGet(creditRelayGetRequest: CreditRelayGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68575,7 +69336,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => dashboardUserList(dashboardUserListRequest: DashboardUserListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -68597,6 +69358,15 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ fdxConsentsGet(consentId: string, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + fdxConsentsList(customerId: string, status?: FDXConsentGrantStatus | undefined, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -68681,7 +69451,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -68874,7 +69644,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => itemApplicationUnlink(itemApplicationUnlinkRequest: ItemApplicationUnlinkRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -69081,7 +69851,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest: PaymentInitiationConsentRevokeRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -69089,7 +69859,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest: PaymentInitiationPaymentCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -69129,7 +69899,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest: PaymentInitiationRecipientGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -69170,7 +69940,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => processorAccountGet(processorAccountGetRequest: ProcessorAccountGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -69194,7 +69964,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => processorBalanceGet(processorBalanceGetRequest: ProcessorBalanceGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -69209,7 +69979,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ processorIdentityGet(processorIdentityGetRequest: ProcessorIdentityGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -69321,7 +70091,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest: ProcessorTokenWebhookUpdateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -69329,7 +70099,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ processorTransactionsGet(processorTransactionsGetRequest: ProcessorTransactionsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -69337,7 +70107,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest: ProcessorTransactionsRecurringGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -69345,7 +70115,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ processorTransactionsRefresh(processorTransactionsRefreshRequest: ProcessorTransactionsRefreshRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -69402,7 +70172,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => protectUserInsightsGet(protectUserInsightsGetRequest: ProtectUserInsightsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -69410,7 +70180,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest: SandboxBankIncomeFireWebhookRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -69418,7 +70188,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest: SandboxBankTransferFireWebhookRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -69432,6 +70202,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest: SandboxCraCashflowUpdatesUpdateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -69457,7 +70235,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ sandboxItemFireWebhook(sandboxItemFireWebhookRequest: SandboxItemFireWebhookRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -69483,7 +70261,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => [key: string]: object; }>>; /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -69563,7 +70341,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest: SandboxTransferRefundSimulateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -69619,7 +70397,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ sandboxTransferTestClockList(sandboxTransferTestClockListRequest: SandboxTransferTestClockListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -69715,7 +70493,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ transactionsEnrich(transactionsEnrichRequest: TransactionsEnrichRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -69723,7 +70501,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ transactionsGet(transactionsGetRequest: TransactionsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -69763,7 +70541,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ transactionsRulesRemove(transactionsRulesRemoveRequest: TransactionsRulesRemoveRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -69795,7 +70573,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ transferAuthorizationCreate(transferAuthorizationCreateRequest: TransferAuthorizationCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -69835,7 +70613,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ transferCreate(transferCreateRequest: TransferCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -69899,7 +70677,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ transferLedgerDeposit(transferLedgerDepositRequest: TransferLedgerDepositRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -70027,7 +70805,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ transferQuestionnaireCreate(transferQuestionnaireCreateRequest: TransferQuestionnaireCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -70098,6 +70876,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ transferRepaymentReturnList(transferRepaymentReturnListRequest: TransferRepaymentReturnListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover(transferReturnRecoverRequest: TransferReturnRecoverRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -70131,7 +70917,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ userAccountSessionGet(userAccountSessionGetRequest: UserAccountSessionGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -70140,7 +70926,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ userCreate(userCreateRequest: UserCreateRequest, plaidNewUserAPIEnabled?: boolean | undefined, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -70215,7 +71001,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest: UserThirdPartyTokenCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -70534,7 +71320,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ assetReportFilter(assetReportFilterRequest: AssetReportFilterRequest, options?: any): AxiosPromise; /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -70583,7 +71369,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined authVerify(authVerifyRequest: AuthVerifyRequest, options?: any): AxiosPromise; /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70591,7 +71377,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferBalanceGet(bankTransferBalanceGetRequest: BankTransferBalanceGetRequest, options?: any): AxiosPromise; /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70599,7 +71385,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferCancel(bankTransferCancelRequest: BankTransferCancelRequest, options?: any): AxiosPromise; /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70623,7 +71409,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferEventSync(bankTransferEventSyncRequest: BankTransferEventSyncRequest, options?: any): AxiosPromise; /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70631,7 +71417,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferGet(bankTransferGetRequest: BankTransferGetRequest, options?: any): AxiosPromise; /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70639,7 +71425,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferList(bankTransferListRequest: BankTransferListRequest, options?: any): AxiosPromise; /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70647,7 +71433,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferMigrateAccount(bankTransferMigrateAccountRequest: BankTransferMigrateAccountRequest, options?: any): AxiosPromise; /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70655,7 +71441,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferSweepGet(bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any): AxiosPromise; /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70663,7 +71449,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): AxiosPromise; /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70671,7 +71457,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest: BeaconAccountRiskEvaluateRequest, options?: any): AxiosPromise; /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70679,7 +71465,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): AxiosPromise; /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70687,7 +71473,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconReportCreate(beaconReportCreateRequest: BeaconReportCreateRequest, options?: any): AxiosPromise; /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70695,7 +71481,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconReportGet(beaconReportGetRequest: BeaconReportGetRequest, options?: any): AxiosPromise; /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70703,7 +71489,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconReportList(beaconReportListRequest: BeaconReportListRequest, options?: any): AxiosPromise; /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70711,7 +71497,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconReportSyndicationGet(beaconReportSyndicationGetRequest: BeaconReportSyndicationGetRequest, options?: any): AxiosPromise; /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70719,15 +71505,15 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconReportSyndicationList(beaconReportSyndicationListRequest: BeaconReportSyndicationListRequest, options?: any): AxiosPromise; /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest: BeaconUserAccountInsightsGetRequest, options?: any): AxiosPromise; /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70735,7 +71521,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconUserCreate(beaconUserCreateRequest: BeaconUserCreateRequest, options?: any): AxiosPromise; /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70743,7 +71529,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconUserGet(beaconUserGetRequest: BeaconUserGetRequest, options?: any): AxiosPromise; /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70751,15 +71537,15 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined beaconUserHistoryList(beaconUserHistoryListRequest: BeaconUserHistoryListRequest, options?: any): AxiosPromise; /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserReview(beaconUserReviewRequest: BeaconUserReviewRequest, options?: any): AxiosPromise; /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -70826,7 +71612,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ businessVerificationGet(businessVerificationGetRequest: BusinessVerificationGetRequest, options?: any): AxiosPromise; /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -70850,7 +71636,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ cashflowReportRefresh(cashflowReportRefreshRequest: CashflowReportRefreshRequest, options?: any): AxiosPromise; /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -70890,7 +71676,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any): AxiosPromise; /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -70906,15 +71692,15 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ craCheckReportCreate(craCheckReportCreateRequest: CraCheckReportCreateRequest, options?: any): AxiosPromise; /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest: CraCheckReportIncomeInsightsGetRequest, options?: any): AxiosPromise; /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -70922,7 +71708,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ craCheckReportLendScoreGet(craCheckReportLendScoreGetRequest: CraCheckReportLendScoreGetRequest, options?: any): AxiosPromise; /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -70930,7 +71716,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest: CraCheckReportNetworkInsightsGetRequest, options?: any): AxiosPromise; /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -71034,7 +71820,15 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ craPartnerInsightsGet(craPartnerInsightsGetRequest: CraPartnerInsightsGetRequest, options?: any): AxiosPromise; /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet(craReportGetRequest: CraReportGetRequest, options?: any): AxiosPromise; + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -71190,8 +71984,8 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ creditRelayGet(creditRelayGetRequest: CreditRelayGetRequest, options?: any): AxiosPromise; /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -71247,7 +72041,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined dashboardUserList(dashboardUserListRequest: DashboardUserListRequest, options?: any): AxiosPromise; /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -71269,6 +72063,15 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ fdxConsentsGet(consentId: string, options?: any): AxiosPromise; + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + fdxConsentsList(customerId: string, status?: FDXConsentGrantStatus | undefined, options?: any): AxiosPromise; /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -71353,7 +72156,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): AxiosPromise; /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -71546,7 +72349,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined itemApplicationUnlink(itemApplicationUnlinkRequest: ItemApplicationUnlinkRequest, options?: any): AxiosPromise; /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -71753,7 +72556,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest: PaymentInitiationConsentRevokeRequest, options?: any): AxiosPromise; /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -71761,7 +72564,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest: PaymentInitiationPaymentCreateRequest, options?: any): AxiosPromise; /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -71801,7 +72604,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest: PaymentInitiationRecipientGetRequest, options?: any): AxiosPromise; /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -71842,7 +72645,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined processorAccountGet(processorAccountGetRequest: ProcessorAccountGetRequest, options?: any): AxiosPromise; /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -71866,7 +72669,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined processorBalanceGet(processorBalanceGetRequest: ProcessorBalanceGetRequest, options?: any): AxiosPromise; /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -71881,7 +72684,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ processorIdentityGet(processorIdentityGetRequest: ProcessorIdentityGetRequest, options?: any): AxiosPromise; /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -71993,7 +72796,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest: ProcessorTokenWebhookUpdateRequest, options?: any): AxiosPromise; /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -72001,7 +72804,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ processorTransactionsGet(processorTransactionsGetRequest: ProcessorTransactionsGetRequest, options?: any): AxiosPromise; /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -72009,7 +72812,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest: ProcessorTransactionsRecurringGetRequest, options?: any): AxiosPromise; /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -72017,7 +72820,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ processorTransactionsRefresh(processorTransactionsRefreshRequest: ProcessorTransactionsRefreshRequest, options?: any): AxiosPromise; /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -72074,7 +72877,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined protectUserInsightsGet(protectUserInsightsGetRequest: ProtectUserInsightsGetRequest, options?: any): AxiosPromise; /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -72082,7 +72885,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest: SandboxBankIncomeFireWebhookRequest, options?: any): AxiosPromise; /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -72090,7 +72893,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest: SandboxBankTransferFireWebhookRequest, options?: any): AxiosPromise; /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -72104,6 +72907,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest: SandboxCraCashflowUpdatesUpdateRequest, options?: any): AxiosPromise; + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options?: any): AxiosPromise; /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -72129,7 +72940,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ sandboxItemFireWebhook(sandboxItemFireWebhookRequest: SandboxItemFireWebhookRequest, options?: any): AxiosPromise; /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -72155,7 +72966,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined [key: string]: object; }>; /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -72235,7 +73046,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest: SandboxTransferRefundSimulateRequest, options?: any): AxiosPromise; /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -72291,7 +73102,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ sandboxTransferTestClockList(sandboxTransferTestClockListRequest: SandboxTransferTestClockListRequest, options?: any): AxiosPromise; /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -72387,7 +73198,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ transactionsEnrich(transactionsEnrichRequest: TransactionsEnrichRequest, options?: any): AxiosPromise; /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -72395,7 +73206,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ transactionsGet(transactionsGetRequest: TransactionsGetRequest, options?: any): AxiosPromise; /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -72435,7 +73246,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ transactionsRulesRemove(transactionsRulesRemoveRequest: TransactionsRulesRemoveRequest, options?: any): AxiosPromise; /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -72467,7 +73278,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ transferAuthorizationCreate(transferAuthorizationCreateRequest: TransferAuthorizationCreateRequest, options?: any): AxiosPromise; /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -72507,7 +73318,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ transferCreate(transferCreateRequest: TransferCreateRequest, options?: any): AxiosPromise; /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -72571,7 +73382,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ transferLedgerDeposit(transferLedgerDepositRequest: TransferLedgerDepositRequest, options?: any): AxiosPromise; /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -72699,7 +73510,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ transferQuestionnaireCreate(transferQuestionnaireCreateRequest: TransferQuestionnaireCreateRequest, options?: any): AxiosPromise; /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -72770,6 +73581,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ transferRepaymentReturnList(transferRepaymentReturnListRequest: TransferRepaymentReturnListRequest, options?: any): AxiosPromise; + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover(transferReturnRecoverRequest: TransferReturnRecoverRequest, options?: any): AxiosPromise; /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -72803,7 +73622,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ userAccountSessionGet(userAccountSessionGetRequest: UserAccountSessionGetRequest, options?: any): AxiosPromise; /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -72812,7 +73631,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ userCreate(userCreateRequest: UserCreateRequest, plaidNewUserAPIEnabled?: boolean | undefined, options?: any): AxiosPromise; /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -72887,7 +73706,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest: UserThirdPartyTokenCreateRequest, options?: any): AxiosPromise; /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -73217,7 +74036,7 @@ export declare class PlaidApi extends BaseAPI { */ assetReportFilter(assetReportFilterRequest: AssetReportFilterRequest, options?: any): Promise>; /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -73272,7 +74091,7 @@ export declare class PlaidApi extends BaseAPI { authVerify(authVerifyRequest: AuthVerifyRequest, options?: any): Promise>; /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73281,7 +74100,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferBalanceGet(bankTransferBalanceGetRequest: BankTransferBalanceGetRequest, options?: any): Promise>; /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73290,7 +74109,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferCancel(bankTransferCancelRequest: BankTransferCancelRequest, options?: any): Promise>; /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73317,7 +74136,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferEventSync(bankTransferEventSyncRequest: BankTransferEventSyncRequest, options?: any): Promise>; /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73326,7 +74145,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferGet(bankTransferGetRequest: BankTransferGetRequest, options?: any): Promise>; /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73335,7 +74154,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferList(bankTransferListRequest: BankTransferListRequest, options?: any): Promise>; /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73344,7 +74163,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferMigrateAccount(bankTransferMigrateAccountRequest: BankTransferMigrateAccountRequest, options?: any): Promise>; /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73353,7 +74172,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferSweepGet(bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any): Promise>; /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73362,7 +74181,7 @@ export declare class PlaidApi extends BaseAPI { bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): Promise>; /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73371,7 +74190,7 @@ export declare class PlaidApi extends BaseAPI { beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest: BeaconAccountRiskEvaluateRequest, options?: any): Promise>; /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73380,7 +74199,7 @@ export declare class PlaidApi extends BaseAPI { beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): Promise>; /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73389,7 +74208,7 @@ export declare class PlaidApi extends BaseAPI { beaconReportCreate(beaconReportCreateRequest: BeaconReportCreateRequest, options?: any): Promise>; /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73398,7 +74217,7 @@ export declare class PlaidApi extends BaseAPI { beaconReportGet(beaconReportGetRequest: BeaconReportGetRequest, options?: any): Promise>; /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73407,7 +74226,7 @@ export declare class PlaidApi extends BaseAPI { beaconReportList(beaconReportListRequest: BeaconReportListRequest, options?: any): Promise>; /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73416,7 +74235,7 @@ export declare class PlaidApi extends BaseAPI { beaconReportSyndicationGet(beaconReportSyndicationGetRequest: BeaconReportSyndicationGetRequest, options?: any): Promise>; /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73425,7 +74244,7 @@ export declare class PlaidApi extends BaseAPI { beaconReportSyndicationList(beaconReportSyndicationListRequest: BeaconReportSyndicationListRequest, options?: any): Promise>; /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73433,8 +74252,8 @@ export declare class PlaidApi extends BaseAPI { */ beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest: BeaconUserAccountInsightsGetRequest, options?: any): Promise>; /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73443,7 +74262,7 @@ export declare class PlaidApi extends BaseAPI { beaconUserCreate(beaconUserCreateRequest: BeaconUserCreateRequest, options?: any): Promise>; /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73452,7 +74271,7 @@ export declare class PlaidApi extends BaseAPI { beaconUserGet(beaconUserGetRequest: BeaconUserGetRequest, options?: any): Promise>; /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73461,7 +74280,7 @@ export declare class PlaidApi extends BaseAPI { beaconUserHistoryList(beaconUserHistoryListRequest: BeaconUserHistoryListRequest, options?: any): Promise>; /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73469,8 +74288,8 @@ export declare class PlaidApi extends BaseAPI { */ beaconUserReview(beaconUserReviewRequest: BeaconUserReviewRequest, options?: any): Promise>; /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73545,7 +74364,7 @@ export declare class PlaidApi extends BaseAPI { */ businessVerificationGet(businessVerificationGetRequest: BusinessVerificationGetRequest, options?: any): Promise>; /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -73572,7 +74391,7 @@ export declare class PlaidApi extends BaseAPI { */ cashflowReportRefresh(cashflowReportRefreshRequest: CashflowReportRefreshRequest, options?: any): Promise>; /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -73617,7 +74436,7 @@ export declare class PlaidApi extends BaseAPI { */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any): Promise>; /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -73635,8 +74454,8 @@ export declare class PlaidApi extends BaseAPI { */ craCheckReportCreate(craCheckReportCreateRequest: CraCheckReportCreateRequest, options?: any): Promise>; /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -73644,7 +74463,7 @@ export declare class PlaidApi extends BaseAPI { */ craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest: CraCheckReportIncomeInsightsGetRequest, options?: any): Promise>; /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -73653,7 +74472,7 @@ export declare class PlaidApi extends BaseAPI { */ craCheckReportLendScoreGet(craCheckReportLendScoreGetRequest: CraCheckReportLendScoreGetRequest, options?: any): Promise>; /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -73662,7 +74481,7 @@ export declare class PlaidApi extends BaseAPI { */ craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest: CraCheckReportNetworkInsightsGetRequest, options?: any): Promise>; /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -73779,7 +74598,16 @@ export declare class PlaidApi extends BaseAPI { */ craPartnerInsightsGet(craPartnerInsightsGetRequest: CraPartnerInsightsGetRequest, options?: any): Promise>; /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + craReportGet(craReportGetRequest: CraReportGetRequest, options?: any): Promise>; + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -73954,8 +74782,8 @@ export declare class PlaidApi extends BaseAPI { */ creditRelayGet(creditRelayGetRequest: CreditRelayGetRequest, options?: any): Promise>; /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74018,7 +74846,7 @@ export declare class PlaidApi extends BaseAPI { dashboardUserList(dashboardUserListRequest: DashboardUserListRequest, options?: any): Promise>; /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74043,6 +74871,16 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ fdxConsentsGet(consentId: string, options?: any): Promise>; + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + fdxConsentsList(customerId: string, status?: FDXConsentGrantStatus, options?: any): Promise>; /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -74137,7 +74975,7 @@ export declare class PlaidApi extends BaseAPI { */ identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): Promise>; /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -74354,7 +75192,7 @@ export declare class PlaidApi extends BaseAPI { itemApplicationUnlink(itemApplicationUnlinkRequest: ItemApplicationUnlinkRequest, options?: any): Promise>; /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74587,7 +75425,7 @@ export declare class PlaidApi extends BaseAPI { */ paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest: PaymentInitiationConsentRevokeRequest, options?: any): Promise>; /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -74596,7 +75434,7 @@ export declare class PlaidApi extends BaseAPI { */ paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest: PaymentInitiationPaymentCreateRequest, options?: any): Promise>; /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -74641,7 +75479,7 @@ export declare class PlaidApi extends BaseAPI { */ paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest: PaymentInitiationRecipientGetRequest, options?: any): Promise>; /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -74687,7 +75525,7 @@ export declare class PlaidApi extends BaseAPI { processorAccountGet(processorAccountGetRequest: ProcessorAccountGetRequest, options?: any): Promise>; /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74714,7 +75552,7 @@ export declare class PlaidApi extends BaseAPI { processorBalanceGet(processorBalanceGetRequest: ProcessorBalanceGetRequest, options?: any): Promise>; /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74731,7 +75569,7 @@ export declare class PlaidApi extends BaseAPI { */ processorIdentityGet(processorIdentityGetRequest: ProcessorIdentityGetRequest, options?: any): Promise>; /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -74857,7 +75695,7 @@ export declare class PlaidApi extends BaseAPI { */ processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest: ProcessorTokenWebhookUpdateRequest, options?: any): Promise>; /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -74866,7 +75704,7 @@ export declare class PlaidApi extends BaseAPI { */ processorTransactionsGet(processorTransactionsGetRequest: ProcessorTransactionsGetRequest, options?: any): Promise>; /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -74875,7 +75713,7 @@ export declare class PlaidApi extends BaseAPI { */ processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest: ProcessorTransactionsRecurringGetRequest, options?: any): Promise>; /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -74884,7 +75722,7 @@ export declare class PlaidApi extends BaseAPI { */ processorTransactionsRefresh(processorTransactionsRefreshRequest: ProcessorTransactionsRefreshRequest, options?: any): Promise>; /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -74948,7 +75786,7 @@ export declare class PlaidApi extends BaseAPI { protectUserInsightsGet(protectUserInsightsGetRequest: ProtectUserInsightsGetRequest, options?: any): Promise>; /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74957,7 +75795,7 @@ export declare class PlaidApi extends BaseAPI { sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest: SandboxBankIncomeFireWebhookRequest, options?: any): Promise>; /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74966,7 +75804,7 @@ export declare class PlaidApi extends BaseAPI { sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest: SandboxBankTransferFireWebhookRequest, options?: any): Promise>; /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -74982,6 +75820,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest: SandboxCraCashflowUpdatesUpdateRequest, options?: any): Promise>; + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest: SandboxFdxConsentSeedRequest, options?: any): Promise>; /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -75010,7 +75857,7 @@ export declare class PlaidApi extends BaseAPI { */ sandboxItemFireWebhook(sandboxItemFireWebhookRequest: SandboxItemFireWebhookRequest, options?: any): Promise>; /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -75039,7 +75886,7 @@ export declare class PlaidApi extends BaseAPI { [key: string]: object; }, any, {}>>; /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -75129,7 +75976,7 @@ export declare class PlaidApi extends BaseAPI { */ sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest: SandboxTransferRefundSimulateRequest, options?: any): Promise>; /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -75192,7 +76039,7 @@ export declare class PlaidApi extends BaseAPI { */ sandboxTransferTestClockList(sandboxTransferTestClockListRequest: SandboxTransferTestClockListRequest, options?: any): Promise>; /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -75300,7 +76147,7 @@ export declare class PlaidApi extends BaseAPI { */ transactionsEnrich(transactionsEnrichRequest: TransactionsEnrichRequest, options?: any): Promise>; /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -75309,7 +76156,7 @@ export declare class PlaidApi extends BaseAPI { */ transactionsGet(transactionsGetRequest: TransactionsGetRequest, options?: any): Promise>; /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -75354,7 +76201,7 @@ export declare class PlaidApi extends BaseAPI { */ transactionsRulesRemove(transactionsRulesRemoveRequest: TransactionsRulesRemoveRequest, options?: any): Promise>; /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -75390,7 +76237,7 @@ export declare class PlaidApi extends BaseAPI { */ transferAuthorizationCreate(transferAuthorizationCreateRequest: TransferAuthorizationCreateRequest, options?: any): Promise>; /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -75435,7 +76282,7 @@ export declare class PlaidApi extends BaseAPI { */ transferCreate(transferCreateRequest: TransferCreateRequest, options?: any): Promise>; /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -75507,7 +76354,7 @@ export declare class PlaidApi extends BaseAPI { */ transferLedgerDeposit(transferLedgerDepositRequest: TransferLedgerDepositRequest, options?: any): Promise>; /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -75651,7 +76498,7 @@ export declare class PlaidApi extends BaseAPI { */ transferQuestionnaireCreate(transferQuestionnaireCreateRequest: TransferQuestionnaireCreateRequest, options?: any): Promise>; /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -75731,6 +76578,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ transferRepaymentReturnList(transferRepaymentReturnListRequest: TransferRepaymentReturnListRequest, options?: any): Promise>; + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + transferReturnRecover(transferReturnRecoverRequest: TransferReturnRecoverRequest, options?: any): Promise>; /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -75768,7 +76624,7 @@ export declare class PlaidApi extends BaseAPI { */ userAccountSessionGet(userAccountSessionGetRequest: UserAccountSessionGetRequest, options?: any): Promise>; /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -75778,7 +76634,7 @@ export declare class PlaidApi extends BaseAPI { */ userCreate(userCreateRequest: UserCreateRequest, plaidNewUserAPIEnabled?: boolean, options?: any): Promise>; /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -75862,7 +76718,7 @@ export declare class PlaidApi extends BaseAPI { */ userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest: UserThirdPartyTokenCreateRequest, options?: any): Promise>; /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. diff --git a/dist/api.js b/dist/api.js index 71fd7ebb..2905f016 100644 --- a/dist/api.js +++ b/dist/api.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -26,13 +26,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BusinessEntityType = exports.BusinessCheckBooleanStatus = exports.BusinessAccountVerificationStatusEnum = exports.BeaconUserStatus = exports.BeaconReportType = exports.BeaconReportCreateType = exports.BeaconMatchSummaryCode = exports.BeaconAuditTrailSource = exports.BeaconAccountRiskEvaluateEvaluationReason = exports.BaseReportWarningCode = exports.BaseReportTransactionType = exports.BankTransferType = exports.BankTransferStatus = exports.BankTransferNetwork = exports.BankTransferEventType = exports.BankTransferEventListDirection = exports.BankTransferEventListBankTransferType = exports.BankTransferDirection = exports.BankIncomeRefreshCompleteResult = exports.BankIncomeCompleteResult = exports.AuthUpdateTypes = exports.AssetType = exports.AssetTransactionType = exports.AssetTransactionCategoryType = exports.AssetReportType = exports.AssetReportTransactionType = exports.AssetReportAddOns = exports.AssetInvestmentTransactionType = exports.AssetHoldingAssetHoldingRestrictedIndicatorEnum = exports.AssetHoldingAssetHoldingTypeEnum = exports.AssetDetailAssetEmployerSponsoredIndicatorEnum = exports.AssetDetailAssetRetirementIndicatorEnum = exports.AddressPurposeLabel = exports.ActivityType = exports.ActionState = exports.AccountVerificationInsightsAccountNumberFormat = exports.AccountType = exports.AccountSubtype = exports.AccountSelectionCardinality = exports.AccountIdentityMatchScoreVerificationStatusEnum = exports.AccountIdentityDocumentUploadVerificationStatusEnum = exports.AccountIdentityVerificationStatusEnum = exports.AccountHolderCategory = exports.AccountBaseNullableVerificationStatusEnum = exports.AccountBaseVerificationStatusEnum = exports.AccountAssetsVerificationStatusEnum = exports.APRAprTypeEnum = exports.ACHClass = exports.AAMVAMatchResult = exports.AAMVADetailedMatchResult = void 0; -exports.DataSources = exports.DashboardUserStatus = exports.CreditSessionBankIncomeStatus = exports.CreditSessionBankEmploymentStatus = exports.CreditPayStubPayBasisType = exports.CreditBankIncomeWarningType = exports.CreditBankIncomeWarningCode = exports.CreditBankIncomePayFrequency = exports.CreditBankIncomeErrorType = exports.CreditBankIncomeCategory = exports.CreditBankIncomeAccountType = exports.CreditBankEmploymentWarningType = exports.CreditAccountSubtype = exports.CreditACHClass = exports.CraVerificationIncomeStatus = exports.CraVerificationIncomePayFrequency = exports.CraUserTier = exports.CraPartnerInsightsUltraFicoScoreVersion = exports.CraPartnerInsightsBureau = exports.CraPartnerInsightsBaseFicoScoreVersion = exports.CraPDFAddOns = exports.CraLoanType = exports.CraLoanStatus = exports.CraLoanPaymentSchedule = exports.CraLoanApplicationDecision = exports.CraCreditProfileReportVersion = exports.CraCreditProfileReportType = exports.CraCreditProfileInquiryType = exports.CraCheckReportVerificationPdfReportType = exports.CraCheckReportVerificationGetReportType = exports.CraBankIncomeWarningCode = exports.CraBankIncomeStatus = exports.CraBankIncomeCompleteResult = exports.CraBankIncomeBonusType = exports.CountryCode = exports.CounterpartyType = exports.ConsumerReportPermissiblePurpose = exports.ConsumerDisputeCategory = exports.ConsentEventType = exports.ConsentEventInitiator = exports.ConsentEventCode = exports.CheckReportWarningCode = exports.CashflowAttributesVersion = exports.CashFlowUpdatesEventWebhookCodes = exports.CashFlowInsight = exports.BusinessWebsiteBuildStatus = exports.BusinessVerificationStatusWebPresenceCheck = exports.BusinessVerificationStatusRiskCheck = exports.BusinessVerificationStatusOverall = exports.BusinessVerificationStatusKYBCheck = void 0; -exports.IncomeVerificationPrecheckConfidence = exports.IncomeVerificationPayrollFlowType = exports.IncomeVerificationDocParsingConfig = exports.IncomeInsightsVersion = exports.IncomeBreakdownType = exports.IncidentUpdateStatusEnum = exports.ImageQualityOutcome = exports.ImageQuality = exports.IdentityVerificationStepStatus = exports.IdentityVerificationStatus = exports.IdentityVerificationAutofillStatus = exports.IdentityUpdateTypes = exports.ISOCurrencyCode = exports.IDNumberType = exports.HumanReviewStatus = exports.HostedLinkDeliveryMethod = exports.HoldingTaxLotPositionType = exports.HiddenMatchSummaryCode = exports.GSEReportType = exports.FraudCheckOutcomeWithNoData = exports.FraudCheckOutcome = exports.Form1099Type = exports.FDXUpdateReason = exports.FDXPartyType = exports.FDXPartyRegistry = exports.FDXNotificationType = exports.FDXNotificationSeverity = exports.FDXNotificationPriority = exports.FDXNotificationPayloadIdType = exports.FDXNotificationCategory = exports.FDXHateoasLinkAction = exports.FDXEventStatus = exports.FDXDataCluster = exports.FDXContentTypes = exports.FDXConsentResourceType = exports.FDXConsentGrantStatus = exports.ExpirationDate = exports.EntityWatchlistCode = exports.EntityDocumentType = exports.EnrichTransactionDirection = exports.EmploymentVerificationStatus = exports.EmploymentSourceType = exports.EmailTypeEnum = exports.EarningsBreakdownCanonicalDescription = exports.DocumentStatus = exports.DocumentNameMatchCode = exports.DocumentDateOfBirthMatchCode = exports.DocumentAuthenticityMatchCode = exports.DocType = exports.DepositoryAccountSubtype = void 0; -exports.PartnerEndCustomerRequirementDue = exports.PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerOAuthStatusUpdatedValues = exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerFlowdownStatus = exports.PartnerEndCustomerCRAUseCase = exports.POBoxStatus = exports.OwnershipType = exports.OverrideAccountType = exports.OtherAccountSubtype = exports.OriginatorExpectedTransferFrequency = exports.OmittableTransferType = exports.OAuthSubjectTokenType = exports.OAuthGrantType = exports.OAuthErrorCode = exports.NetworkStatusGetResponseNetworkStatus = exports.NetworkInsightsVersion = exports.MonitoringItemStatusCode = exports.MonitoringInsightsStatus = exports.MonitoringConsumerReportPermissiblePurpose = exports.MatchSummaryCode = exports.LoanIdentifierType = exports.LoanAccountSubtype = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum = exports.LinkTokenCreateRequestAppearanceMode = exports.LinkSessionSuccessMetadataTransferStatus = exports.LinkEventName = exports.LinkDeliveryWebhookDeliveryStatus = exports.LinkDeliveryWebhookCommunicationMethod = exports.LinkDeliveryWebhookCallbackType = exports.LinkDeliveryVerificationStatus = exports.LinkDeliverySessionStatus = exports.LinkDeliveryDeliveryMethod = exports.LimitedPurposeType = exports.LedgerEventSourceType = exports.ItemWithConsentFieldsUpdateTypeEnum = exports.ItemRemoveReasonCode = exports.ItemCreateAuthentication = exports.ItemConsentedDataScope = exports.ItemAuthMethod = exports.ItemUpdateTypeEnum = exports.IssuingCountry = exports.IssuesStatus = exports.InvestmentTransactionType = exports.InvestmentTransactionSubtype = exports.InvestmentAccountSubtype = exports.InvestmentAccountVerificationStatusEnum = exports.IndividualWatchlistCode = exports.IncomeVerificationSourceType = void 0; -exports.RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsCustom = exports.RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel = exports.RiskCheckBehaviorBotDetectedLabel = exports.ReportType = exports.RecurringTransactionFrequency = exports.RecommendationString = exports.ReasonCode = exports.ProxyType = exports.ProtectReportType = exports.ProtectReportSource = exports.ProtectReportConfidence = exports.ProgramNameSensitivity = exports.ProductsTerminateReasonCode = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PrismInsightsVersion = exports.PrismFirstDetectVersion = exports.PrismExtendVersion = exports.PrismDetectVersion = exports.PrismCashScoreVersion = exports.PlaidLendScoreVersion = exports.PlaidErrorType = exports.PhysicalDocumentCategory = exports.PhoneType = exports.PhoneNumberTypeEnum = exports.PersonalFinanceCategoryVersion = exports.PendingDisconnectWebhookReason = exports.PaystubPayFrequency = exports.PaymentScheme = exports.PaymentScheduleInterval = exports.PaymentProfileStatus = exports.PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationConsentType = exports.PaymentInitiationConsentStatus = exports.PaymentInitiationConsentScope = exports.PaymentInitiationConsentProcessingMode = exports.PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicAlignment = exports.PaymentChannel = exports.PaymentAmountCurrency = exports.PayPeriodDetailsPayFrequency = exports.PayFrequencyValue = exports.PartyRoleType = exports.PartnerEndCustomerStatus = void 0; -exports.TransferAuthorizationDecision = exports.TransferACHNetwork = exports.TransactionsUpdateStatus = exports.TransactionsRuleType = exports.TransactionsRuleField = exports.TransactionStreamStatus = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescription = exports.TaxpayerIdentifierType = exports.SweepTrigger = exports.SweepStatus = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.Strategy = exports.StatementsRefreshCompleteResult = exports.Source = exports.SignalScheduleDefaultPaymentMethod = exports.SignalPaymentMethod = exports.SignalDecisionOutcome = exports.ServiceProductFulfillmentIdentifier = exports.SelfieStatus = exports.SelfieCheckStatus = exports.SelfieAnalysisLivenessCheck = exports.SelfieAnalysisFacialAnalysisOutcome = exports.SelfieAnalysisDocumentComparison = exports.SelfieAgeCheckStatus = exports.ScopesContext = exports.SandboxTransferRfpSimulateAction = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxBankIncomeWebhookFireRequestWebhookCode = exports.SMSVerificationStatus = exports.RuleResult = exports.RiskSignalFileType = exports.RiskSignalDocumentType = exports.RiskSignalDocumentStatus = exports.RiskLevelWithNoData = exports.RiskLevel = exports.RiskCheckLinkedService = exports.RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailName = exports.RiskCheckEmailIsEdu = exports.RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailIncludesDateOfBirth = void 0; -exports.YieldRateType = exports.WebhookType = exports.WebhookEnvironmentValues = exports.WeakAliasDetermination = exports.WatchlistScreeningStatus = exports.WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningHitStatus = exports.WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningDocumentType = exports.WarningWarningCodeEnum = exports.WalletTransactionStatus = exports.WalletTransactionRelationTypeEnum = exports.WalletTransactionPayeeVerificationStatus = exports.WalletTransactionGetResponseTypeEnum = exports.WalletTransactionFailureReason = exports.WalletTransactionTypeEnum = exports.WalletStatus = exports.WalletPaymentScheme = exports.WalletISOCurrencyCode = exports.VerifySMSDetailsStatus = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceCategory = exports.UserBasedProducts = exports.TransferType = exports.TransferSweepStatus = exports.TransferStatus = exports.TransferScheduleIntervalUnit = exports.TransferRefundStatus = exports.TransferRecurringStatus = exports.TransferRecurringNetwork = exports.TransferNetwork = exports.TransferLedgerSweepSimulateEventType = exports.TransferIntentStatus = exports.TransferIntentCreateNetwork = exports.TransferIntentCreateMode = exports.TransferIntentAuthorizationDecision = exports.TransferGuaranteeOutcome = exports.TransferEventType = exports.TransferEventListTransferType = exports.TransferDocumentPurpose = exports.TransferDiligenceStatus = exports.TransferCreditFundsSource = exports.TransferBalanceType = exports.TransferAuthorizationRiskLevel = exports.TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationDecisionRationaleCode = void 0; -exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = void 0; +exports.CreditSessionBankEmploymentStatus = exports.CreditPayStubPayBasisType = exports.CreditBankIncomeWarningType = exports.CreditBankIncomeWarningCode = exports.CreditBankIncomePayFrequency = exports.CreditBankIncomeErrorType = exports.CreditBankIncomeCategory = exports.CreditBankIncomeAccountType = exports.CreditBankEmploymentWarningType = exports.CreditAccountSubtype = exports.CreditACHClass = exports.CraVerificationIncomeStatus = exports.CraVerificationIncomePayFrequency = exports.CraUserTier = exports.CraReportScope = exports.CraReportDecisionStage = exports.CraPartnerInsightsUltraFicoScoreVersion = exports.CraPartnerInsightsBureau = exports.CraPartnerInsightsBaseFicoScoreVersion = exports.CraPDFAddOns = exports.CraLoanType = exports.CraLoanStatus = exports.CraLoanPaymentSchedule = exports.CraLoanApplicationDecision = exports.CraCreditProfileReportVersion = exports.CraCreditProfileReportType = exports.CraCreditProfileInquiryType = exports.CraCheckReportVerificationPdfReportType = exports.CraCheckReportVerificationGetReportType = exports.CraCheckReportPermissiblePurpose = exports.CraBankIncomeWarningCode = exports.CraBankIncomeStatus = exports.CraBankIncomeCompleteResult = exports.CraBankIncomeBonusType = exports.CountryCode = exports.CounterpartyType = exports.ConsumerReportPermissiblePurpose = exports.ConsumerDisputeCategory = exports.ConsentEventType = exports.ConsentEventInitiator = exports.ConsentEventCode = exports.CheckReportWarningCode = exports.CashflowAttributesVersion = exports.CashFlowUpdatesEventWebhookCodes = exports.CashFlowInsight = exports.BusinessWebsiteBuildStatus = exports.BusinessVerificationStatusWebPresenceCheck = exports.BusinessVerificationStatusRiskCheck = exports.BusinessVerificationStatusOverall = exports.BusinessVerificationStatusKYBCheck = void 0; +exports.IncomeInsightsVersion = exports.IncomeBreakdownType = exports.IncidentUpdateStatusEnum = exports.ImageQualityOutcome = exports.ImageQuality = exports.IdentityVerificationStepStatus = exports.IdentityVerificationStatus = exports.IdentityVerificationAutofillStatus = exports.IdentityUpdateTypes = exports.ISOCurrencyCode = exports.IDNumberType = exports.HumanReviewStatus = exports.HostedLinkDeliveryMethod = exports.HoldingTaxLotPositionType = exports.HiddenMatchSummaryCode = exports.GSEReportType = exports.FraudCheckOutcomeWithNoData = exports.FraudCheckOutcome = exports.Form1099Type = exports.FDXUpdateReason = exports.FDXPartyType = exports.FDXPartyRegistry = exports.FDXNotificationType = exports.FDXNotificationSeverity = exports.FDXNotificationPriority = exports.FDXNotificationPayloadIdType = exports.FDXNotificationCategory = exports.FDXHateoasLinkAction = exports.FDXEventStatus = exports.FDXDataCluster = exports.FDXContentTypes = exports.FDXConsentResourceType = exports.FDXConsentGrantStatus = exports.ExpirationDate = exports.EntityWatchlistCode = exports.EntityDocumentType = exports.EnrichTransactionDirection = exports.EmploymentVerificationStatus = exports.EmploymentSourceType = exports.EmailTypeEnum = exports.EarningsBreakdownCanonicalDescription = exports.DocumentStatus = exports.DocumentNameMatchCode = exports.DocumentDateOfBirthMatchCode = exports.DocumentAuthenticityMatchCode = exports.DocType = exports.DepositoryAccountSubtype = exports.DataSources = exports.DashboardUserStatus = exports.CreditSessionBankIncomeStatus = void 0; +exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerFlowdownStatus = exports.PartnerEndCustomerCRAUseCase = exports.POBoxStatus = exports.OwnershipType = exports.OverrideAccountType = exports.OtherAccountSubtype = exports.OriginatorExpectedTransferFrequency = exports.OmittableTransferType = exports.OAuthSubjectTokenType = exports.OAuthGrantType = exports.OAuthErrorCode = exports.NetworkStatusGetResponseNetworkStatus = exports.NetworkInsightsVersion = exports.MonitoringItemStatusCode = exports.MonitoringInsightsStatus = exports.MonitoringConsumerReportPermissiblePurpose = exports.MatchSummaryCode = exports.LoanIdentifierType = exports.LoanAccountSubtype = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum = exports.LinkTokenCreateRequestAppearanceMode = exports.LinkSessionSuccessMetadataTransferStatus = exports.LinkEventName = exports.LinkDeliveryWebhookDeliveryStatus = exports.LinkDeliveryWebhookCommunicationMethod = exports.LinkDeliveryWebhookCallbackType = exports.LinkDeliveryVerificationStatus = exports.LinkDeliverySessionStatus = exports.LinkDeliveryDeliveryMethod = exports.LimitedPurposeType = exports.LedgerEventSourceType = exports.ItemWithConsentFieldsUpdateTypeEnum = exports.ItemRemoveReasonCode = exports.ItemCreateAuthentication = exports.ItemConsentedDataScope = exports.ItemAuthMethod = exports.ItemUpdateTypeEnum = exports.IssuingCountry = exports.IssuesStatus = exports.InvestmentTransactionType = exports.InvestmentTransactionSubtype = exports.InvestmentAccountSubtype = exports.InvestmentAccountVerificationStatusEnum = exports.IndividualWatchlistCode = exports.IncomeVerificationSourceType = exports.IncomeVerificationPrecheckConfidence = exports.IncomeVerificationPayrollFlowType = exports.IncomeVerificationDocParsingConfig = void 0; +exports.RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel = exports.RiskCheckBehaviorBotDetectedLabel = exports.ReportType = exports.RecurringTransactionFrequency = exports.RecommendationString = exports.ReasonCode = exports.ProxyType = exports.ProtectReportType = exports.ProtectReportSource = exports.ProtectReportConfidence = exports.ProgramNameSensitivity = exports.ProductsTerminateReasonCode = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PrismInsightsVersion = exports.PrismFirstDetectVersion = exports.PrismExtendVersion = exports.PrismDetectVersion = exports.PrismCashScoreVersion = exports.PlaidLendScoreVersion = exports.PlaidErrorType = exports.PhysicalDocumentCategory = exports.PhoneType = exports.PhoneNumberTypeEnum = exports.PersonalFinanceCategoryVersion = exports.PendingDisconnectWebhookReason = exports.PaystubPayFrequency = exports.PaymentScheme = exports.PaymentScheduleInterval = exports.PaymentProfileStatus = exports.PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationConsentType = exports.PaymentInitiationConsentStatus = exports.PaymentInitiationConsentScope = exports.PaymentInitiationConsentProcessingMode = exports.PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicAlignment = exports.PaymentChannel = exports.PaymentAmountCurrency = exports.PayPeriodDetailsPayFrequency = exports.PayFrequencyValue = exports.PartyRoleType = exports.PartnerEndCustomerStatus = exports.PartnerEndCustomerRequirementDue = exports.PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerOAuthStatusUpdatedValues = void 0; +exports.TransactionsRuleType = exports.TransactionsRuleField = exports.TransactionStreamStatus = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescription = exports.TaxpayerIdentifierType = exports.SweepTrigger = exports.SweepStatus = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.Strategy = exports.StatementsRefreshCompleteResult = exports.Source = exports.SignalScheduleDefaultPaymentMethod = exports.SignalPaymentMethod = exports.SignalDecisionOutcome = exports.ServiceProductFulfillmentIdentifier = exports.SelfieStatus = exports.SelfieCheckStatus = exports.SelfieAnalysisLivenessCheck = exports.SelfieAnalysisFacialAnalysisOutcome = exports.SelfieAnalysisDocumentComparison = exports.SelfieAgeCheckStatus = exports.ScopesContext = exports.SandboxTransferRfpSimulateAction = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxBankIncomeWebhookFireRequestWebhookCode = exports.SMSVerificationStatus = exports.RuleResult = exports.RiskSignalFileType = exports.RiskSignalDocumentType = exports.RiskSignalDocumentStatus = exports.RiskLevelWithNoData = exports.RiskLevel = exports.RiskCheckLinkedService = exports.RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailName = exports.RiskCheckEmailIsEdu = exports.RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailIncludesDateOfBirth = exports.RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsCustom = void 0; +exports.WeakAliasDetermination = exports.WatchlistScreeningStatus = exports.WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningHitStatus = exports.WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningDocumentType = exports.WarningWarningCodeEnum = exports.WalletTransactionStatus = exports.WalletTransactionRelationTypeEnum = exports.WalletTransactionPayeeVerificationStatus = exports.WalletTransactionGetResponseTypeEnum = exports.WalletTransactionFailureReason = exports.WalletTransactionTypeEnum = exports.WalletStatus = exports.WalletPaymentScheme = exports.WalletISOCurrencyCode = exports.VerifySMSDetailsStatus = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceCategory = exports.UserBasedProducts = exports.TransferType = exports.TransferSweepStatus = exports.TransferStatus = exports.TransferScheduleIntervalUnit = exports.TransferRefundStatus = exports.TransferRecurringStatus = exports.TransferRecurringNetwork = exports.TransferNetwork = exports.TransferLedgerSweepSimulateEventType = exports.TransferIntentStatus = exports.TransferIntentCreateNetwork = exports.TransferIntentCreateMode = exports.TransferIntentAuthorizationDecision = exports.TransferGuaranteeOutcome = exports.TransferEventType = exports.TransferEventListTransferType = exports.TransferDocumentPurpose = exports.TransferDiligenceStatus = exports.TransferCreditFundsSource = exports.TransferBalanceType = exports.TransferAuthorizationRiskLevel = exports.TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationDecisionRationaleCode = exports.TransferAuthorizationDecision = exports.TransferACHNetwork = exports.TransactionsUpdateStatus = void 0; +exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.YieldRateType = exports.WebhookType = exports.WebhookEnvironmentValues = void 0; const axios_1 = __importDefault(require("axios")); // Some imports not used depending on template conditions // @ts-ignore @@ -370,8 +370,8 @@ var AddressPurposeLabel; */ var AssetDetailAssetRetirementIndicatorEnum; (function (AssetDetailAssetRetirementIndicatorEnum) { - AssetDetailAssetRetirementIndicatorEnum["True"] = "true"; - AssetDetailAssetRetirementIndicatorEnum["False"] = "false"; + AssetDetailAssetRetirementIndicatorEnum["Yes"] = "Yes"; + AssetDetailAssetRetirementIndicatorEnum["No"] = "No"; })(AssetDetailAssetRetirementIndicatorEnum = exports.AssetDetailAssetRetirementIndicatorEnum || (exports.AssetDetailAssetRetirementIndicatorEnum = {})); /** * @export @@ -379,8 +379,8 @@ var AssetDetailAssetRetirementIndicatorEnum; */ var AssetDetailAssetEmployerSponsoredIndicatorEnum; (function (AssetDetailAssetEmployerSponsoredIndicatorEnum) { - AssetDetailAssetEmployerSponsoredIndicatorEnum["True"] = "true"; - AssetDetailAssetEmployerSponsoredIndicatorEnum["False"] = "false"; + AssetDetailAssetEmployerSponsoredIndicatorEnum["Yes"] = "Yes"; + AssetDetailAssetEmployerSponsoredIndicatorEnum["No"] = "No"; })(AssetDetailAssetEmployerSponsoredIndicatorEnum = exports.AssetDetailAssetEmployerSponsoredIndicatorEnum || (exports.AssetDetailAssetEmployerSponsoredIndicatorEnum = {})); /** * @export @@ -399,8 +399,8 @@ var AssetHoldingAssetHoldingTypeEnum; */ var AssetHoldingAssetHoldingRestrictedIndicatorEnum; (function (AssetHoldingAssetHoldingRestrictedIndicatorEnum) { - AssetHoldingAssetHoldingRestrictedIndicatorEnum["True"] = "true"; - AssetHoldingAssetHoldingRestrictedIndicatorEnum["False"] = "false"; + AssetHoldingAssetHoldingRestrictedIndicatorEnum["Yes"] = "Yes"; + AssetHoldingAssetHoldingRestrictedIndicatorEnum["No"] = "No"; })(AssetHoldingAssetHoldingRestrictedIndicatorEnum = exports.AssetHoldingAssetHoldingRestrictedIndicatorEnum || (exports.AssetHoldingAssetHoldingRestrictedIndicatorEnum = {})); /** * Asset Investment Transaction Type Enumerated derived by Vendor. @@ -1106,6 +1106,16 @@ var CraBankIncomeWarningCode; CraBankIncomeWarningCode["ReportDeleted"] = "REPORT_DELETED"; CraBankIncomeWarningCode["DataUnavailable"] = "DATA_UNAVAILABLE"; })(CraBankIncomeWarningCode = exports.CraBankIncomeWarningCode || (exports.CraBankIncomeWarningCode = {})); +/** + * The permissible purpose under the FCRA for retrieving this consumer report. Restricted to permissible purposes related to loan servicing only. Required when `report_id` is provided. + * @export + * @enum {string} + */ +var CraCheckReportPermissiblePurpose; +(function (CraCheckReportPermissiblePurpose) { + CraCheckReportPermissiblePurpose["AccountReviewCredit"] = "ACCOUNT_REVIEW_CREDIT"; + CraCheckReportPermissiblePurpose["WrittenInstructionOther"] = "WRITTEN_INSTRUCTION_OTHER"; +})(CraCheckReportPermissiblePurpose = exports.CraCheckReportPermissiblePurpose || (exports.CraCheckReportPermissiblePurpose = {})); /** * Type of home lending report. * @export @@ -1259,6 +1269,27 @@ var CraPartnerInsightsUltraFicoScoreVersion; (function (CraPartnerInsightsUltraFicoScoreVersion) { CraPartnerInsightsUltraFicoScoreVersion["_10"] = "1.0"; })(CraPartnerInsightsUltraFicoScoreVersion = exports.CraPartnerInsightsUltraFicoScoreVersion || (exports.CraPartnerInsightsUltraFicoScoreVersion = {})); +/** + * The stage in the lending lifecycle for which the report is being retrieved. + * @export + * @enum {string} + */ +var CraReportDecisionStage; +(function (CraReportDecisionStage) { + CraReportDecisionStage["Prequalification"] = "PREQUALIFICATION"; + CraReportDecisionStage["Decisioning"] = "DECISIONING"; + CraReportDecisionStage["Servicing"] = "SERVICING"; +})(CraReportDecisionStage = exports.CraReportDecisionStage || (exports.CraReportDecisionStage = {})); +/** + * Determines whose items are used. `PLAID_NETWORK` (default) uses the Plaid Network view of the user\'s profile. `CLIENT_USER` uses only the items linked by this client. + * @export + * @enum {string} + */ +var CraReportScope; +(function (CraReportScope) { + CraReportScope["PlaidNetwork"] = "PLAID_NETWORK"; + CraReportScope["ClientUser"] = "CLIENT_USER"; +})(CraReportScope = exports.CraReportScope || (exports.CraReportScope = {})); /** * The tier of the user. * @export @@ -1497,7 +1528,7 @@ var DepositoryAccountSubtype; DepositoryAccountSubtype["All"] = "all"; })(DepositoryAccountSubtype = exports.DepositoryAccountSubtype || (exports.DepositoryAccountSubtype = {})); /** - * The type of document. `DOCUMENT_TYPE_PAYSTUB`: A paystub. `DOCUMENT_TYPE_BANK_STATEMENT`: A bank statement. `DOCUMENT_TYPE_US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `DOCUMENT_TYPE_US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `DOCUMENT_TYPE_GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `DOCUMENT_TYPE_NONE`: Used to indicate that there is no underlying document for the data. `DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `UNKNOWN`: Document type could not be determined. + * The type of document. `DOCUMENT_TYPE_PAYSTUB`: A paystub. `DOCUMENT_TYPE_BANK_STATEMENT`: A bank statement. `DOCUMENT_TYPE_US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `DOCUMENT_TYPE_US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `DOCUMENT_TYPE_GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `DOCUMENT_TYPE_NONE`: Used to indicate that there is no underlying document for the data. `DOCUMENT_TYPE_US_TAX_1099_MISC`: A Form 1099-MISC information return reporting miscellaneous income. `DOCUMENT_TYPE_US_TAX_1099_K`: A Form 1099-K information return reporting payment card and third-party network transactions. `DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `DOCUMENT_TYPE_US_STUDENT_I20`: A Form I-20 Certificate of Eligibility for Nonimmigrant Student Status. `UNKNOWN`: Document type could not be determined. * @export * @enum {string} */ @@ -1515,6 +1546,7 @@ var DocType; DocType["DocumentTypeUsTax1099Misc"] = "DOCUMENT_TYPE_US_TAX_1099_MISC"; DocType["DocumentTypeUsTax1099K"] = "DOCUMENT_TYPE_US_TAX_1099_K"; DocType["DocumentTypePlaidGeneratedPaystubPdf"] = "DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF"; + DocType["DocumentTypeUsStudentI20"] = "DOCUMENT_TYPE_US_STUDENT_I20"; })(DocType = exports.DocType || (exports.DocType = {})); /** * High level summary of whether the document in the provided image matches the formatting rules and security checks for the associated jurisdiction. For example, most identity documents have formatting rules like the following: The image of the person\'s face must have a certain contrast in order to highlight skin tone The subject in the document\'s image must remove eye glasses and pose in a certain way The informational fields (name, date of birth, ID number, etc.) must be colored and aligned according to specific rules Security features like watermarks and background patterns must be present So a `match` status for this field indicates that the document in the provided image seems to conform to the various formatting and security rules associated with the detected document. @@ -1637,7 +1669,7 @@ var EntityDocumentType; EntityDocumentType["TaxId"] = "tax_id"; })(EntityDocumentType = exports.EntityDocumentType || (exports.EntityDocumentType = {})); /** - * Shorthand identifier for a specific screening list for entities. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_SOE`: State Owned Enterprise List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `US_CAP`: US OFAC Correspondent Account or Payable-Through Account Sanctions `US_FSE`: US OFAC Foreign Sanctions Evaders `US_MBS`: US Non-SDN Menu-Based Sanctions `US_SDN`: US Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `US_CMC`: US OFAC Non-SDN Chinese Military-Industrial Complex List `US_UVL`: Bureau of Industry and Security Unverified List `US_SAM`: US System for Award Management Exclusion List `US_TEL`: US Terrorist Exclusion List `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List + * Shorthand identifier for a specific screening list for entities. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_SOE`: State Owned Enterprise List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `US_CAP`: US OFAC Correspondent Account or Payable-Through Account Sanctions `US_FSE`: US OFAC Foreign Sanctions Evaders `US_MBS`: US Non-SDN Menu-Based Sanctions `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `US_CMC`: US OFAC Non-SDN Chinese Military-Industrial Complex List `US_UVL`: Bureau of Industry and Security Unverified List `US_SAM`: US System for Award Management Exclusion List `US_TEL`: US Terrorist Exclusion List `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List * @export * @enum {string} */ @@ -2111,7 +2143,7 @@ var IncomeBreakdownType; IncomeBreakdownType["Null"] = "null"; })(IncomeBreakdownType = exports.IncomeBreakdownType || (exports.IncomeBreakdownType = {})); /** - * The version of Income Insights to use. + * The version of Income Insights to use. This value is not shared across API calls for the same resource. If it is omitted from a request, the default version is used, even if a version was set in an earlier call such as `/link/token/create` or `/cra/check_report/create`. * @export * @enum {string} */ @@ -2161,7 +2193,7 @@ var IncomeVerificationSourceType; IncomeVerificationSourceType["Payroll"] = "payroll"; })(IncomeVerificationSourceType = exports.IncomeVerificationSourceType || (exports.IncomeVerificationSourceType = {})); /** - * Shorthand identifier for a specific screening list for individuals. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_CIA`: CIA List of Chiefs of State and Cabinet Members `IZ_IPL`: Interpol Red Notices for Wanted Persons List `IZ_PEP`: Politically Exposed Persons List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List `US_DPL`: Bureau of Industry and Security Denied Persons List `US_DTC`: US Department of State AECA Debarred `US_FBI`: US Department of Justice FBI Wanted List `US_FSE`: US OFAC Foreign Sanctions Evaders `US_ISN`: US Department of State Nonproliferation Sanctions `US_PLC`: US OFAC Palestinian Legislative Council `US_SAM`: US System for Award Management Exclusion List `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `SG_SOF`: Government of Singapore Terrorists and Terrorist Entities `TR_TWL`: Government of Turkey Terrorist Wanted List `TR_DFD`: Government of Turkey Domestic Freezing Decisions `TR_FOR`: Government of Turkey Foreign Freezing Requests `TR_WMD`: Government of Turkey Weapons of Mass Destruction `TR_CMB`: Government of Turkey Capital Markets Board + * Shorthand identifier for a specific screening list for individuals. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_CIA`: CIA List of Chiefs of State and Cabinet Members `IZ_IPL`: Interpol Red Notices for Wanted Persons List `IZ_PEP`: Politically Exposed Persons List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `UK_HMC`: Foreign, Commonwealth & Development Office UK Sanctions List `US_DPL`: Bureau of Industry and Security Denied Persons List `US_DTC`: US Department of State AECA Debarred `US_FBI`: US Department of Justice FBI Wanted List `US_FSE`: US OFAC Foreign Sanctions Evaders `US_ISN`: US Department of State Nonproliferation Sanctions `US_MBS`: US Non-SDN Menu-Based Sanctions `US_PLC`: US OFAC Palestinian Legislative Council `US_SAM`: US System for Award Management Exclusion List `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `SG_SOF`: Government of Singapore Terrorists and Terrorist Entities `TR_TWL`: Government of Turkey Terrorist Wanted List `TR_DFD`: Government of Turkey Domestic Freezing Decisions `TR_FOR`: Government of Turkey Foreign Freezing Requests `TR_WMD`: Government of Turkey Weapons of Mass Destruction `TR_CMB`: Government of Turkey Capital Markets Board * @export * @enum {string} */ @@ -2381,7 +2413,7 @@ var ItemUpdateTypeEnum; ItemUpdateTypeEnum["UserPresentRequired"] = "user_present_required"; })(ItemUpdateTypeEnum = exports.ItemUpdateTypeEnum || (exports.ItemUpdateTypeEnum = {})); /** - * The method used to populate Auth data for the Item. This field is only populated for Items that have had Auth numbers data set on at least one of its accounts, and will be `null` otherwise. For info about the various flows, see our [Auth coverage documentation](https://plaid.com/docs/auth/coverage/). `INSTANT_AUTH`: The Item\'s Auth data was provided directly by the user\'s institution connection. `INSTANT_MATCH`: The Item\'s Auth data was provided via the Instant Match fallback flow. `AUTOMATED_MICRODEPOSITS`: The Item\'s Auth data was provided via the Automated Micro-deposits flow. `SAME_DAY_MICRODEPOSITS`: The Item\'s Auth data was provided via the Same-Day Micro-deposits flow. `INSTANT_MICRODEPOSITS`: The Item\'s Auth data was provided via the Instant Micro-deposits flow. `DATABASE_MATCH`: The Item\'s Auth data was provided via the Database Match flow. `DATABASE_INSIGHTS`: The Item\'s Auth data was provided via the Database Insights flow. `TRANSFER_MIGRATED`: The Item\'s Auth data was provided via [`/transfer/migrate_account`](https://plaid.com/docs/api/products/transfer/account-linking/#migrate-account-into-transfers). `INVESTMENTS_FALLBACK`: The Item\'s Auth data for Investments Move was provided via a [fallback flow](https://plaid.com/docs/investments-move/#fallback-flows). + * The method used to populate Auth data for the Item. This field is only populated for Items that have had Auth numbers data set on at least one of their accounts, and will be `null` otherwise. For info about the various flows, see our [Auth coverage documentation](https://plaid.com/docs/auth/coverage/). `INSTANT_AUTH`: The Item\'s Auth data was provided directly by the user\'s institution connection. `INSTANT_MATCH`: The Item\'s Auth data was provided via the Instant Match fallback flow. `AUTOMATED_MICRODEPOSITS`: The Item\'s Auth data was provided via the Automated Micro-deposits flow. `SAME_DAY_MICRODEPOSITS`: The Item\'s Auth data was provided via the Same-Day Micro-deposits flow. `INSTANT_MICRODEPOSITS`: The Item\'s Auth data was provided via the Instant Micro-deposits flow. `DATABASE_MATCH`: The Item\'s Auth data was provided via the Database Match flow. `DATABASE_INSIGHTS`: The Item\'s Auth data was provided via the Database Insights flow. `TRANSFER_MIGRATED`: The Item\'s Auth data was provided via [`/transfer/migrate_account`](https://plaid.com/docs/api/products/transfer/account-linking/#migrate-account-into-transfers). `INVESTMENTS_FALLBACK`: The Item\'s Auth data for Investments Move was provided via a [fallback flow](https://plaid.com/docs/investments-move/#fallback-flows). * @export * @enum {string} */ @@ -3131,7 +3163,7 @@ var PendingDisconnectWebhookReason; PendingDisconnectWebhookReason["TokenExpiration"] = "INSTITUTION_TOKEN_EXPIRATION"; })(PendingDisconnectWebhookReason = exports.PendingDisconnectWebhookReason || (exports.PendingDisconnectWebhookReason = {})); /** - * Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 2025, you may only receive the `v2` taxonomy. + * Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 3, 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 3, 2025, you may only receive the `v2` taxonomy. * @export * @enum {string} */ @@ -3209,6 +3241,19 @@ var PlaidErrorType; PlaidErrorType["ConsumerReportError"] = "CONSUMER_REPORT_ERROR"; PlaidErrorType["UserError"] = "USER_ERROR"; PlaidErrorType["IdempotencyError"] = "IDEMPOTENCY_ERROR"; + PlaidErrorType["AssetsError"] = "ASSETS_ERROR"; + PlaidErrorType["CraMonitoringError"] = "CRA_MONITORING_ERROR"; + PlaidErrorType["CreditProfileReportError"] = "CREDIT_PROFILE_REPORT_ERROR"; + PlaidErrorType["EncompassError"] = "ENCOMPASS_ERROR"; + PlaidErrorType["EnrichError"] = "ENRICH_ERROR"; + PlaidErrorType["FraudInsightsError"] = "FRAUD_INSIGHTS_ERROR"; + PlaidErrorType["FreddieMacError"] = "FREDDIE_MAC_ERROR"; + PlaidErrorType["LinkDeliveryError"] = "LINK_DELIVERY_ERROR"; + PlaidErrorType["ProfileError"] = "PROFILE_ERROR"; + PlaidErrorType["RecurringTransactionsError"] = "RECURRING_TRANSACTIONS_ERROR"; + PlaidErrorType["StatementsError"] = "STATEMENTS_ERROR"; + PlaidErrorType["TransferRecurringError"] = "TRANSFER_RECURRING_ERROR"; + PlaidErrorType["TransferRefundError"] = "TRANSFER_REFUND_ERROR"; })(PlaidErrorType = exports.PlaidErrorType || (exports.PlaidErrorType = {})); /** * The version of the LendScore to use. Required if using LendScore. @@ -3362,6 +3407,7 @@ var ProcessorTokenCreateRequestProcessorEnum; ProcessorTokenCreateRequestProcessorEnum["Pay"] = "pay"; ProcessorTokenCreateRequestProcessorEnum["Natural"] = "natural"; ProcessorTokenCreateRequestProcessorEnum["Kanmon"] = "kanmon"; + ProcessorTokenCreateRequestProcessorEnum["Kick"] = "kick"; })(ProcessorTokenCreateRequestProcessorEnum = exports.ProcessorTokenCreateRequestProcessorEnum || (exports.ProcessorTokenCreateRequestProcessorEnum = {})); /** * @export @@ -3431,7 +3477,7 @@ var Products; Products["ProtectTransactions"] = "protect_transactions"; })(Products = exports.Products || (exports.Products = {})); /** - * The reason for terminating products. `FRAUD_FIRST_PARTY`: The end user who owns the connected bank account committed fraud `FRAUD_FALSE_IDENTITY`: The end user created the connection using false identity information or stolen credentials `FRAUD_ABUSE`: The end user is abusing the client\'s service or platform through their connected account `FRAUD_OTHER`: Other fraud-related reasons involving the end user not covered by the specific fraud categories `FRAUD_TRANSACTION`: Fraud occurred at the transaction level, such as an unauthorized transaction, card testing, chargeback, ACH return, or dispute `CONSUMER_LOAN_PAID_OFF`: The end user paid off their loan and no longer needs the product `CONSUMER_ACCOUNT_CLOSED`: The end user closed their account with the client and no longer needs the product `CONSUMER_CHARGE_OFF`: The end user\'s account has been charged off `CONSUMER_PAYMENT_METHOD_SWITCHED`: The end user switched to a different payment method and no longer needs the product `USER_OFFBOARDING`: The user is offboarding from the service or platform `DUPLICATE_ITEM`: The connection is a duplicate of another existing connection for the same user `BILLING_TERMINATION`: The user\'s billing or subscription relationship has ended `OTHER`: Any other reason for terminating products not covered by the above categories + * The reason for terminating products. `FRAUD_FIRST_PARTY`: The end user who owns the connected bank account committed fraud using their real identity `FRAUD_FALSE_IDENTITY`: The connection was created using a false or stolen identity `FRAUD_ABUSE`: The end user is abusing the client\'s service or platform (for example, automation or excessive retries) through their connected account `FRAUD_OTHER`: Fraud-related, but not covered by the specific fraud categories above; `reason_note` should clarify `FRAUD_TRANSACTION`: Fraud occurred at the transaction level, such as an unauthorized transaction, card testing, chargeback, ACH return, or dispute `CONSUMER_LOAN_PAID_OFF`: The end user paid off their loan and no longer needs the product `CONSUMER_ACCOUNT_CLOSED`: The end user closed their account with the client and no longer needs the product `CONSUMER_CHARGE_OFF`: The end user\'s account has been charged off `CONSUMER_PAYMENT_METHOD_SWITCHED`: The end user switched to a different payment method and no longer needs the product `USER_OFFBOARDING`: The user is offboarding from the client\'s service or platform `DUPLICATE_ITEM`: This Item is a duplicate of another active Item for the same user `BILLING_TERMINATION`: The client\'s billing or subscription relationship with the end user has ended `OTHER`: None of the above; `reason_note` should clarify * @export * @enum {string} */ @@ -4092,7 +4138,7 @@ var SignalScheduleDefaultPaymentMethod; SignalScheduleDefaultPaymentMethod["MultiplePaymentMethods"] = "MULTIPLE_PAYMENT_METHODS"; })(SignalScheduleDefaultPaymentMethod = exports.SignalScheduleDefaultPaymentMethod || (exports.SignalScheduleDefaultPaymentMethod = {})); /** - * A type indicating whether a dashboard user, an API-based user, or Plaid last touched this object. + * A type indicating who or what last touched this object. `dashboard`, `link`, and `api` indicate the originating surface; `system` indicates Plaid. `retro` indicates a screening created retroactively via a bulk screening creation. * @export * @enum {string} */ @@ -4102,9 +4148,10 @@ var Source; Source["Link"] = "link"; Source["Api"] = "api"; Source["System"] = "system"; + Source["Retro"] = "retro"; })(Source = exports.Source || (exports.Source = {})); /** - * The result of the statement refresh extraction `SUCCESS`: The statements were successfully extracted and can be listed via `/statements/list/` and downloaded via `/statements/download/`. `FAILURE`: The statements failed to be extracted. + * The result of the statement refresh extraction `SUCCESS`: The statements were successfully extracted and can be listed via `/statements/list` and downloaded via `/statements/download`. `FAILURE`: The statements failed to be extracted. * @export * @enum {string} */ @@ -4114,7 +4161,7 @@ var StatementsRefreshCompleteResult; StatementsRefreshCompleteResult["Failure"] = "FAILURE"; })(StatementsRefreshCompleteResult = exports.StatementsRefreshCompleteResult || (exports.StatementsRefreshCompleteResult = {})); /** - * An instruction specifying what steps the new Identity Verification attempt should require the user to complete: `reset` - Restart the user at the beginning of the session, regardless of whether they successfully completed part of their previous session. `incomplete` - Start the new session at the step that the user failed in the previous session, skipping steps that have already been successfully completed. `infer` - If the most recent Identity Verification attempt associated with the given `client_user_id` has a status of `failed` or `expired`, retry using the `incomplete` strategy. Otherwise, use the `reset` strategy. `custom` - Start the new session with a custom configuration, specified by the value of the `steps` field Note: The `incomplete` strategy cannot be applied if the session\'s failing step is `screening` or `risk_check`. The `infer` strategy cannot be applied if the session\'s status is still `active` + * An instruction specifying what steps the new Identity Verification attempt should require the user to complete: `reset` - Restart the user at the beginning of the session, regardless of whether they successfully completed part of their previous session. `incomplete` - Start the new session at the step that the user failed in the previous session, skipping steps that have already been successfully completed. `infer` - If the most recent Identity Verification attempt associated with the given `client_user_id` has a status of `failed` or `expired`, retry using the `incomplete` strategy. Otherwise, use the `reset` strategy. `custom` - Start the new session with a custom configuration, specified by the value of the `steps` field Note: The `incomplete` strategy cannot be applied if the session\'s failing step is `watchlist_screening` or `risk_check`. The `infer` strategy cannot be applied if the session\'s status is still `active` * @export * @enum {string} */ @@ -4163,7 +4210,7 @@ var StudentRepaymentPlanTypeEnum; StudentRepaymentPlanTypeEnum["IncomeContingentRepayment"] = "income-contingent repayment"; StudentRepaymentPlanTypeEnum["IncomeBasedRepayment"] = "income-based repayment"; StudentRepaymentPlanTypeEnum["IncomeSensitiveRepayment"] = "income-sensitive repayment"; - StudentRepaymentPlanTypeEnum["InterestOnly"] = "interest-only"; + StudentRepaymentPlanTypeEnum["InterestOnly"] = "interest only"; StudentRepaymentPlanTypeEnum["Other"] = "other"; StudentRepaymentPlanTypeEnum["PayAsYouEarn"] = "pay as you earn"; StudentRepaymentPlanTypeEnum["RevisedPayAsYouEarn"] = "revised pay as you earn"; @@ -4276,7 +4323,7 @@ var TransactionBaseTransactionTypeEnum; TransactionBaseTransactionTypeEnum["Unresolved"] = "unresolved"; })(TransactionBaseTransactionTypeEnum = exports.TransactionBaseTransactionTypeEnum || (exports.TransactionBaseTransactionTypeEnum = {})); /** - * An identifier classifying the transaction type. This field is populated for European institutions, as well as certain institutions in the United States. For institutions where this classification is not available, this field is set to `null`. `adjustment:` Bank adjustment `atm:` Cash deposit or withdrawal via an automated teller machine `bank charge:` Charge or fee levied by the institution `bill payment`: Payment of a bill `cash:` Cash deposit or withdrawal `cashback:` Cash withdrawal while making a debit card purchase `cheque:` Document ordering the payment of money to another person or organization `direct debit:` Automatic withdrawal of funds initiated by a third party at a regular interval `interest:` Interest earned or incurred `payment:` One-off outbound payment not classified as a bill payment, direct debit, or standing order `purchase:` Purchase made with a debit or credit card `refund:` Merchant credit or return, such as a refund of a prior purchase `standing order:` Payment instructed by the account holder to a third party at a regular interval `transfer:` Transfer of money between accounts + * An identifier classifying the transaction type. This field is populated for European institutions, as well as certain institutions in the United States. For institutions where this classification is not available, this field is set to `null`. `adjustment:` Bank adjustment `atm:` Cash deposit or withdrawal via an automated teller machine `bank charge:` Charge or fee levied by the institution `bill payment`: Payment of a bill `cash:` Cash deposit or withdrawal `cash advance:` Cash advance drawn against a credit card or line of credit `cashback:` Cash withdrawal while making a debit card purchase `cheque:` Document ordering the payment of money to another person or organization `direct debit:` Automatic withdrawal of funds initiated by a third party at a regular interval `interest:` Interest earned or incurred `late fee:` Fee associated with a late or past-due payment `membership fee:` Annual or recurring membership fee `payment:` One-off outbound payment not classified as a bill payment, direct debit, or standing order `purchase:` Purchase made with a debit or credit card `refund:` Merchant credit or return, such as a refund of a prior purchase `returned item fee:` Fee for a returned item, such as a returned check or stop payment `standing order:` Payment instructed by the account holder to a third party at a regular interval `transfer:` Transfer of money between accounts * @export * @enum {string} */ @@ -4287,13 +4334,17 @@ var TransactionCode; TransactionCode["BankCharge"] = "bank charge"; TransactionCode["BillPayment"] = "bill payment"; TransactionCode["Cash"] = "cash"; + TransactionCode["CashAdvance"] = "cash advance"; TransactionCode["Cashback"] = "cashback"; TransactionCode["Cheque"] = "cheque"; TransactionCode["DirectDebit"] = "direct debit"; TransactionCode["Interest"] = "interest"; + TransactionCode["LateFee"] = "late fee"; + TransactionCode["MembershipFee"] = "membership fee"; TransactionCode["Payment"] = "payment"; TransactionCode["Purchase"] = "purchase"; TransactionCode["Refund"] = "refund"; + TransactionCode["ReturnedItemFee"] = "returned item fee"; TransactionCode["StandingOrder"] = "standing order"; TransactionCode["Transfer"] = "transfer"; TransactionCode["Null"] = "null"; @@ -4474,7 +4525,7 @@ var TransferEventListTransferType; TransferEventListTransferType["Null"] = "null"; })(TransferEventListTransferType = exports.TransferEventListTransferType || (exports.TransferEventListTransferType = {})); /** - * The type of event that this transfer represents. Event types with prefix `sweep` represents events for Plaid Ledger sweeps. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer has been successfully completed by the payment network. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `returned`: A posted transfer was returned. `swept`: The transfer was swept to / from the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer\'s business checking account. `return_swept`: Due to the transfer being returned, funds were pulled from or pushed back to the sweep account. `sweep.pending`: A new ledger sweep was created; it is in the pending state. `sweep.posted`: The ledger sweep has been successfully submitted to the payment network. `sweep.settled`: The transaction has settled in the funding account. This means that funds withdrawn from Plaid Ledger balance have reached the funding account, or funds to be deposited into the Plaid Ledger Balance have been pulled, and the hold period has begun. `sweep.returned`: A posted ledger sweep was returned. `sweep.failed`: The ledger sweep failed, no funds were moved. `sweep.funds_available`: Funds from the ledger sweep have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `refund.pending`: A new refund was created; it is in the pending state. `refund.cancelled`: The refund was cancelled. `refund.failed`: The refund failed, no funds were moved. `refund.posted`: The refund has been successfully submitted to the payment network. `refund.settled`: The refund transaction has settled in the Plaid linked account. `refund.returned`: A posted refund was returned. `refund.swept`: The refund was swept from the sweep account. `refund.return_swept`: Due to the refund being returned, funds were pushed back to the sweep account. + * The type of event that this transfer represents. Event types with prefix `sweep` represent events for Plaid Ledger sweeps. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer has been successfully completed by the payment network. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `guaranteed`: The transfer has been fully guaranteed by Plaid. `returned`: A posted transfer was returned. `guarantee_reimbursed`: Plaid reimbursed the client for the loss on a returned guaranteed transfer. The `event_amount` is the reimbursed amount. `client_return_recovered`: The client reported recovering the loss on a returned transfer via `/transfer/return/recover`, and Plaid debited the recovered amount from the client\'s ledger. The `event_amount` is the recovered amount. `plaid_return_recovered`: Plaid recovered the loss on a returned transfer by successfully reinitiating it. The `event_amount` is the recovered amount. Client should stop their return recovery effort. `swept`: The transfer was swept to / from the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer\'s business checking account. `return_swept`: Due to the transfer being returned, funds were pulled from or pushed back to the sweep account. `sweep.pending`: A new ledger sweep was created; it is in the pending state. `sweep.posted`: The ledger sweep has been successfully submitted to the payment network. `sweep.settled`: The transaction has settled in the funding account. This means that funds withdrawn from Plaid Ledger balance have reached the funding account, or funds to be deposited into the Plaid Ledger Balance have been pulled, and the hold period has begun. `sweep.returned`: A posted ledger sweep was returned. `sweep.failed`: The ledger sweep failed, no funds were moved. `sweep.funds_available`: Funds from the ledger sweep have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `refund.pending`: A new refund was created; it is in the pending state. `refund.cancelled`: The refund was cancelled. `refund.failed`: The refund failed, no funds were moved. `refund.posted`: The refund has been successfully submitted to the payment network. `refund.settled`: The refund transaction has settled in the Plaid linked account. `refund.returned`: A posted refund was returned. `refund.swept`: The refund was swept from the sweep account. `refund.return_swept`: Due to the refund being returned, funds were pushed back to the sweep account. * @export * @enum {string} */ @@ -4486,7 +4537,11 @@ var TransferEventType; TransferEventType["Posted"] = "posted"; TransferEventType["Settled"] = "settled"; TransferEventType["FundsAvailable"] = "funds_available"; + TransferEventType["Guaranteed"] = "guaranteed"; TransferEventType["Returned"] = "returned"; + TransferEventType["GuaranteeReimbursed"] = "guarantee_reimbursed"; + TransferEventType["ClientReturnRecovered"] = "client_return_recovered"; + TransferEventType["PlaidReturnRecovered"] = "plaid_return_recovered"; TransferEventType["Swept"] = "swept"; TransferEventType["SweptSettled"] = "swept_settled"; TransferEventType["ReturnSwept"] = "return_swept"; @@ -4572,7 +4627,7 @@ var TransferLedgerSweepSimulateEventType; TransferLedgerSweepSimulateEventType["Failed"] = "sweep.failed"; })(TransferLedgerSweepSimulateEventType = exports.TransferLedgerSweepSimulateEventType || (exports.TransferLedgerSweepSimulateEventType = {})); /** - * The network or rails used for the transfer. For transfers submitted as `ach` or `same-day-ach`, the Standard ACH cutoff is 8:30 PM Eastern Time. For transfers submitted as `same-day-ach`, the Same Day ACH cutoff is 3:00 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail. For transfers submitted as `rtp`, Plaid will automatically route between the Real-Time Payments (RTP) rail by TCH or FedNow rails as necessary. If a transfer is submitted as `rtp` and the counterparty account is not eligible for RTP, the `/transfer/authorization/create` request will fail with an `INVALID_FIELD` error code. To pre-check to determine whether a counterparty account can support RTP, call `/transfer/capabilities/get` before calling `/transfer/authorization/create`. Wire transfers are currently in early availability. To request access to `wire` as a payment network, contact your account manager. For transfers submitted as `wire`, the `type` must be `credit`; wire debits are not supported. The cutoff to submit a wire payment is 6:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail. + * The network or rails used for the transfer. For transfers submitted as `ach` or `same-day-ach`, the Standard ACH cutoff is 8:30 PM Eastern Time. For transfers submitted as `same-day-ach`, the Same Day ACH cutoff is 3:00 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail. For transfers submitted as `rtp`, Plaid will automatically route between the Real-Time Payments (RTP) rail by TCH or FedNow rails as necessary. If a transfer is submitted as `rtp` and the counterparty account is not eligible for RTP, the `/transfer/authorization/create` request will fail with an `INVALID_FIELD` error code. To pre-check to determine whether a counterparty account can support RTP, call `/transfer/capabilities/get` before calling `/transfer/authorization/create`. Wire transfers are currently in early availability. To request access to `wire` as a payment network, contact your account manager. For transfers submitted as `wire`, the `type` must be `credit`; wire debits are not supported. The cutoff to submit a wire payment is 6:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail. Support for `rfp` (request for payment) is currently in closed beta. To learn more, contact your Plaid account manager. For transfers submitted as `rfp`, the `type` must be `debit`. * @export * @enum {string} */ @@ -4582,6 +4637,7 @@ var TransferNetwork; TransferNetwork["SameDayAch"] = "same-day-ach"; TransferNetwork["Rtp"] = "rtp"; TransferNetwork["Wire"] = "wire"; + TransferNetwork["Rfp"] = "rfp"; })(TransferNetwork = exports.TransferNetwork || (exports.TransferNetwork = {})); /** * Networks eligible for recurring transfers. @@ -4892,6 +4948,11 @@ var WarningWarningCodeEnum; WarningWarningCodeEnum["OwnersUnavailable"] = "OWNERS_UNAVAILABLE"; WarningWarningCodeEnum["InvestmentsUnavailable"] = "INVESTMENTS_UNAVAILABLE"; WarningWarningCodeEnum["TransactionsUnavailable"] = "TRANSACTIONS_UNAVAILABLE"; + WarningWarningCodeEnum["BankIncomeInsightsInsufficientData"] = "BANK_INCOME_INSIGHTS_INSUFFICIENT_DATA"; + WarningWarningCodeEnum["BankIncomeInsightsIncomplete"] = "BANK_INCOME_INSIGHTS_INCOMPLETE"; + WarningWarningCodeEnum["BankIncomeInsightsStatusInProgress"] = "BANK_INCOME_INSIGHTS_STATUS_IN_PROGRESS"; + WarningWarningCodeEnum["BankIncomeInsightsInternalError"] = "BANK_INCOME_INSIGHTS_INTERNAL_ERROR"; + WarningWarningCodeEnum["BankIncomeInsightsMismatchedDaysRequested"] = "BANK_INCOME_INSIGHTS_MISMATCHED_DAYS_REQUESTED"; })(WarningWarningCodeEnum = exports.WarningWarningCodeEnum || (exports.WarningWarningCodeEnum = {})); /** * The kind of official document represented by this object. `birth_certificate` - A certificate of birth `drivers_license` - A license to operate a motor vehicle `immigration_number` - Immigration or residence documents `military_id` - Identification issued by a military group `other` - Any document not covered by other categories `passport` - An official passport issued by a government `personal_identification` - Any generic personal identification that is not covered by other categories `ration_card` - Identification that entitles the holder to rations `ssn` - United States Social Security Number `student_id` - Identification issued by an educational institution `tax_id` - Identification issued for the purpose of collecting taxes `travel_document` - Visas, entry permits, refugee documents, etc. `voter_id` - Identification issued for the purpose of voting @@ -4991,7 +5052,7 @@ var WebhookType; WebhookType["Assets"] = "ASSETS"; })(WebhookType = exports.WebhookType || (exports.WebhookType = {})); /** - * The type of rate which indicates how the predicted yield was calculated. It is one of: `coupon`: the annualized interest rate for securities with a one-year term or longer, such as treasury notes and bonds. `coupon_equivalent`: the calculated equivalent for the annualized interest rate factoring in the discount rate and time to maturity, for shorter term, non-interest-bearing securities such as treasury bills. `discount`: the rate at which the present value or cost is discounted from the future value upon maturity, also known as the face value. `yield`: the total predicted rate of return factoring in both the discount rate and the coupon rate, applicable to securities such as exchange-traded bonds which can both be interest-bearing as well as sold at a discount off its face value. + * The type of rate which indicates how the predicted yield was calculated. It is one of: `coupon`: the annualized interest rate for securities with a one-year term or longer, such as treasury notes and bonds. `coupon_equivalent`: the calculated equivalent for the annualized interest rate factoring in the discount rate and time to maturity, for shorter term, non-interest-bearing securities such as treasury bills. `discount`: the rate at which the present value or cost is discounted from the future value upon maturity, also known as the face value. `yield`: the total predicted rate of return factoring in both the discount rate and the coupon rate, applicable to securities such as exchange-traded bonds which can both be interest-bearing as well as sold at a discount off their face value. * @export * @enum {string} */ @@ -5334,7 +5395,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -5551,7 +5612,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5587,7 +5648,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5623,7 +5684,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5731,7 +5792,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5767,7 +5828,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5803,7 +5864,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5839,7 +5900,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5875,7 +5936,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5911,7 +5972,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5947,7 +6008,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5983,7 +6044,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6019,7 +6080,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6055,7 +6116,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6091,7 +6152,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6127,7 +6188,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6163,7 +6224,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6198,8 +6259,8 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6235,7 +6296,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6271,7 +6332,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6307,7 +6368,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6342,8 +6403,8 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -6630,7 +6691,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -6738,7 +6799,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -6897,6 +6958,9 @@ const PlaidApiAxiosParamCreator = function (configuration) { const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication oauth2 required + // oauth required + yield common_1.setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required @@ -6912,7 +6976,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -6933,6 +6997,9 @@ const PlaidApiAxiosParamCreator = function (configuration) { const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication oauth2 required + // oauth required + yield common_1.setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required @@ -6984,8 +7051,8 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -7005,6 +7072,9 @@ const PlaidApiAxiosParamCreator = function (configuration) { const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication oauth2 required + // oauth required + yield common_1.setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required @@ -7020,7 +7090,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -7041,6 +7111,9 @@ const PlaidApiAxiosParamCreator = function (configuration) { const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication oauth2 required + // oauth required + yield common_1.setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required @@ -7056,7 +7129,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -7077,6 +7150,9 @@ const PlaidApiAxiosParamCreator = function (configuration) { const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication oauth2 required + // oauth required + yield common_1.setOAuthToObject(localVarHeaderParameter, "oauth2", ["cra:report:read"], configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required @@ -7092,7 +7168,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -7560,7 +7636,43 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet: (craReportGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'craReportGetRequest' is not null or undefined + common_1.assertParamExists('craReportGet', 'craReportGetRequest', craReportGetRequest); + const localVarPath = `/cra/report/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(craReportGetRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -8244,8 +8356,8 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -8497,7 +8609,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -8602,6 +8714,47 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + fdxConsentsList: (customerId, status, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'customerId' is not null or undefined + common_1.assertParamExists('fdxConsentsList', 'customerId', customerId); + const localVarPath = `/fdx/consents`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'GET' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + if (customerId !== undefined) { + localVarQueryParameter['customerId'] = customerId; + } + if (status !== undefined) { + localVarQueryParameter['status'] = status; + } + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -8964,7 +9117,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -9829,7 +9982,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -10764,7 +10917,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -10800,7 +10953,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -10980,7 +11133,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -11161,7 +11314,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -11269,7 +11422,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -11340,7 +11493,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -11844,7 +11997,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -11880,7 +12033,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -11916,7 +12069,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -11952,7 +12105,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -12205,7 +12358,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -12241,7 +12394,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -12277,7 +12430,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }), /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -12347,6 +12500,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed: (sandboxFdxConsentSeedRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'sandboxFdxConsentSeedRequest' is not null or undefined + common_1.assertParamExists('sandboxFdxConsentSeed', 'sandboxFdxConsentSeedRequest', sandboxFdxConsentSeedRequest); + const localVarPath = `/sandbox/fdx/consent/seed`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxFdxConsentSeedRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -12456,7 +12645,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -12564,7 +12753,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -12924,7 +13113,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -13176,7 +13365,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -13608,7 +13797,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -13644,7 +13833,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -13824,7 +14013,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -13968,7 +14157,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -14148,7 +14337,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -14436,7 +14625,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -15012,7 +15201,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -15335,6 +15524,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover: (transferReturnRecoverRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'transferReturnRecoverRequest' is not null or undefined + common_1.assertParamExists('transferReturnRecover', 'transferReturnRecoverRequest', transferReturnRecoverRequest); + const localVarPath = `/transfer/return/recover`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferReturnRecoverRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -15480,7 +15705,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -15502,6 +15727,9 @@ const PlaidApiAxiosParamCreator = function (configuration) { const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication oauth2 required + // oauth required + yield common_1.setOAuthToObject(localVarHeaderParameter, "oauth2", ["user:write"], configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required @@ -15520,7 +15748,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -15856,7 +16084,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -17067,7 +17295,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -17146,7 +17374,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17159,7 +17387,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17172,7 +17400,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17211,7 +17439,7 @@ const PlaidApiFp = function (configuration) { }, /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17224,7 +17452,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17237,7 +17465,7 @@ const PlaidApiFp = function (configuration) { }, /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17250,7 +17478,7 @@ const PlaidApiFp = function (configuration) { }, /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17263,7 +17491,7 @@ const PlaidApiFp = function (configuration) { }, /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17276,7 +17504,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17289,7 +17517,7 @@ const PlaidApiFp = function (configuration) { }, /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17302,7 +17530,7 @@ const PlaidApiFp = function (configuration) { }, /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17315,7 +17543,7 @@ const PlaidApiFp = function (configuration) { }, /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17328,7 +17556,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17341,7 +17569,7 @@ const PlaidApiFp = function (configuration) { }, /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17354,7 +17582,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17367,7 +17595,7 @@ const PlaidApiFp = function (configuration) { }, /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17379,8 +17607,8 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17393,7 +17621,7 @@ const PlaidApiFp = function (configuration) { }, /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17406,7 +17634,7 @@ const PlaidApiFp = function (configuration) { }, /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17419,7 +17647,7 @@ const PlaidApiFp = function (configuration) { }, /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17431,8 +17659,8 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17535,7 +17763,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -17574,7 +17802,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -17639,7 +17867,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -17665,8 +17893,8 @@ const PlaidApiFp = function (configuration) { }); }, /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -17678,7 +17906,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -17691,7 +17919,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -17704,7 +17932,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -17873,7 +18101,20 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet(craReportGetRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.craReportGet(craReportGetRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -18120,8 +18361,8 @@ const PlaidApiFp = function (configuration) { }); }, /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -18212,7 +18453,7 @@ const PlaidApiFp = function (configuration) { }, /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -18249,6 +18490,20 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + fdxConsentsList(customerId, status, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.fdxConsentsList(customerId, status, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -18381,7 +18636,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -18694,7 +18949,7 @@ const PlaidApiFp = function (configuration) { }, /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -19031,7 +19286,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -19044,7 +19299,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -19109,7 +19364,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -19175,7 +19430,7 @@ const PlaidApiFp = function (configuration) { }, /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -19214,7 +19469,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -19239,7 +19494,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -19421,7 +19676,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -19434,7 +19689,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -19447,7 +19702,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -19460,7 +19715,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -19552,7 +19807,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -19565,7 +19820,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -19578,7 +19833,7 @@ const PlaidApiFp = function (configuration) { }, /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -19602,6 +19857,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -19642,7 +19910,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -19681,7 +19949,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -19811,7 +20079,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -19902,7 +20170,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -20058,7 +20326,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -20071,7 +20339,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -20136,7 +20404,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -20188,7 +20456,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -20253,7 +20521,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -20357,7 +20625,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -20565,7 +20833,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -20681,6 +20949,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover(transferReturnRecoverRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.transferReturnRecover(transferReturnRecoverRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -20734,7 +21015,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -20748,7 +21029,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -20868,7 +21149,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -21359,7 +21640,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.assetReportFilter(assetReportFilterRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -21420,7 +21701,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21430,7 +21711,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21440,7 +21721,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21470,7 +21751,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21480,7 +21761,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21490,7 +21771,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21500,7 +21781,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21510,7 +21791,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21520,7 +21801,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21530,7 +21811,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21540,7 +21821,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21550,7 +21831,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21560,7 +21841,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21570,7 +21851,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21580,7 +21861,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21590,7 +21871,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21599,8 +21880,8 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21610,7 +21891,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21620,7 +21901,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21630,7 +21911,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21639,8 +21920,8 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.beaconUserReview(beaconUserReviewRequest, options).then((request) => request(axios, basePath)); }, /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21719,7 +22000,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.businessVerificationGet(businessVerificationGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -21749,7 +22030,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.cashflowReportRefresh(cashflowReportRefreshRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -21799,7 +22080,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -21819,8 +22100,8 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.craCheckReportCreate(craCheckReportCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -21829,7 +22110,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -21839,7 +22120,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.craCheckReportLendScoreGet(craCheckReportLendScoreGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -21849,7 +22130,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -21979,7 +22260,17 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.craPartnerInsightsGet(craPartnerInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craReportGet(craReportGetRequest, options) { + return localVarFp.craReportGet(craReportGetRequest, options).then((request) => request(axios, basePath)); + }, + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -22169,8 +22460,8 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.creditRelayGet(creditRelayGetRequest, options).then((request) => request(axios, basePath)); }, /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -22240,7 +22531,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -22268,6 +22559,17 @@ const PlaidApiFactory = function (configuration, basePath, axios) { fdxConsentsGet(consentId, options) { return localVarFp.fdxConsentsGet(consentId, options).then((request) => request(axios, basePath)); }, + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + fdxConsentsList(customerId, status, options) { + return localVarFp.fdxConsentsList(customerId, status, options).then((request) => request(axios, basePath)); + }, /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -22370,7 +22672,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -22611,7 +22913,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -22870,7 +23172,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options).then((request) => request(axios, basePath)); }, /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -22880,7 +23182,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -22930,7 +23232,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -22981,7 +23283,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -23011,7 +23313,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -23030,7 +23332,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.processorIdentityGet(processorIdentityGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -23170,7 +23472,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -23180,7 +23482,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.processorTransactionsGet(processorTransactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -23190,7 +23492,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options).then((request) => request(axios, basePath)); }, /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -23200,7 +23502,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.processorTransactionsRefresh(processorTransactionsRefreshRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -23271,7 +23573,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -23281,7 +23583,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -23291,7 +23593,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { }, /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -23309,6 +23611,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options) { return localVarFp.sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options).then((request) => request(axios, basePath)); }, + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options) { + return localVarFp.sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options).then((request) => request(axios, basePath)); + }, /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -23340,7 +23652,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options).then((request) => request(axios, basePath)); }, /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -23370,7 +23682,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options).then((request) => request(axios, basePath)); }, /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -23470,7 +23782,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options).then((request) => request(axios, basePath)); }, /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -23540,7 +23852,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options).then((request) => request(axios, basePath)); }, /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -23660,7 +23972,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.transactionsEnrich(transactionsEnrichRequest, options).then((request) => request(axios, basePath)); }, /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -23670,7 +23982,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.transactionsGet(transactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -23720,7 +24032,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.transactionsRulesRemove(transactionsRulesRemoveRequest, options).then((request) => request(axios, basePath)); }, /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -23760,7 +24072,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.transferAuthorizationCreate(transferAuthorizationCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -23810,7 +24122,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.transferCreate(transferCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -23890,7 +24202,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.transferLedgerDeposit(transferLedgerDepositRequest, options).then((request) => request(axios, basePath)); }, /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -24050,7 +24362,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -24139,6 +24451,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { transferRepaymentReturnList(transferRepaymentReturnListRequest, options) { return localVarFp.transferRepaymentReturnList(transferRepaymentReturnListRequest, options).then((request) => request(axios, basePath)); }, + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + transferReturnRecover(transferReturnRecoverRequest, options) { + return localVarFp.transferReturnRecover(transferReturnRecoverRequest, options).then((request) => request(axios, basePath)); + }, /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -24180,7 +24502,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.userAccountSessionGet(userAccountSessionGetRequest, options).then((request) => request(axios, basePath)); }, /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -24191,7 +24513,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.userCreate(userCreateRequest, plaidNewUserAPIEnabled, options).then((request) => request(axios, basePath)); }, /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -24284,7 +24606,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -24694,7 +25016,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).assetReportFilter(assetReportFilterRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. + * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call the `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. @@ -24761,7 +25083,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. - * @summary Get balance of your Bank Transfer account + * @summary (Deprecated) Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24772,7 +25094,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. - * @summary Cancel a bank transfer + * @summary (Deprecated) Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24783,7 +25105,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. - * @summary Create a bank transfer + * @summary (Deprecated) Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24816,7 +25138,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. - * @summary Retrieve a bank transfer + * @summary (Deprecated) Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24827,7 +25149,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers + * @summary (Deprecated) List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24838,7 +25160,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid account manager. - * @summary Migrate account into Bank Transfers + * @summary (Deprecated) Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24849,7 +25171,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep + * @summary (Deprecated) Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24860,7 +25182,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps + * @summary (Deprecated) List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24871,7 +25193,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. - * @summary Evaluate risk of a bank account + * @summary (Deprecated) Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24882,7 +25204,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. - * @summary Get a Beacon Duplicate + * @summary (Deprecated) Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24893,7 +25215,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Create a fraud report for a given Beacon User. - * @summary Create a Beacon Report + * @summary (Deprecated) Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24904,7 +25226,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Returns a Beacon Report for a given Beacon Report ID. - * @summary Get a Beacon Report + * @summary (Deprecated) Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24915,7 +25237,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Reports for a Beacon User + * @summary (Deprecated) List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24926,7 +25248,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. - * @summary Get a Beacon Report Syndication + * @summary (Deprecated) Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24937,7 +25259,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. - * @summary List Beacon Report Syndications for a Beacon User + * @summary (Deprecated) List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24948,7 +25270,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. - * @summary Get Account Insights for a Beacon User + * @summary (Deprecated) Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24958,8 +25280,8 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. - * @summary Create a Beacon User + * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. + * @summary (Deprecated) Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24970,7 +25292,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. - * @summary Get a Beacon User + * @summary (Deprecated) Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24981,7 +25303,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * List all changes to the Beacon User in reverse-chronological order. - * @summary List a Beacon User\'s history + * @summary (Deprecated) List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24992,7 +25314,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to `rejected`, we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to `cleared`, we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to `cleared`. There are no restrictions on updating a Beacon User\'s status to `pending_review`. If these conditions are not met, the request will be rejected with an error explaining the issue. - * @summary Review a Beacon User + * @summary (Deprecated) Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -25002,8 +25324,8 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).beaconUserReview(beaconUserReviewRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. - * @summary Update the identity data of a Beacon User + * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud reports shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. + * @summary (Deprecated) Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -25090,7 +25412,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).businessVerificationGet(businessVerificationGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportGetRequest} cashflowReportGetRequest * @param {*} [options] Override http request option. @@ -25123,7 +25445,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).cashflowReportRefresh(cashflowReportRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. + * The `/cashflow_report/transactions/get` endpoint retrieves transactions data associated with an Item. Transactions data is standardized across financial institutions. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/cashflow_report/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `cursor` parameters in conjunction with the `has_more` response body field to fetch all available transactions. Note that data isn\'t likely to be immediately available to `/cashflow_report/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `cashflow_report`, or if it wasn\'t, upon the first call to `/cashflow_report/refresh`. To be alerted when transaction data is ready to be fetched, listen for the `CASHFLOW_REPORT_READY` webhook. * @summary Gets transaction data in `cashflow_report` * @param {CashflowReportTransactionsGetRequest} cashflowReportTransactionsGetRequest * @param {*} [options] Override http request option. @@ -25178,7 +25500,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. @@ -25200,8 +25522,8 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).craCheckReportCreate(craCheckReportCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). - * @summary Retrieve cash flow information from your user\'s banks + * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. NOTE: The following schema was updated in April 2026 to reflect the response when the provided version is \"II2\". Please see [this document](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#heading=h.rudamzinus2i) for guidance on migrating to II2 if you are currently using the II1 version, and [this section](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.0#bookmark=id.tdcc2wpk0h60) for an example II1 response along with its [documentation](https://docs.google.com/document/d/1kQkQ7FOgFaC4n-sUGUk74hoXZNY_L_nJeCuMe7Keip4/edit?tab=t.36c85n2ircqk#heading=h.79dwr5c1iszl). + * @summary Retrieve income insights from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -25211,7 +25533,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_lend_score` product or call `/cra/check_report/create` with the `cra_lend_score` product, Plaid will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the LendScore report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve the LendScore from your user\'s banking data * @param {CraCheckReportLendScoreGetRequest} craCheckReportLendScoreGetRequest * @param {*} [options] Override http request option. @@ -25222,7 +25544,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).craCheckReportLendScoreGet(craCheckReportLendScoreGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_insights` product or have generated a report using `/cra/check_report/create`, Plaid will generate the attributes when you call this endpoint. + * This endpoint allows you to retrieve the Network Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. @@ -25233,7 +25555,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` or a `USER_CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. @@ -25376,7 +25698,18 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).craPartnerInsightsGet(craPartnerInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. + * `/cra/report/get` retrieves a CRA Report for a user. + * @summary Retrieve a CRA Report for provided user + * @param {CraReportGetRequest} craReportGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + craReportGet(craReportGetRequest, options) { + return exports.PlaidApiFp(this.configuration).craReportGet(craReportGetRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** + * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` endpoint is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. @@ -25585,8 +25918,8 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).creditRelayGet(creditRelayGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). - * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) + * `/credit/relay/pdf/get` allows third parties to receive a PDF report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). + * @summary Retrieve the PDF reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -25663,7 +25996,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * `/employers/search` allows you the ability to search Plaid\'s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. - * @summary Search employer database + * @summary (Deprecated) Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -25694,6 +26027,18 @@ class PlaidApi extends base_1.BaseAPI { fdxConsentsGet(consentId, options) { return exports.PlaidApiFp(this.configuration).fdxConsentsGet(consentId, options).then((request) => request(this.axios, this.basePath)); } + /** + * Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status. + * @summary List FDX Consent Grants for a customer + * @param {string} customerId Data provider customer identifier whose consent grants to return. + * @param {FDXConsentGrantStatus} [status] Optional filter restricting results to a single consent grant status. One of `ACTIVE`, `REVOKED`, `EXPIRED`. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + fdxConsentsList(customerId, status, options) { + return exports.PlaidApiFp(this.configuration).fdxConsentsList(customerId, status, options).then((request) => request(this.axios, this.basePath)); + } /** * Returns the revocation history of a consent grant * @summary Retrieve FDX Consent Grant revocation records @@ -25806,7 +26151,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user otherwise an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. + * Create a new Identity Verification for the user specified by the `client_user_id` and/or `user_id` field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the `template_id` provided. If `user_id` is provided, there must be an associated user; otherwise, an error will be returned. If you don\'t know whether an active Identity Verification exists for a given `client_user_id` and/or `user_id`, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and/or `user_id`, and `template_id`. If an Identity Verification is found, it will be returned unmodified with a `200 OK` HTTP status code. If `user_id` is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If `user_id` is provided, user information can not be included in the request body. Please use the `/user/update` endpoint to update user data instead. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. @@ -26071,7 +26416,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. - * @summary Create public token + * @summary (Deprecated) Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -26356,7 +26701,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. + * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in EUR, GBP, or another chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with Bacs numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient\'s account, although at least 90% of standing order payments are sent by 6am. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. @@ -26367,7 +26712,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. + * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. Polling for status updates in Production is highly discouraged. Repeatedly calling `/payment_initiation/payment/get` to check a payment\'s status is unreliable and may trigger API rate limits. Only the `payment_status_update` webhook should be used to receive real-time status updates in Production. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. @@ -26422,7 +26767,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. + * The `/payment_initiation/recipient/list` endpoint lists the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. @@ -26478,7 +26823,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. - * @summary Create Apex bank account token + * @summary Create Apex processor token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -26511,7 +26856,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor - * @summary Create a bank transfer as a processor + * @summary (Deprecated) Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -26532,7 +26877,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).processorIdentityGet(processorIdentityGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. + * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/processor/identity/match`. Instead, use the `/processor/balance/get` endpoint to retrieve balance data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. @@ -26686,7 +27031,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. @@ -26697,7 +27042,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).processorTransactionsGet(processorTransactionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -26708,7 +27053,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. + * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/processor/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/processor/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](https://plaid.com/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. @@ -26719,7 +27064,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).processorTransactionsRefresh(processorTransactionsRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. + * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. @@ -26797,7 +27142,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. - * @summary Manually fire a Bank Income webhook in Sandbox + * @summary (Deprecated) Manually fire a Bank Income webhook in Sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -26808,7 +27153,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. - * @summary Manually fire a Bank Transfer webhook + * @summary (Deprecated) Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -26819,7 +27164,7 @@ class PlaidApi extends base_1.BaseAPI { } /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. - * @summary Simulate a bank transfer event in Sandbox + * @summary (Deprecated) Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -26839,6 +27184,17 @@ class PlaidApi extends base_1.BaseAPI { sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * `/sandbox/fdx/consent/seed` creates a test FDX consent grant (and a backing Item) for a data provider\'s customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection. `customer_id` is the data provider\'s identifier for the end user and `application_id` identifies the data recipient application the consent is granted to; both are required. Optionally provide `consent_id` (a UUIDv4) to control the seeded grant\'s identifier; one is generated when omitted. The seeded grant is returned by `/fdx/consents` and `/fdx/consents/{consentId}`, and can be revoked via `/fdx/consents/{consentId}/revocation`. + * @summary Seed an FDX consent grant for a sandbox data partner + * @param {SandboxFdxConsentSeedRequest} sandboxFdxConsentSeedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options) { + return exports.PlaidApiFp(this.configuration).sandboxFdxConsentSeed(sandboxFdxConsentSeedRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook @@ -26873,7 +27229,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/item/reset_login` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, you can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. @@ -26906,7 +27262,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). + * `/sandbox/payment_profile/reset_login` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. @@ -27016,7 +27372,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. + * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, a 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. @@ -27093,7 +27449,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. + * `/sandbox/user/reset_login` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, you can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. @@ -27225,7 +27581,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).transactionsEnrich(transactionsEnrichRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. + * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student` or `mortgage`; coverage may be limited). For transaction history from investment accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. @@ -27236,7 +27592,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).transactionsGet(transactionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. + * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user\'s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. @@ -27291,7 +27647,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).transactionsRulesRemove(transactionsRulesRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. + * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student` or `mortgage`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g. due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. @@ -27335,7 +27691,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).transferAuthorizationCreate(transferAuthorizationCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. + * (Deprecated) Use the `/transfer/ledger/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. @@ -27390,7 +27746,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).transferCreate(transferCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. + * Third-party sender customers can use the `/transfer/diligence/document/upload` endpoint to upload a document on behalf of their end customer (i.e. originator) to Plaid. You\'ll need to send a request of type `multipart/form-data`. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. @@ -27478,7 +27834,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).transferLedgerDeposit(transferLedgerDepositRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledger. + * Use the `/transfer/ledger/distribute` endpoint to move available balance between ledgers, if you have multiple. If you\'re a platform, you can move funds between one of your ledgers and one of your customer\'s ledgers. * @summary Move available balance between ledgers * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. @@ -27654,7 +28010,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. + * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. A scheduled transfer that hasn\'t been submitted to the bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. @@ -27752,6 +28108,17 @@ class PlaidApi extends base_1.BaseAPI { transferRepaymentReturnList(transferRepaymentReturnListRequest, options) { return exports.PlaidApiFp(this.configuration).transferRepaymentReturnList(transferRepaymentReturnListRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Use the `/transfer/return/recover` endpoint to notify Plaid that you have recovered some or all of the loss on a returned guaranteed transfer. Recovery can be reported in full or in parts; the sum of recovered amounts across calls cannot exceed the original transfer\'s amount. + * @summary Report a return recovery + * @param {TransferReturnRecoverRequest} transferReturnRecoverRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + transferReturnRecover(transferReturnRecoverRequest, options) { + return exports.PlaidApiFp(this.configuration).transferReturnRecover(transferReturnRecoverRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep @@ -27797,7 +28164,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).userAccountSessionGet(userAccountSessionGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses`, (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. + * For Plaid products and flows that use the user object, `/user/create` provides you a single token to access all data associated with the user. You must call this endpoint before calling `/link/token/create` if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect (Identity). If you are using Plaid Protect Link session scoring, you do not need to call `/user/create` first; Plaid will resolve or create the user when `user.client_user_id` is provided in `/link/token/create`. For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a `client_user_id` and an `identity` object and will return a `user_id`. For customers who began using it before that date, the endpoint takes a `client_user_id` and a `consumer_report_user_identity` object and will return a `user_token` and `user_id`. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis). In order to create a Plaid Check Consumer Report for a user, the `identity` (new) or `consumer_report_user_identity` (legacy) object must be present. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. In order to generate a Plaid Check Consumer Report, the following `identity` fields, at minimum, are required and must be non-empty: `name`, `date_of_birth`, `emails`, `phone_numbers`, and `addresses` (with at least one email, phone number, and address designated as `primary`). Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If creating a report for sharing with a GSE such as Fannie or Freddie, the user\'s full SSN must be provided via the `id_numbers` field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. When using Plaid Protect, it is highly recommended that you provide an `identity` object to better identify and block fraud across your Link sessions. Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {boolean} [plaidNewUserAPIEnabled] The HTTP header used in API requests to determine which set of User APIs to invoke: the legacy CRA version or the new User API version. @@ -27809,7 +28176,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).userCreate(userCreateRequest, plaidNewUserAPIEnabled, options).then((request) => request(this.axios, this.basePath)); } /** - * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Transactions Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. + * `/user/financial_data/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for a User using the Financial Insights bundle. This bundle refreshes the Transactions, Investments, and Liabilities product data. This endpoint is for clients who use the Financial Insights bundle and want to proactively update all linked Items under a user. The refresh may succeed or fail on a per-Item basis. Use the `results` array in the response to understand the outcome for each Item. This endpoint is distinct from `/transactions/refresh`, which triggers a refresh for a single Item. Use `/user/financial_data/refresh` to target all Items for a user instead. * @summary Refresh user items for Financial-Insights bundle * @param {UserFinancialDataRefreshRequest} userFinancialDataRefreshRequest * @param {*} [options] Override http request option. @@ -27911,7 +28278,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. + * This endpoint is used to delete a third-party user token. Once removed, the token can no longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. @@ -28243,4 +28610,4 @@ class PlaidApi extends base_1.BaseAPI { } } exports.PlaidApi = PlaidApi; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQTZGNUY7Ozs7R0FJRztBQUNILElBQVksd0JBS1g7QUFMRCxXQUFZLHdCQUF3QjtJQUNoQywyQ0FBZSxDQUFBO0lBQ2YsMERBQThCLENBQUE7SUFDOUIsZ0RBQW9CLENBQUE7SUFDcEIsOENBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUxXLHdCQUF3QixHQUF4QixnQ0FBd0IsS0FBeEIsZ0NBQXdCLFFBS25DO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUN4QixtQ0FBZSxDQUFBO0lBQ2Ysd0NBQW9CLENBQUE7SUFDcEIsc0NBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUpXLGdCQUFnQixHQUFoQix3QkFBZ0IsS0FBaEIsd0JBQWdCLFFBSTNCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNoQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBS25CO0FBa0NEOzs7TUFHTTtBQUNOLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN0Qiw2REFBMkMsQ0FBQTtJQUMzQyxzQ0FBb0IsQ0FBQTtJQUNwQiw4Q0FBNEIsQ0FBQTtJQUM1QixxQ0FBbUIsQ0FBQTtBQUN2QixDQUFDLEVBTFcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFLekI7QUFtSUQ7OztNQUdNO0FBQ04sSUFBWSxt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Ozs7OztPQU9HO0lBQ0ksc0NBQXNDLENBQUMsNkNBQTRGLEVBQUUsT0FBYTtRQUNySixPQUFPLGtCQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLHNDQUFzQyxDQUFDLDZDQUE2QyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxrQ0FBa0MsQ0FBQyx5Q0FBb0YsRUFBRSxPQUFhO1FBQ3pJLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsa0NBQWtDLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2TCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHlCQUF5QixDQUFDLGdDQUFrRSxFQUFFLE9BQWE7UUFDOUcsT0FBTyxrQkFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLENBQUM7Q0FDSjtBQTE0SEQsNEJBMDRIQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjY5OC43XG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQW5hbHl6ZWQgQUFNVkEgZGF0YSBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0LiAgTm90ZTogVGhpcyBmaWVsZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgVS5TLiBkcml2ZXJcXCdzIGxpY2Vuc2VzIGlzc3VlZCBieSBwYXJ0aWNpcGF0aW5nIHN0YXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQUFNVkFBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFBTVZBQW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdmVyYWxsIG91dGNvbWUgb2YgY2hlY2tpbmcgdGhlIGFzc29jaWF0ZWQgaGl0IGFnYWluc3QgdGhlIGlzc3Vpbmcgc3RhdGUgZGF0YWJhc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpc192ZXJpZmllZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQUFNVkFNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX2lzc3VlX2RhdGU6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpZF9leHBpcmF0aW9uX2RhdGU6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIHN0cmVldDogQUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQU1WQU1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgY2l0eTogQUFNVkFNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBnZW5kZXI6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBoZWlnaHQ6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBleWVfY29sb3I6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGZpcnN0X25hbWU6IEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgbWlkZGxlX25hbWU6IEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgbGFzdF9uYW1lOiBBQU1WQURldGFpbGVkTWF0Y2hSZXN1bHQ7XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIGNoZWNraW5nIHRoZSBhc3NvY2lhdGVkIGhpdCBhZ2FpbnN0IHN0YXRlIGRhdGFiYXNlcy4gICBgbWF0Y2hgIC0gVGhlIGZpZWxkIGlzIGFuIGV4YWN0IG1hdGNoIHdpdGggdGhlIHN0YXRlIGRhdGFiYXNlLiAgYHBhcnRpYWxfbWF0Y2hgIC0gVGhlIGZpZWxkIGlzIGEgcGFydGlhbCBtYXRjaCB3aXRoIHRoZSBzdGF0ZSBkYXRhYmFzZS4gIGBub19tYXRjaGAgLSBUaGUgZmllbGQgaXMgbm90IGFuIGV4YWN0IG1hdGNoIHdpdGggdGhlIHN0YXRlIGRhdGFiYXNlLiAgYG5vX2RhdGFgIC0gVGhlIGZpZWxkIHdhcyB1bmFibGUgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHN0YXRlIGRhdGFiYXNlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdCB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBjaGVja2luZyB0aGUgcGFydGljdWxhciBmaWVsZCBhZ2FpbnN0IHN0YXRlIGRhdGFiYXNlcy4gICBgbWF0Y2hgIC0gVGhlIGZpZWxkIGlzIGFuIGV4YWN0IG1hdGNoIHdpdGggdGhlIHN0YXRlIGRhdGFiYXNlLiAgYG5vX21hdGNoYCAtIFRoZSBmaWVsZCBpcyBub3QgYW4gZXhhY3QgbWF0Y2ggd2l0aCB0aGUgc3RhdGUgZGF0YWJhc2UuICBgbm9fZGF0YWAgLSBUaGUgZmllbGQgd2FzIHVuYWJsZSB0byBiZSBjaGVja2VkIGFnYWluc3Qgc3RhdGUgZGF0YWJhc2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUFNVkFNYXRjaFJlc3VsdCB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHRyYW5zZmVyLiBSZXF1aXJlZCBmb3IgdHJhbnNmZXJzIG9uIGFuIEFDSCBuZXR3b3JrLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0FDSCBTRUMgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvY3JlYXRpbmctdHJhbnNmZXJzLyNhY2gtc2VjLWNvZGVzKS4gIENvZGVzIHN1cHBvcnRlZCBmb3IgY3JlZGl0czogYGNjZGAsIGBwcGRgIENvZGVzIHN1cHBvcnRlZCBmb3IgZGViaXRzOiBgY2NkYCwgYHBwZGAsIGB0ZWxgLCBgd2ViYCAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gVGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lci4gQXV0aG9yaXphdGlvbiB3YXMgb2J0YWluZWQgaW4gd3JpdGluZyBlaXRoZXIgaW4gcGVyc29uIG9yIHZpYSBhbiBlbGVjdHJvbmljIGRvY3VtZW50IHNpZ25pbmcsIGUuZy4gRG9jdXNpZ24sIGJ5IHRoZSBjb25zdW1lci4gQ2FuIGJlIHVzZWQgZm9yIGNyZWRpdHMgb3IgZGViaXRzLiAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeS4gVGhlIHRyYW5zZmVyIGRlYml0cyBhIGNvbnN1bWVyXFwncyBiYW5rIGFjY291bnQuIEF1dGhvcml6YXRpb24gZnJvbSB0aGUgY29uc3VtZXIgaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXQgKGUuZy4gYSB3ZWIgb3IgbW9iaWxlIGFwcGxpY2F0aW9uKS4gQ2FuIGJlIHVzZWQgZm9yIHNpbmdsZSBkZWJpdHMgb3IgcmVjdXJyaW5nIGRlYml0cy4gIGBcXFwidGVsXFxcImAgLSBUZWxlcGhvbmUtSW5pdGlhdGVkIEVudHJ5LiBUaGUgdHJhbnNmZXIgZGViaXRzIGEgY29uc3VtZXIuIERlYml0IGF1dGhvcml6YXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgb3JhbGx5IG92ZXIgdGhlIHRlbGVwaG9uZSB2aWEgYSByZWNvcmRlZCBjYWxsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUNIQ2xhc3Mge1xuICAgIENjZCA9ICdjY2QnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFRlbCA9ICd0ZWwnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIEFQUiBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQVBSXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICAvKipcbiAgICAgKiBBbm51YWwgUGVyY2VudGFnZSBSYXRlIGFwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFsYW5jZSB0byB3aGljaCB0aGUgQVBSIGFwcGxpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYXByX3R5cGU6IEFQUkFwclR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSB0aGF0IGlzIHN1YmplY3RlZCB0byB0aGUgQVBSIGlmIGEgYmFsYW5jZSB3YXMgY2FycmllZCBiZXlvbmQgcGF5bWVudCBkdWUgZGF0ZS4gSG93IGl0IGlzIGNhbGN1bGF0ZWQgY2FuIHZhcnkgYnkgY2FyZCBpc3N1ZXIuIEl0IGlzIG9mdGVuIGNhbGN1bGF0ZWQgYXMgYW4gYXZlcmFnZSBkYWlseSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGJhbGFuY2Vfc3ViamVjdF90b19hcHI6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIG1vbmV5IGNoYXJnZWQgZHVlIHRvIGludGVyZXN0IGZyb20gbGFzdCBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgaW50ZXJlc3RfY2hhcmdlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBUFJBcHJUeXBlRW51bSB7XG4gICAgQmFsYW5jZVRyYW5zZmVyQXByID0gJ2JhbGFuY2VfdHJhbnNmZXJfYXByJyxcbiAgICBDYXNoQXByID0gJ2Nhc2hfYXByJyxcbiAgICBQdXJjaGFzZUFwciA9ICdwdXJjaGFzZV9hcHInLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCdcbn1cblxuLyoqXG4gKiBBbGxvdyBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBieSBhY2NvdW50LiBVbmxpc3RlZCAoZS5nLiBtaXNzaW5nKSBhY2NvdW50cyB3aWxsIGJlIGNvbnNpZGVyZWQgYG5ld19hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X3Byb2R1Y3RfYWNjZXNzPzogQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRBc3NldHMge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uLiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkLiAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkLiAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBOb3RlOiBEYXRhYmFzZSBNYXRjaCBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudEFzc2V0c1ZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGlzIGN1cnJlbnRseSBhbiBvcHQtaW4gZmllbGQgYW5kIG9ubHkgc3VwcG9ydGVkIGZvciBDaGFzZSBJdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSB3aXRoaW4gdGhpcyByZXBvcnQgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydEludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBBc3NldFJlcG9ydEludmVzdG1lbnRzO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPd25lcnNoaXBUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb3duZXJzaGlwX3R5cGU/OiBPd25lcnNoaXBUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuICBBdmFpbGFibGUgZm9yIGBjcmVkaXRgIGFuZCBgZGVwb3NpdG9yeWAgdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2luc2lnaHRzPzogQWNjb3VudEluc2lnaHRzIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJ1xufVxuXG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LiBCYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSBiYWxhbmNlIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgb3IgYC9zaWduYWwvZXZhbHVhdGVgICh1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsLXRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIG9yIGJ5IGAvc2lnbmFsL2V2YWx1YXRlYCB3aXRoIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLCB1bmxlc3MgeW91IGhhdmUgb3B0ZWQgaW50byBlbmFibGluZyBbbGltaXRlZC1wdXJwb3NlIGNoZWNraW5nIGFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI2VuYWJsaW5nLWxpbWl0ZWQtcHVycG9zZS1jaGVja2luZy1hY2NvdW50cy1mb3ItcmVudC1vci1tb3J0Z2FnZSksIHdoaWNoIGFsd2F5cyBoYXZlIGBudWxsYCB2YWx1ZXMgZm9yIGJvdGggYGF2YWlsYWJsZWAgYW5kIGBjdXJyZW50YCBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuIFNpbWlsYXIgdG8gYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGlzIHR5cGljYWxseSBleHBlY3RlZCwgd2hpbGUgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGFzc2V0cyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IGJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBieSBgL3NpZ25hbC9ldmFsdWF0ZWAgd2l0aCBhIEJhbGFuY2Utb25seSBydWxlc2V0OyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgb3IgYC9zaWduYWwvZXZhbHVhdGVgIGNhbGxlZCB3aXRoIGEgQmFsYW5jZS1vbmx5IGBydWxlc2V0X2tleWAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAsIHVubGVzcyB5b3UgaGF2ZSBvcHRlZCBpbnRvIGVuYWJsaW5nIFtsaW1pdGVkLXB1cnBvc2UgY2hlY2tpbmcgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jZW5hYmxpbmctbGltaXRlZC1wdXJwb3NlLWNoZWNraW5nLWFjY291bnRzLWZvci1yZW50LW9yLW1vcnRnYWdlKSwgd2hpY2ggYWx3YXlzIGhhdmUgYG51bGxgIHZhbHVlcyBmb3IgYm90aCBgYXZhaWxhYmxlYCBhbmQgYGN1cnJlbnRgIGJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhlIGJhbGFuY2Ugd2FzIHVwZGF0ZWQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIG9ubHkgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNpbmdsZSBhY2NvdW50IGF0IGEgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgV2hlbiB1c2luZyBhIENSQSBlbmRwb2ludCAoYW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgaS5lLiBhbnkgZW5kcG9pbnQgYmVnaW5uaW5nIHdpdGggYC9jcmEvYCksIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgd2lsbCBub3QgbWF0Y2ggdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCBieSBhIG5vbi1DUkEgZW5kcG9pbnQuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBlaXRoZXIgdGhlIGFjY291bnRcXCdzIGRpc3BsYXllZCBtYXNrIG9yIHRoZSBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVyIG5hbWUgdGhhdCB3YXMgdXNlZCBmb3IgbWljcm8tZGVwb3NpdCBhbmQvb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBUaGlzIG5hbWUgd2FzIG1hbnVhbGx5LWVudGVyZWQgYnkgdGhlIHVzZXIgZHVyaW5nIExpbmssIHVubGVzcyBpdCB3YXMgb3RoZXJ3aXNlIHByb3ZpZGVkIHZpYSB0aGUgYHVzZXIubGVnYWxfbmFtZWAgcmVxdWVzdCBmaWVsZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYCBmb3IgdGhlIExpbmsgc2Vzc2lvbiB0aGF0IGNyZWF0ZWQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UsIFBOQywgYW5kIFVTIEJhbmspLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIGlzIHBvcHVsYXRlZCBmb3IgVEFOLWJhc2VkIGluc3RpdHV0aW9ucyAoYGluc181NmAsIGBpbnNfMTNgLCBgaW5zXzEyNzk5MGApIGFzIHdlbGwgYXMgdGhlIE9BdXRoIFNhbmRib3ggaW5zdGl0dXRpb24gKGBpbnNfMTI3Mjg3YCk7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBhY2NvdW50IGF0IGEgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFzZU51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEJhc2VOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIFdoZW4gdXNpbmcgYSBDUkEgZW5kcG9pbnQgKGFuIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIGkuZS4gYW55IGVuZHBvaW50IGJlZ2lubmluZyB3aXRoIGAvY3JhL2ApLCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIHdpbGwgbm90IG1hdGNoIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgYnkgYSBub24tQ1JBIGVuZHBvaW50LiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlTnVsbGFibGVcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGVpdGhlciB0aGUgYWNjb3VudFxcJ3MgZGlzcGxheWVkIG1hc2sgb3IgdGhlIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRCYXNlTnVsbGFibGVWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlciBuYW1lIHRoYXQgd2FzIHVzZWQgZm9yIG1pY3JvLWRlcG9zaXQgYW5kL29yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gVGhpcyBuYW1lIHdhcyBtYW51YWxseS1lbnRlcmVkIGJ5IHRoZSB1c2VyIGR1cmluZyBMaW5rLCB1bmxlc3MgaXQgd2FzIG90aGVyd2lzZSBwcm92aWRlZCB2aWEgdGhlIGB1c2VyLmxlZ2FsX25hbWVgIHJlcXVlc3QgZmllbGQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhhdCBjcmVhdGVkIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlTnVsbGFibGVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX2luc2lnaHRzPzogQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgZm9yIEl0ZW1zIGF0IGluc3RpdHV0aW9ucyB0aGF0IHVzZSBUb2tlbml6ZWQgQWNjb3VudCBOdW1iZXJzIChpLmUuLCBDaGFzZSwgUE5DLCBhbmQgVVMgQmFuaykuIEJlY2F1c2UgdGhlc2UgYWNjb3VudHMgaGF2ZSBhIGRpZmZlcmVudCBhY2NvdW50IG51bWJlciBlYWNoIHRpbWUgdGhleSBhcmUgbGlua2VkLCB0aGlzIGZpZWxkIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFjY291bnQgbnVtYmVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGFjY291bnQgYWNyb3NzIG11bHRpcGxlIEl0ZW1zIGZvciBwYXltZW50cyB1c2UgY2FzZXMsIGhlbHBpbmcgdG8gcmVkdWNlIGR1cGxpY2F0ZSBJdGVtcyBvciBhdHRlbXB0ZWQgZnJhdWQuIEluIFNhbmRib3gsIHRoaXMgZmllbGQgaXMgcG9wdWxhdGVkIGZvciBUQU4tYmFzZWQgaW5zdGl0dXRpb25zIChgaW5zXzU2YCwgYGluc18xM2AsIGBpbnNfMTI3OTkwYCkgYXMgd2VsbCBhcyB0aGUgT0F1dGggU2FuZGJveCBpbnN0aXR1dGlvbiAoYGluc18xMjcyODdgKTsgaW4gUHJvZHVjdGlvbiwgaXQgd2lsbCBvbmx5IGJlIHBvcHVsYXRlZCBmb3IgYWNjb3VudHMgYXQgYXBwbGljYWJsZSBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50QmFzZU51bGxhYmxlVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgVW5zZW50ID0gJ3Vuc2VudCcsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIEVudW1lcmF0ZXMgdGhlIGFjY291bnQgc3VidHlwZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lzaGVzIGZvciB0aGUgdXNlciB0byBiZSBhYmxlIHRvIHNlbGVjdCBmcm9tLiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHRvIFBsYWlkIGRvY3VtZW50YXRpb24gb24gYWNjb3VudCBmaWx0ZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGNyZWRpdD86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgYGFjY291bnRfZmlsdGVyc2Agc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IERlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGUgYWNjb3VudFxcJ3MgY2F0ZWdvcml6YXRpb24gYXMgZWl0aGVyIGEgcGVyc29uYWwgb3IgYSBidXNpbmVzcyBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBpbiBiZXRhOyB0byByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRIb2xkZXJDYXRlZ29yeSB7XG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIFBlcnNvbmFsID0gJ3BlcnNvbmFsJyxcbiAgICBVbnJlY29nbml6ZWQgPSAndW5yZWNvZ25pemVkJ1xufVxuXG4vKipcbiAqIElkZW50aXR5IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgV2hlbiB1c2luZyBhIENSQSBlbmRwb2ludCAoYW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgaS5lLiBhbnkgZW5kcG9pbnQgYmVnaW5uaW5nIHdpdGggYC9jcmEvYCksIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgd2lsbCBub3QgbWF0Y2ggdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCBieSBhIG5vbi1DUkEgZW5kcG9pbnQuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlLCBQTkMsIGFuZCBVUyBCYW5rKS4gQmVjYXVzZSB0aGVzZSBhY2NvdW50cyBoYXZlIGEgZGlmZmVyZW50IGFjY291bnQgbnVtYmVyIGVhY2ggdGltZSB0aGV5IGFyZSBsaW5rZWQsIHRoaXMgZmllbGQgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWNjb3VudCBudW1iZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gYWNjb3VudCBhY3Jvc3MgbXVsdGlwbGUgSXRlbXMgZm9yIHBheW1lbnRzIHVzZSBjYXNlcywgaGVscGluZyB0byByZWR1Y2UgZHVwbGljYXRlIEl0ZW1zIG9yIGF0dGVtcHRlZCBmcmF1ZC4gSW4gU2FuZGJveCwgdGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgZm9yIFRBTi1iYXNlZCBpbnN0aXR1dGlvbnMgKGBpbnNfNTZgLCBgaW5zXzEzYCwgYGluc18xMjc5OTBgKSBhcyB3ZWxsIGFzIHRoZSBPQXV0aCBTYW5kYm94IGluc3RpdHV0aW9uIChgaW5zXzEyNzI4N2ApOyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRIb2xkZXJDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlBbGxPZiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbjsgZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIGxpbmtlZCBhY2NvdW50IGlzIGEgYnVzaW5lc3MgYWNjb3VudCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogSWRlbnRpdHkgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgV2hlbiB1c2luZyBhIENSQSBlbmRwb2ludCAoYW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgaS5lLiBhbnkgZW5kcG9pbnQgYmVnaW5uaW5nIHdpdGggYC9jcmEvYCksIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgd2lsbCBub3QgbWF0Y2ggdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCBieSBhIG5vbi1DUkEgZW5kcG9pbnQuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBlaXRoZXIgdGhlIGFjY291bnRcXCdzIGRpc3BsYXllZCBtYXNrIG9yIHRoZSBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVyIG5hbWUgdGhhdCB3YXMgdXNlZCBmb3IgbWljcm8tZGVwb3NpdCBhbmQvb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBUaGlzIG5hbWUgd2FzIG1hbnVhbGx5LWVudGVyZWQgYnkgdGhlIHVzZXIgZHVyaW5nIExpbmssIHVubGVzcyBpdCB3YXMgb3RoZXJ3aXNlIHByb3ZpZGVkIHZpYSB0aGUgYHVzZXIubGVnYWxfbmFtZWAgcmVxdWVzdCBmaWVsZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYCBmb3IgdGhlIExpbmsgc2Vzc2lvbiB0aGF0IGNyZWF0ZWQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UsIFBOQywgYW5kIFVTIEJhbmspLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIGlzIHBvcHVsYXRlZCBmb3IgVEFOLWJhc2VkIGluc3RpdHV0aW9ucyAoYGluc181NmAsIGBpbnNfMTNgLCBgaW5zXzEyNzk5MGApIGFzIHdlbGwgYXMgdGhlIE9BdXRoIFNhbmRib3ggaW5zdGl0dXRpb24gKGBpbnNfMTI3Mjg3YCk7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgZG9jdW1lbnRzIHRoYXQgd2VyZSB1cGxvYWRlZCBhcyBwcm9vZiBvZiBhY2NvdW50IG93bmVyc2hpcC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD4gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgVW5zZW50ID0gJ3Vuc2VudCcsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRBbGxPZiB7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgZG9jdW1lbnRzIHRoYXQgd2VyZSB1cGxvYWRlZCBhcyBwcm9vZiBvZiBhY2NvdW50IG93bmVyc2hpcC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkQWxsT2ZcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxJZGVudGl0eURvY3VtZW50VXBsb2FkPiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aXR5IG1hdGNoIHNjb3JlcyBmb3IgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIFdoZW4gdXNpbmcgYSBDUkEgZW5kcG9pbnQgKGFuIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIGkuZS4gYW55IGVuZHBvaW50IGJlZ2lubmluZyB3aXRoIGAvY3JhL2ApLCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIHdpbGwgbm90IG1hdGNoIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgYnkgYSBub24tQ1JBIGVuZHBvaW50LiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBzdGF0dXMuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgd2hlbiB1c2luZyBBdXRoIGFuZCBmYWxsaW5nIGJhY2sgdG8gbWljcm8tZGVwb3NpdCBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uLiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIGNvZGUuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkLiAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkLiAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdW5zZW50YDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiwgYnV0IFBsYWlkIGhhcyBub3QgeWV0IHNlbnQgdGhlIG1pY3JvLWRlcG9zaXQuICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNpZ25hbCBmb3IgYmVpbmcgaW52YWxpZCBhbmQvb3IgaGF2ZSBubyBzaWduYWwgZm9yIGJlaW5nIHZhbGlkLiBUeXBpY2FsbHkgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcm91dGluZyBudW1iZXIgaXMgaW52YWxpZCwgdGhlIGFjY291bnQgbnVtYmVyIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NvdW50IG51bWJlciBmb3JtYXQgYXNzb2NpYXRlZCB3aXRoIHRoZSByb3V0aW5nIG51bWJlciwgb3IgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVwb3J0ZWQgYXMgY2xvc2VkIG9yIGZyb3plbi4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3NgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlczogdGhlIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG1hdGNoIGEgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgb2YgYW4gYWNjb3VudCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBhbmQgdGhlIGFjY291bnQgaXMgbm90IGtub3duIGJ5IFBsYWlkIHRvIGJlIGZyb3plbiBvciBjbG9zZWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbmA6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNvbWUgc2lnbmFsIGZvciBiZWluZyB2YWxpZDogdGhlIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIHdlcmUgbm90IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGJ1dCB0aGUgcm91dGluZyBudW1iZXIgaXMgdmFsaWQgYW5kIHRoZSBhY2NvdW50IG51bWJlciBpcyBhIHBvdGVudGlhbCB2YWxpZCBhY2NvdW50IG51bWJlciBmb3IgdGhhdCByb3V0aW5nIG51bWJlci4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX21hdGNoZWRgOiAoZGVwcmVjYXRlZCkgVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgTWF0Y2guICBgbnVsbGAgb3IgZW1wdHkgc3RyaW5nOiBOZWl0aGVyIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG5vciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gYXJlIGJlaW5nIHVzZWQgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlLCBQTkMsIGFuZCBVUyBCYW5rKS4gQmVjYXVzZSB0aGVzZSBhY2NvdW50cyBoYXZlIGEgZGlmZmVyZW50IGFjY291bnQgbnVtYmVyIGVhY2ggdGltZSB0aGV5IGFyZSBsaW5rZWQsIHRoaXMgZmllbGQgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWNjb3VudCBudW1iZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gYWNjb3VudCBhY3Jvc3MgbXVsdGlwbGUgSXRlbXMgZm9yIHBheW1lbnRzIHVzZSBjYXNlcywgaGVscGluZyB0byByZWR1Y2UgZHVwbGljYXRlIEl0ZW1zIG9yIGF0dGVtcHRlZCBmcmF1ZC4gSW4gU2FuZGJveCwgdGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgZm9yIFRBTi1iYXNlZCBpbnN0aXR1dGlvbnMgKGBpbnNfNTZgLCBgaW5zXzEzYCwgYGluc18xMjc5OTBgKSBhcyB3ZWxsIGFzIHRoZSBPQXV0aCBTYW5kYm94IGluc3RpdHV0aW9uIChgaW5zXzEyNzI4N2ApOyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBob2xkZXJfY2F0ZWdvcnk/OiBBY2NvdW50SG9sZGVyQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IFBob25lTnVtYmVyTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtYWlsQWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgVW5zZW50ID0gJ3Vuc2VudCcsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05hbWVNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogTmFtZU1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZU51bWJlck1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IFBob25lTnVtYmVyTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtYWlsQWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG59XG4vKipcbiAqIFRoaXMgaXMgYSBjb250YWluZXIgb2JqZWN0IGZvciBhbGwgbGVuZGluZy1yZWxhdGVkIGluc2lnaHRzLiBUaGlzIGZpZWxkIHdpbGwgYmUgcmV0dXJuZWQgb25seSBmb3IgRXVyb3BlYW4gY3VzdG9tZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrSW5kaWNhdG9yc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgcmlzaz86IFJpc2tJbmRpY2F0b3JzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWZmb3JkYWJpbGl0eUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhZmZvcmRhYmlsaXR5PzogQWZmb3JkYWJpbGl0eUluc2lnaHRzIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2VzcyB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBhY2NvdW50IGRhdGEuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X2RhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGJhbmsgc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHRheCBkb2N1bWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICB0YXhfZG9jdW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3Mgc3BlY2lmaWMgcHJvZHVjdHMgb24gdGhpcyBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9kYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBiYW5rIHN0YXRlbWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHRheCBkb2N1bWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgYWNjb3VudHMgYmUgbGltaXRlZCB0byBhIHNwZWNpZmljIGNhcmRpbmFsaXR5LiBgTVVMVElfU0VMRUNUYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGljayBtdWx0aXBsZSBhY2NvdW50cy4gYFNJTkdMRV9TRUxFQ1RgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBwaWNrIG9ubHkgYSBzaW5nbGUgYWNjb3VudC4gYEFMTGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIG11c3Qgc2hhcmUgYWxsIG9mIHRoZWlyIGFjY291bnRzIGFuZCBzaG91bGQgbm90IGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byBkZS1zZWxlY3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRTZWxlY3Rpb25DYXJkaW5hbGl0eSB7XG4gICAgU2luZ2xlU2VsZWN0ID0gJ1NJTkdMRV9TRUxFQ1QnLFxuICAgIE11bHRpU2VsZWN0ID0gJ01VTFRJX1NFTEVDVCcsXG4gICAgQWxsID0gJ0FMTCdcbn1cblxuLyoqXG4gKiBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGFjY291bnQgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcgc3VidHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50U3VidHlwZSB7XG4gICAgXzQwMWEgPSAnNDAxYScsXG4gICAgXzQwMWsgPSAnNDAxaycsXG4gICAgXzQwM0IgPSAnNDAzQicsXG4gICAgXzQ1N2IgPSAnNDU3YicsXG4gICAgXzUyOSA9ICc1MjknLFxuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENhc2hJc2EgPSAnY2FzaCBpc2EnLFxuICAgIENhc2hNYW5hZ2VtZW50ID0gJ2Nhc2ggbWFuYWdlbWVudCcsXG4gICAgQ2QgPSAnY2QnLFxuICAgIENoZWNraW5nID0gJ2NoZWNraW5nJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIENvbnN0cnVjdGlvbiA9ICdjb25zdHJ1Y3Rpb24nLFxuICAgIENvbnN1bWVyID0gJ2NvbnN1bWVyJyxcbiAgICBDcmVkaXRDYXJkID0gJ2NyZWRpdCBjYXJkJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEZoc2EgPSAnZmhzYScsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpbWl0ZWRQdXJwb3NlQ2hlY2tpbmcgPSAnbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nJyxcbiAgICBMaW5lT2ZDcmVkaXQgPSAnbGluZSBvZiBjcmVkaXQnLFxuICAgIExpcmEgPSAnbGlyYScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTW9uZXlNYXJrZXQgPSAnbW9uZXkgbWFya2V0JyxcbiAgICBNb3J0Z2FnZSA9ICdtb3J0Z2FnZScsXG4gICAgTXV0dWFsRnVuZCA9ICdtdXR1YWwgZnVuZCcsXG4gICAgTm9uQ3VzdG9kaWFsV2FsbGV0ID0gJ25vbi1jdXN0b2RpYWwgd2FsbGV0JyxcbiAgICBOb25UYXhhYmxlQnJva2VyYWdlQWNjb3VudCA9ICdub24tdGF4YWJsZSBicm9rZXJhZ2UgYWNjb3VudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIE90aGVySW5zdXJhbmNlID0gJ290aGVyIGluc3VyYW5jZScsXG4gICAgT3RoZXJBbm51aXR5ID0gJ290aGVyIGFubnVpdHknLFxuICAgIE92ZXJkcmFmdCA9ICdvdmVyZHJhZnQnLFxuICAgIFBheXBhbCA9ICdwYXlwYWwnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCcsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcmVwYWlkID0gJ3ByZXBhaWQnLFxuICAgIFByaWYgPSAncHJpZicsXG4gICAgUHJvZml0U2hhcmluZ1BsYW4gPSAncHJvZml0IHNoYXJpbmcgcGxhbicsXG4gICAgUXNociA9ICdxc2hyJyxcbiAgICBSZHNwID0gJ3Jkc3AnLFxuICAgIFJlc3AgPSAncmVzcCcsXG4gICAgUmV0aXJlbWVudCA9ICdyZXRpcmVtZW50JyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBSb3RoNDAzQiA9ICdyb3RoIDQwM0InLFxuICAgIFJvdGg0NTdiID0gJ3JvdGggNDU3YicsXG4gICAgUm90aFBlbnNpb24gPSAncm90aCBwZW5zaW9uJyxcbiAgICBSb3RoUHJvZml0U2hhcmluZ1BsYW4gPSAncm90aCBwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSb3RoVGhyaWZ0U2F2aW5nc1BsYW4gPSAncm90aCB0aHJpZnQgc2F2aW5ncyBwbGFuJyxcbiAgICBScmlmID0gJ3JyaWYnLFxuICAgIFJyc3AgPSAncnJzcCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgU2F2aW5ncyA9ICdzYXZpbmdzJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFN0dWRlbnQgPSAnc3R1ZGVudCcsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5J1xufVxuXG4vKipcbiAqIGBpbnZlc3RtZW50OmAgSW52ZXN0bWVudCBhY2NvdW50LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyB0eXBlIGlzIGNhbGxlZCBgYnJva2VyYWdlYCBpbnN0ZWFkLiAgYGNyZWRpdDpgIENyZWRpdCBjYXJkICBgZGVwb3NpdG9yeTpgIERlcG9zaXRvcnkgYWNjb3VudCAgYGxvYW46YCBMb2FuIGFjY291bnQgIGBvdGhlcjpgIE5vbi1zcGVjaWZpZWQgYWNjb3VudCB0eXBlICBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRUeXBlIHtcbiAgICBJbnZlc3RtZW50ID0gJ2ludmVzdG1lbnQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIERlcG9zaXRvcnkgPSAnZGVwb3NpdG9yeScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBmcm9tIHBlcmZvcm1pbmcgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGZvciB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyB1c2luZyBEYXRhYmFzZSBBdXRoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgc2NvcmUgb2YgdGhlIG5hbWUgbWF0Y2ggYmV0d2VlbiB0aGUgZ2l2ZW4gbmFtZSBwcm92aWRlZCBkdXJpbmcgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIChhdmFpbGFibGUgaW4gdGhlIFtgdmVyaWZpY2F0aW9uX25hbWVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hdXRoLyNhdXRoLWdldC1yZXNwb25zZS1hY2NvdW50cy12ZXJpZmljYXRpb24tbmFtZSkgZmllbGQgaWYgdXNpbmcgc3RhbmRhcmQgRGF0YWJhc2UgQXV0aCwgb3IgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgaWYgdXNpbmcgYC9hdXRoL3ZlcmlmeWApIGFuZCBtYXRjaGVkIFBsYWlkIG5ldHdvcmsgYWNjb3VudHMuIElmIGRlZmluZWQsIHdpbGwgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC4gV2lsbCBiZSB1bmRlZmluZWQgaWYgbmFtZSBtYXRjaGluZyB3YXMgbm90IGVuYWJsZWQgZm9yIHRoZSBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc2Vzc2lvbiBvciBpZiB0aGVyZSB3ZXJlIG5vIGVsaWdpYmxlIFBsYWlkIG5ldHdvcmsgbWF0Y2hlcyB0byBjb21wYXJlIHRoZSBnaXZlbiBuYW1lIHdpdGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgbmFtZV9tYXRjaF9zY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5ldHdvcmtfc3RhdHVzOiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIHByZXZpb3VzX3JldHVybnM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c0FjY291bnROdW1iZXJGb3JtYXR9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyX2Zvcm1hdDogQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzQWNjb3VudE51bWJlckZvcm1hdDtcbn1cbi8qKlxuICogSW5kaWNhdG9yIG9mIGFjY291bnQgbnVtYmVyIGZvcm1hdCB2YWxpZGl0eSBmb3IgaW5zdGl0dXRpb24uICBgdmFsaWRgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgYWNjb3VudCBudW1iZXIgaGFzIGEgY29ycmVjdCBmb3JtYXQgZm9yIHRoZSBpbnN0aXR1dGlvbi4gIGBpbnZhbGlkYDogaW5kaWNhdGVzIHRoYXQgdGhlIGFjY291bnQgbnVtYmVyIGhhcyBhbiBpbmNvcnJlY3QgZm9ybWF0IGZvciB0aGUgaW5zdGl0dXRpb24uICBgdW5rbm93bmA6IGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtYXQgaXMgY29ycmVjdCBmb3IgdGhlIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzQWNjb3VudE51bWJlckZvcm1hdCB7XG4gICAgVmFsaWQgPSAndmFsaWQnLFxuICAgIEludmFsaWQgPSAnaW52YWxpZCcsXG4gICAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG4vKipcbiAqIFN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgaW4gdGhlIFBsYWlkIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgbWF0Y2hpbmcgYWNjb3VudCBmb3IgdGhlIEFDSCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c1xuICAgICAqL1xuICAgIGhhc19udW1iZXJzX21hdGNoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBhdCBsZWFzdCBvbmUgbWF0Y2hpbmcgYWNjb3VudCBmb3IgdGhlIEFDSCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciBpcyBhbHJlYWR5IHZlcmlmaWVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzXG4gICAgICovXG4gICAgaXNfbnVtYmVyc19tYXRjaF92ZXJpZmllZDogYm9vbGVhbjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQga25vd24gQUNIIHJldHVybnMgZm9yIHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzUHJldmlvdXNSZXR1cm5zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzUHJldmlvdXNSZXR1cm5zIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGluY2x1ZGUgYSBrbm93biBhZG1pbmlzdHJhdGl2ZSBBQ0ggcmV0dXJuIGZvciB0aGlzIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnNcbiAgICAgKi9cbiAgICBoYXNfcHJldmlvdXNfYWRtaW5pc3RyYXRpdmVfcmV0dXJuOiBib29sZWFuO1xufVxuLyoqXG4gKiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCAqYW5kKiBvbmUgb3IgbW9yZSBhY2NvdW50IHR5cGVzIGJlaW5nIHJlcXVlc3RlZCBpcyBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgKHN1Y2ggYXMgYSBjcmVkaXQgY2FyZCkgYXMgQ2FwaXRhbCBPbmUgZG9lcyBub3QgcHJvdmlkZSByZWFsLXRpbWUgYmFsYW5jZSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIEluIHRoaXMgY2FzZSwgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCBhcyB3ZWxsIGFzIGZvciBkZXBvc2l0b3J5IGFjY291bnRzIGF0IENhcGl0YWwgT25lIChpbmNsdWRpbmcgYWxsIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzKSB0aGlzIGZpZWxkIGlzIGlnbm9yZWQgYW5kIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uIHdpbGwgYmUgZmV0Y2hlZC4gIElmIHRoaXMgZmllbGQgaXMgbm90IGlnbm9yZWQsIGFuZCBubyBhY2NlcHRhYmxlIGJhbGFuY2UgaXMgYXZhaWxhYmxlLCBhbiBgSU5WQUxJRF9SRVNVTFRgIGVycm9yIHdpdGggdGhlIGNvZGUgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2FjY291bnRzL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBBY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBY2NvdW50c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hY2NvdW50cy9nZXRgIGFuZCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIElmIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIHdhcyBjYWxsZWQsIGVhY2ggYWNjb3VudCB3aWxsIGluY2x1ZGUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIGFjdGlvbi9hY3Rpdml0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjdGlvblN0YXRlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEF0dGVtcHQgPSAnQVRURU1QVCcsXG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnLFxuICAgIFNraXBwZWQgPSAnU0tJUFBFRCdcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBjb25zZW50IGFjdGl2aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY3Rpdml0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWN0aXZpdHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGFjdGl2aXR5OiBBY3Rpdml0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhY3Rpdml0eSB3YXMgaW5pdGlhdGVkIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaW5pdGlhdGVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWN0aXZpdHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXBwbGljYXRpb24gSUQgb2YgdGhlIGNsaWVudCB3aG8gaW5pdGlhdGVkIHRoZSBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGluaXRpYXRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY3Rpb25TdGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzdGF0ZTogQWN0aW9uU3RhdGU7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgdGFyZ2V0X2FwcGxpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBhdXRoZW50aWNhdGlvbj86IEl0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbjtcbn1cbi8qKlxuICogVHlwZXMgb2YgY29uc2VudCBhY3Rpdml0aWVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpdml0eVR5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgSXRlbUNyZWF0ZSA9ICdJVEVNX0NSRUFURScsXG4gICAgSXRlbUltcG9ydCA9ICdJVEVNX0lNUE9SVCcsXG4gICAgSXRlbVVwZGF0ZSA9ICdJVEVNX1VQREFURScsXG4gICAgSXRlbVVubGluayA9ICdJVEVNX1VOTElOSycsXG4gICAgUG9ydGFsVW5saW5rID0gJ1BPUlRBTF9VTkxJTksnLFxuICAgIFBvcnRhbEl0ZW1zRGVsZXRlID0gJ1BPUlRBTF9JVEVNU19ERUxFVEUnLFxuICAgIEl0ZW1SZW1vdmUgPSAnSVRFTV9SRU1PVkUnLFxuICAgIEludmFyaWFudENoZWNrZXJEZWxldGlvbiA9ICdJTlZBUklBTlRfQ0hFQ0tFUl9ERUxFVElPTicsXG4gICAgU2NvcGVzVXBkYXRlID0gJ1NDT1BFU19VUERBVEUnXG59XG5cbi8qKlxuICogQSBwaHlzaWNhbCBtYWlsaW5nIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTm90UmVxdWlyZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYmVpbmcgdXNlZCBmb3IgY29tbWVyY2lhbCBvciByZXNpZGVudGlhbCBwdXJwb3Nlcy4gIE5vdGU6IFRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAgd2hlbiBQbGFpZCBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3NcXCdzIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFkZHJlc3NQdXJwb3NlTGFiZWwge1xuICAgIFJlc2lkZW50aWFsID0gJ3Jlc2lkZW50aWFsJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEFmZm9yZGFiaWxpdHkgaW5zaWdodHMgZm9jdXMgb24gcHJvdmlkaW5nIHNpZ25hbCBvbiB0aGUgYWJpbGl0eSBvZiBhIGJvcnJvd2VyIHRvIHJlcGF5IHRoZWlyIGxvYW4gd2l0aG91dCBleHBlcmllbmNpbmcgZmluYW5jaWFsIHN0cmFpbi4gSXQgcHJvdmlkZXMgaW5zaWdodHMgb24gZmFjdG9ycyBzdWNoIGFzIGEgdXNlclxcJ3MgbW9udGhseSBpbmNvbWUgYW5kIGV4cGVuc2VzLCBkaXNwb3NhYmxlIGluY29tZSwgYXZlcmFnZSBleHBlbmRpdHVyZSwgZXRjLiwgaGVscGluZyBsZW5kZXJzIGdhdWdlIHRoZSBsZXZlbCBvZiBhZmZvcmRhYmlsaXR5IG9mIGEgYm9ycm93ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFmZm9yZGFiaWxpdHlJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFmZm9yZGFiaWxpdHlJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGVuZGl0dXJlSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEFmZm9yZGFiaWxpdHlJbnNpZ2h0c1xuICAgICAqL1xuICAgIGV4cGVuZGl0dXJlPzogRXhwZW5kaXR1cmVJbnNpZ2h0cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBZmZvcmRhYmlsaXR5SW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBJbmNvbWVJbnNpZ2h0cyB8IG51bGw7XG59XG4vKipcbiAqIEEgbW9uZXRhcnkgYW1vdW50IHdpdGggaXRzIGFzc29jaWF0ZWQgY3VycmVuY3kgaW5mb3JtYXRpb24sIHN1cHBvcnRpbmcgYm90aCBvZmZpY2lhbCBhbmQgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2Rlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQW1vdW50V2l0aEN1cnJlbmN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW1vdW50V2l0aEN1cnJlbmN5IHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGFyZW50IG9iamVjdCByZXByZXNlbnRzIGEgY2F0ZWdvcnkgb2YgdHJhbnNhY3Rpb25zLCBzdWNoIGFzIGB0b3RhbF9hbW91bnRgLCBgdHJhbnNmZXJzX2luYCwgYHRvdGFsX2luY29tZWAsIGV0Yy4gdGhlIGBhbW91bnRgIHJlcHJlc2VudHMgdGhlIHN1bSBvZiBhbGwgb2YgdGhlIHRyYW5zYWN0aW9ucyBpbiB0aGUgZ3JvdXAuICBJZiB0aGUgcGFyZW50IG9iamVjdCBpcyBgY2FzaF9mbG93YCwgdGhlIGBhbW91bnRgIHJlcHJlc2VudHMgdGhlIHRvdGFsIHZhbHVlIG9mIGFsbCB0aGUgaW5mbG93cyBtaW51cyBhbGwgdGhlIG91dGZsb3dzIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQgaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LiAgSWYgdGhlIHBhcmVudCBvYmplY3QgaXMgYG1pbmltdW1fYmFsYW5jZWAsIHRoZSBgYW1vdW50YCByZXByZXNlbnRzIHRoZSBsb3dlc3QgYmFsYW5jZSBvZiB0aGUgYWNjb3VudCBkdXJpbmcgdGhlIGdpdmVuIHRpbWUgd2luZG93LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhbiBhbW91bnQgYW5kIGEgbW9udGhseSBhdmVyYWdlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgYXZlcmFnZSBhbW91bnQgb2YgYWxsIHRoZSBhZ2dyZWdhdGVkIHRyYW5zYWN0aW9ucyBvZiB0aGUgZ2l2ZW4gY2F0ZWdvcnksIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGZvciB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cuICBUaGUgYXZlcmFnZSBpcyBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZSB0b3RhbCBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9ucyBieSB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQW1vdW50V2l0aEN1cnJlbmN5V2l0aE1vbnRobHlBdmVyYWdlXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQW1vdW50V2l0aEN1cnJlbmN5V2l0aE1vbnRobHlBdmVyYWdlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBbW91bnRXaXRoQ3VycmVuY3lXaXRoTW9udGhseUF2ZXJhZ2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCB0aGUgYXBwbGljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBkaXNwbGF5IHB1cnBvc2VzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkaXNwbGF5X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgZ3JhbnRlZCBwcm9kdWN0aW9uIGFjY2VzcyBhdCBQbGFpZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGpvaW5fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgYXBwbGljYXRpb25cXCdzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgY2xpZW50XFwncyBicm9hZCB1c2UgY2FzZSBhcyBhc3Nlc3NlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHVzZV9jYXNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiBjbGllbnRcXCdzIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNvbXBhbnlfbGVnYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNpdHkgb2YgdGhlIGNsaWVudFxcJ3MgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlZ2lvbiBvZiB0aGUgY2xpZW50XFwncyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3N0YWwgY29kZSBvZiB0aGUgY2xpZW50XFwncyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgY29kZSBvZiB0aGUgY2xpZW50XFwncyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFwcGxpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGAsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hcHBsaWNhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXBwbGljYXRpb259XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbjogQXBwbGljYXRpb247XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0RFVEFJTDogQXNzZXREZXRhaWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0T3duZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX09XTkVSUzogQXNzZXRPd25lcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0SG9sZGVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0hPTERFUjogQXNzZXRIb2xkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OUzogQXNzZXRUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZhbGlkYXRpb25Tb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFxuICAgICAqL1xuICAgIFZBTElEQVRJT05fU09VUkNFUzogVmFsaWRhdGlvblNvdXJjZXM7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgYW4gYXNzZXQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0RGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXREZXRhaWwge1xuICAgIC8qKlxuICAgICAqIEEgdmVuZG9yIGNyZWF0ZWQgdW5pcXVlIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFVuaXF1ZUlkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbHBoYW51bWVyaWMgc3RyaW5nIGlkZW50aWZ5aW5nIGFuIGFzc2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRBY2NvdW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgUmVwb3J0IEFzIG9mIERhdGUgLyBDcmVhdGUgRGF0ZS4gRm9ybWF0IFlZWVktTU0tRERcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QXNPZkRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRleHQgZGVzY3JpcHRpb24gdGhhdCBmdXJ0aGVyIGRlZmluZXMgdGhlIEFzc2V0LiBUaGlzIGNvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNoYXJlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0b2NrcywgYm9uZHMgb3IgbXV0dWFsIGZ1bmRzLCByZXRpcmVtZW50IGZ1bmRzIG9yIGJ1c2luZXNzIG93bmVkIHRoYXQgdGhlIGJvcnJvd2VyIGhhcyBkaXNjbG9zZWQgKG5hbWVkKSBhcyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0RGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzZXQgQWNjb3VudCBBdmFpbGFibGUgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QXZhaWxhYmxlQmFsYW5jZUFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQ3VycmVudCBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRDdXJyZW50QmFsYW5jZUFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG1hcmtldCB2YWx1ZSBvZiBob2xkaW5ncyAobm9uLXJlc3RyaWN0ZWQsIHZlc3RlZCwgbm90IGNyeXB0bywgbm90IG90aGVyLCBub3QgY2FzaCkgTm90ZTogQW55IGVtcGxveWVyIHN0b2NrIHBsYW4gYmFsYW5jZSBtdXN0IGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHRvdGFsIGFjY291bnQgYmFsYW5jZSAoaWRlbnRpZmljYXRpb24gaXMgXFwnc3RvY2sgcGxhblxcJylcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0SG9sZGluZ0JhbGFuY2VBbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvbGRpbmdzQmFsYW5jZSBuZXQgTWFyZ2luQW1vdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdCYWxhbmNlTmV0TWFyZ2luQW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBtYXJrZXQgdmFsdWUgb2YgYWxsIGJvbmRzIGhlbGQgKG5vbi1yZXN0cmljdGVkLCB2ZXN0ZWQpXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEJvbmRzQmFsYW5jZUFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgbWFya2V0IHZhbHVlIG9mIGFsbCBzdG9ja3MgaGVsZCAobm9uLXJlc3RyaWN0ZWQsIHZlc3RlZCwgbm90IGVtcGxveWVyIHNwb25zb3JlZCBzdG9jayBwbGFuKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRTdG9ja3NCYWxhbmNlQW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBiYWxhbmNlIG9mIGFsbCBjcnlwdG9jdXJyZW5jeSBoZWxkIChub24tcmVzdHJpY3RlZCwgdmVzdGVkKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRDcnlwdG9CYWxhbmNlQW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBiYWxhbmNlIG9mIGFsbCBvdGhlciBob2xkaW5nIHR5cGVzIChub24tcmVzdHJpY3RlZCwgdmVzdGVkKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRPdGhlckJhbGFuY2VBbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGxvYW4gYmFsYW5jZSAoYW1vdW50IG93ZWQgYnkgYWNjb3VudCBvd25lcilcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0TWFyZ2luQW1vdW50QmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogYW1vdW50IGF2YWlsYWJsZSBmb3IgY2FzaCB3aXRoZHJhd2FsXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUNhc2hCYWxhbmNlQW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBjYXNoIGJhbGFuY2Ugb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0Q2FzaEJhbGFuY2VBbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlOiBBc3NldFR5cGU7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBBc3NldCBEZXNjcmlwdGlvbi4gU29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQsIExvYW4sIDQwMUssIDQwM0IsIENoZWNraW5nLCBNb25leSBNYXJrZXQsIENyZWRpdCBDYXJkLCBST1RILCA1MjksIEJpbGxlciwgUk9MTE9WRVIsIENELCBTYXZpbmdzLCBJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYWNjb3VudCBpcyBhIHJldGlyZW1lbnQgYWNjb3VudCAoZS5nLiwgNDAxSywgNDAzYiwgNDU3LCB0aHJpZnQgc2F2aW5ncyBwbGFucywgdHJhZGl0aW9uYWwgYW5kIFJvdGgsIElSQXMsIFNFUC1JUkEsIFNJTVBMRS1JUkEsIEtFT0dILCBzdGF0ZSByZXRpcmVtZW50IHNhdmluZ3MgcGxhbnMsIG90aGVyIGluZGVwZW5kZW50IGFuZCBJUlMtcXVhbGlmaWVkIGVtcGxveWVyIHJldGlyZW1lbnQgcGxhbnMpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFJldGlyZW1lbnRJbmRpY2F0b3I/OiBBc3NldERldGFpbEFzc2V0UmV0aXJlbWVudEluZGljYXRvckVudW07XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBpcyBlbXBsb3llciBzcG9uc29yZWQgcmV0aXJlbWVudCBhY2NvdW50IG9yIG5vdCAoZS5nLiwgNDAxSywgNDAzYiwgNDU3LCB0aHJpZnQgc2F2aW5ncyBwbGFuKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRFbXBsb3llclNwb25zb3JlZEluZGljYXRvcj86IEFzc2V0RGV0YWlsQXNzZXRFbXBsb3llclNwb25zb3JlZEluZGljYXRvckVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQXNzZXREZXRhaWxBc3NldFJldGlyZW1lbnRJbmRpY2F0b3JFbnVtIHtcbiAgICBUcnVlID0gJ3RydWUnLFxuICAgIEZhbHNlID0gJ2ZhbHNlJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBc3NldERldGFpbEFzc2V0RW1wbG95ZXJTcG9uc29yZWRJbmRpY2F0b3JFbnVtIHtcbiAgICBUcnVlID0gJ3RydWUnLFxuICAgIEZhbHNlID0gJ2ZhbHNlJ1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRIb2xkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldEhvbGRlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0SG9sZGVyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkZXJcbiAgICAgKi9cbiAgICBOQU1FOiBBc3NldEhvbGRlck5hbWU7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRIb2xkZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRIb2xkZXJOYW1lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5wYXJzZWQgbmFtZSBvZiBlaXRoZXIgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlck5hbWVcbiAgICAgKi9cbiAgICBGdWxsTmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0SG9sZGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGluZyB7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkIG9mIGludmVzdG1lbnQgcG9zaXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdJRDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVUyBEb2xsYXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBDdXJyZW5jeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiBob2xkaW5nXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nRGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW52ZXN0bWVudCBwb3NpdGlvblxcJ3MgbWFya2V0IHRpY2tlciBzeW1ib2xcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdTeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2VjdXJpdHkgbmFtZSBvZiBpbnZlc3RtZW50IGhvbGRpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdTZWN1cml0eU5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHVuaXRzIG9mIGhvbGRpbmdcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdVbml0czogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBtYXJrZXQgdmFsdWUgb2YgaW52ZXN0bWVudCBwb3NpdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGluZ1xuICAgICAqL1xuICAgIEFzc2V0SG9sZGluZ01hcmtldFZhbHVlQW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGN1cnJlbnQgcHJpY2Ugb2YgaW52ZXN0bWVudCBob2xkaW5nXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nQ3VycmVudFByaWNlQW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgaG9sZGluZyAoZS5nLiBib25kLCBzdG9jaywgY3J5cHRvLCBvdGhlcilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdUeXBlOiBBc3NldEhvbGRpbmdBc3NldEhvbGRpbmdUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc3RvY2sgaXMgcmVzdHJpY3RlZCwgaS5lLiBcXFwiUmVzdHJpY3RlZFxcXCIgb3IgXFxcIk5vdCBSZXN0cmljdGVkXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGluZ1xuICAgICAqL1xuICAgIEFzc2V0SG9sZGluZ1Jlc3RyaWN0ZWRJbmRpY2F0b3I6IEFzc2V0SG9sZGluZ0Fzc2V0SG9sZGluZ1Jlc3RyaWN0ZWRJbmRpY2F0b3JFbnVtO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBob2xkaW5nIHZlc3RlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGluZ1xuICAgICAqL1xuICAgIEFzc2V0SG9sZGluZ1Zlc3RlZEFtb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBc3NldEhvbGRpbmdBc3NldEhvbGRpbmdUeXBlRW51bSB7XG4gICAgQm9uZCA9ICdCb25kJyxcbiAgICBTdG9jayA9ICdTdG9jaycsXG4gICAgQ3J5cHRvID0gJ0NyeXB0bycsXG4gICAgT3RoZXIgPSAnT3RoZXInXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFzc2V0SG9sZGluZ0Fzc2V0SG9sZGluZ1Jlc3RyaWN0ZWRJbmRpY2F0b3JFbnVtIHtcbiAgICBUcnVlID0gJ3RydWUnLFxuICAgIEZhbHNlID0gJ2ZhbHNlJ1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRIb2xkaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGluZ3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdzXG4gICAgICovXG4gICAgQVNTRVRfSE9MRElORzogQXJyYXk8QXNzZXRIb2xkaW5nPjtcbn1cbi8qKlxuICogQXNzZXQgSW52ZXN0bWVudCBUcmFuc2FjdGlvbiBUeXBlIEVudW1lcmF0ZWQgZGVyaXZlZCBieSBWZW5kb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGUge1xuICAgIEJ1eSA9ICdCdXknLFxuICAgIFNlbGwgPSAnU2VsbCcsXG4gICAgRGl2aWRlbmRzID0gJ0RpdmlkZW5kcycsXG4gICAgSW50ZXJlc3QgPSAnSW50ZXJlc3QnLFxuICAgIFRyYW5zZmVycyA9ICdUcmFuc2ZlcnMnLFxuICAgIFJlaW52ZXN0bWVudHMgPSAnUmVpbnZlc3RtZW50cycsXG4gICAgRnVuZHNSZWNlaXZlZCA9ICdGdW5kc1JlY2VpdmVkJyxcbiAgICBPdGhlciA9ICdPdGhlcidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0T3duZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IE93bmVyIEZ1bGwgTmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldE93bmVyXG4gICAgICovXG4gICAgQXNzZXRPd25lclRleHQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldE93bmVycyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHVwIHRvIDQgYWNjb3VudCBvd25lcnNcXCcgZnVsbCBuYW1lcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJzXG4gICAgICovXG4gICAgQVNTRVRfT1dORVI6IEFycmF5PEFzc2V0T3duZXI+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEFzc2V0IFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBpbnNpZ2h0cz86IEFjY291bnRJbnNpZ2h0cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB5b3UgZGV0ZXJtaW5lIGFuZCBzdWJtaXQgZm9yIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEFzc2V0IFJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0XG4gICAgICovXG4gICAgZGF0ZV9nZW5lcmF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB5b3UgcmVxdWVzdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0XG4gICAgICovXG4gICAgdXNlcjogQXNzZXRSZXBvcnRVc2VyO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8QXNzZXRSZXBvcnRJdGVtPjtcbn1cbi8qKlxuICogQSBzZXQgb2YgZmllbGRzIGRlc2NyaWJpbmcgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQuIEJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIGJhbGFuY2Ugb2JqZWN0IHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbC10aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGJvcnJvd2VkIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBpbnZlc3RtZW50LXR5cGUgYWNjb3VudHMsIHRoZSBtYXJnaW4gYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYm9ycm93ZWQgYXNzZXRzIGluIHRoZSBhY2NvdW50LCBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBUaGlzIGlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIG1hcmdpbiBvciBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIG1hcmdpbl9sb2FuX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBZGQtb25zIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBBc3NldCBSZXBvcnQuICBgaW52ZXN0bWVudHNgOiBUaGUgSW52ZXN0bWVudHMgYWRkLW9uIGBmYXN0X2Fzc2V0c2A6IFRoZSBGYXN0IEFzc2V0cyBhZGQtb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0QWRkT25zIHtcbiAgICBJbnZlc3RtZW50cyA9ICdpbnZlc3RtZW50cycsXG4gICAgRmFzdEFzc2V0cyA9ICdmYXN0X2Fzc2V0cydcbn1cblxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdG9yX2lkYCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRvcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIEF1ZGl0IENvcHkgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byBnZXQgYXMgYSBQREYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuIFRoZSBgYXNzZXRzYCBwcm9kdWN0IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIGxpbms7IHRoZSBBc3NldHMgcHJvZHVjdCBjYW5ub3QgYmUgYWRkZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuIElmIHVzaW5nIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR5LCBgZGF5c19yZXF1ZXN0ZWRgIG11c3QgYmUgYXQgbGVhc3QgNjEgZm9yIG5ldyBvcmlnaW5hdGlvbnMgb3IgYXQgbGVhc3QgMzEgZm9yIHJlZmluYW5jaW5ncy4gIEFuIEFzc2V0IFJlcG9ydCByZXF1ZXN0ZWQgd2l0aCBcXFwiQWRkaXRpb25hbCBIaXN0b3J5XFxcIiAodGhhdCBpcywgd2l0aCBtb3JlIHRoYW4gNjEgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5KSB3aWxsIGluY3VyIGFuIEFkZGl0aW9uYWwgSGlzdG9yeSBmZWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLiBUaGUgb3B0aW9uYWwgYHVzZXJgIG9iamVjdCBpcyByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR5IHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiB0cnVlIHRvIHJldHVybiBiYWxhbmNlIGFuZCBpZGVudGl0eSBlYXJsaWVyIGFzIGEgZmFzdCByZXBvcnQuIERlZmF1bHRzIHRvIGZhbHNlIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfZmFzdF9yZXBvcnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBhc3NldCByZXBvcnQuIFBvc3NpYmxlIHZhbHVlczogYFxcXCJpbnZlc3RtZW50c1xcXCJgXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBXaGVuIEludmVzdG1lbnRzIGlzIHJlcXVlc3RlZCwgYGludmVzdG1lbnRzYCBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgYG9wdGlvbmFsX3Byb2R1Y3RzYCBhcnJheSB3aGVuIGluaXRpYWxpemluZyBMaW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEFkZE9ucz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQgKGB0cnVlYCksIHRoZSBhc3luY2hyb25vdXMgcmVwb3J0IGdlbmVyYXRpb24gZmFpbHMgdW5sZXNzIGFsbCBJdGVtcyBleHRyYWN0IHN1Y2Nlc3NmdWxseS4gSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSByZXBvcnQgd2lsbCBzdGlsbCBiZSBnZW5lcmF0ZWQgYXMgbG9uZyBhcyBhdCBsZWFzdCBvbmUgSXRlbSBleHRyYWN0cyBzdWNjZXNzZnVsbHk7IGV4dHJhY3Rpb24gZmFpbHVyZXMgb24gdGhlIHJlbWFpbmluZyBJdGVtcyBhcmUgdG9sZXJhdGVkLiBUaGlzIHNldHRpbmcgYXBwbGllcyBvbmx5IHRvIGZhaWx1cmVzIHRoYXQgb2NjdXIgZHVyaW5nIGFzeW5jaHJvbm91cyBleHRyYWN0aW9uLiBJdCBkb2VzIG5vdCByZWxheCB0aGUgc3luY2hyb25vdXMgY2hlY2sgYXQgY2FsbCB0aW1lOiBpZiBhbnkgSXRlbSBpcyBhbHJlYWR5IHVuaGVhbHRoeSB3aGVuIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgaXMgaW52b2tlZCwgdGhlIHJlcXVlc3QgZmFpbHMgaW1tZWRpYXRlbHkgcmVnYXJkbGVzcyBvZiB0aGlzIHZhbHVlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWlyZV9hbGxfaXRlbXM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBBc3NldCBSZXBvcnQsIGlkZW50aWZpZWQgYnkgYGFjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc190b19leGNsdWRlOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZmlsdGVyYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIHNjaGVtYS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZVxuICAgICAqL1xuICAgIExPQU5TOiBMb2FucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydGllc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgUEFSVElFUzogUGFydGllcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZXN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZVxuICAgICAqL1xuICAgIFNFUlZJQ0VTOiBTZXJ2aWNlcztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBmb3Igd2hpY2ggdG8gY3JlYXRlIGFuIGFzc2V0IHJlcG9ydCBmb3IuIFRoZSBsYXRlc3QgYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB3aWxsIGJlIHJldHVybmVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBgZmFsc2VgIG90aGVyd2lzZS4gVGhpcyBmaWVsZCBkZWZhdWx0cyB0byBgZmFsc2VgIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW5zaWdodHM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBmZXRjaCBcXFwiZmFzdFxcXCIgdmVyc2lvbiBvZiBhc3NldCByZXBvcnQuIERlZmF1bHRzIHRvIGZhbHNlIGlmIG9taXR0ZWQuIENhbiBvbmx5IGJlIHVzZWQgaWYgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3YXMgY2FsbGVkIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBmYXN0X3JlcG9ydD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIG9yIGFkZCBkYXRhIHRvIGAvYXNzZXRfcmVwb3J0L2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBBc3NldFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdcXCdzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgaG9sZGluZ3MsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB0b3RhbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gVGhpcyBmaWVsZCBpcyBjYWxjdWxhdGVkIGJ5IFBsYWlkIGFzIHRoZSBzdW0gb2YgdGhlIHB1cmNoYXNlIHByaWNlIG9mIGFsbCBvZiB0aGUgc2hhcmVzIGluIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5XFwncyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBJbnZlc3RtZW50IHRyYW5zYWN0aW9uLCB1bmlxdWUgYWNyb3NzIGFsbCBQbGFpZCB0cmFuc2FjdGlvbnMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9uXFwncyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHZlc3RlZCBhc3NldHMgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVmVzdGVkIGFzc2V0cyBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggW2VxdWl0aWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHMtaG9sZGluZ3MtZ2V0LXJlc3BvbnNlLXNlY3VyaXRpZXMtdHlwZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHZlc3RlZCBob2xkaW5ncyBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB2ZXN0ZWRfdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGxldGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGRlYml0ZWQsIGUuZy4gcHVyY2hhc2VzIG9mIHN0b2NrOyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGNyZWRpdGVkLCBlLmcuIHNhbGVzIG9mIHN0b2NrLiBUcmVhdG1lbnQgcmVtYWlucyB0aGUgc2FtZSBmb3IgY2FzaC1vbmx5IG1vdmVtZW50cyB1bmFzc29jaWF0ZWQgd2l0aCBzZWN1cml0aWVzLiBGb3IgdHJhbnNhY3Rpb25zIHJlcHJlc2VudGluZyBhIHNpbXVsdGFuZW91cyBjYXNoIGNvbnRyaWJ1dGlvbiBhbmQgcHVyY2hhc2Ugb2YgYSBzZWN1cml0eSwgdGhlIHBvcnRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHJlcHJlc2VudGluZyB0aGUgcHVyY2hhc2UgdGFrZXMgcHJlY2VkZW5jZSwgYW5kIHRoZSBgYW1vdW50YCBpcyByZXByZXNlbnRlZCBhcyBwb3NpdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmVlczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBpbnZlc3RtZW50cyBkYXRhIG9uIGFuIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBRdWFudGl0aWVzIGFuZCB2YWx1ZXMgb2Ygc2VjdXJpdGllcyBoZWxkIGluIHRoZSBpbnZlc3RtZW50IGFjY291bnQuIE1hcCB0byB0aGUgYHNlY3VyaXRpZXNgIGFycmF5IGZvciBzZWN1cml0eSBkZXRhaWxzLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogQXJyYXk8QXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvZiBzcGVjaWZpYyBzZWN1cml0aWVzIGhlbGQgaW4gb24gdGhlIGludmVzdG1lbnQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc2VjdXJpdGllcz86IEFycmF5PEFzc2V0UmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IG9uIHRoZSBpbnZlc3RtZW50IGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEFycmF5PEFzc2V0UmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBJdGVtIHdpdGhpbiBhbiBBc3NldCBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBkYXRlX2xhc3RfdXBkYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgZWFjaCBvZiB0aGUgYWNjb3VudHMgb3BlbiBvbiB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFzc2V0cz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QXNzZXRzPjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIG9yIGFkZCBkYXRhIHRvIGAvYXNzZXRfcmVwb3J0L2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfdG9faW5jbHVkZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybmVkIGJ5IHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuIE11c3QgYmUgYW4gaW50ZWdlci4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIGNhbm5vdCBiZSBgbnVsbGAuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBgb3B0aW9uc2AgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpbGwgYmUgdXNlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBBc3NldHMgd2ViaG9va3MsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RlZCBBc3NldCBSZXBvcnQgaXMgcmVhZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHVzZXI/OiBBc3NldFJlcG9ydFVzZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBc3NldCBSZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiBvbiB0aGUgYXNzZXQgcmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWRpdF9jYXRlZ29yeT86IENyZWRpdENhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiBUaGlzIGlzIGEgbGVnYWN5IGZpZWxkIHRoYXQgaXMgbm8gbG9uZ2VyIG1haW50YWluZWQuIEZvciBtZXJjaGFudCBuYW1lLCB1c2UgdGhlIGBtZXJjaGFudF9uYW1lYCBmaWVsZC4gRm9yIGRlc2NyaXB0aW9uLCB1c2UgdGhlIGBvcmlnaW5hbF9kZXNjcmlwdGlvbmAgZmllbGQuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyBlaXRoZXIgYSBGYXN0IEFzc2V0IFJlcG9ydCwgd2hpY2ggd2lsbCBjb250YWluIG9ubHkgY3VycmVudCBpZGVudGl0eSBhbmQgYmFsYW5jZSBpbmZvcm1hdGlvbiwgb3IgYSBGdWxsIEFzc2V0IFJlcG9ydCwgd2hpY2ggd2lsbCBhbHNvIGNvbnRhaW4gaGlzdG9yaWNhbCBiYWxhbmNlIGluZm9ybWF0aW9uIGFuZCB0cmFuc2FjdGlvbiBkYXRhLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRSZXBvcnRUeXBlIHtcbiAgICBGdWxsID0gJ0ZVTEwnLFxuICAgIEZhc3QgPSAnRkFTVCdcbn1cblxuLyoqXG4gKiBUaGUgdXNlciBvYmplY3QgYWxsb3dzIHlvdSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIEFzc2V0IFJlcG9ydC4gQWxsIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFRoZSBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBhbmQgYHNzbmAgZmllbGRzIGFyZSByZXF1aXJlZCBpZiB5b3Ugd291bGQgbGlrZSB0aGUgUmVwb3J0IHRvIGJlIGVsaWdpYmxlIGZvciBGYW5uaWUgTWFlXFwncyBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmaXJzdCBuYW1lLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgZmlyc3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG1pZGRsZSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgbWlkZGxlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWUuICBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgU29jaWFsIFNlY3VyaXR5IE51bWJlci4gUmVxdWlyZWQgZm9yIHRoZSBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiAgRm9ybWF0OiBcXFwiZGRkLWRkLWRkZGRcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcuLi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVUQUlMOiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy4gTm90ZSB0aGF0IFxcXCJERVNDUklQVE9OXFxcIiBpcyBhbiBpbnRlbnRpb25hbCBtaXNzcGVsbGluZyBtYXRjaGluZyB0aGUgdXBzdHJlYW0gTUlTTU8gZmllbGQgbmFtZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFU0NSSVBUT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj47XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIENhdGVnb3J5IFR5cGUgRW51bWVyYXRlZCBkZXJpdmVkIGJ5IFZlbmRvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0VHJhbnNhY3Rpb25DYXRlZ29yeVR5cGUge1xuICAgIEF0bUZlZSA9ICdBVE1GZWUnLFxuICAgIEFkdmVydGlzaW5nID0gJ0FkdmVydGlzaW5nJyxcbiAgICBBaXJUcmF2ZWwgPSAnQWlyVHJhdmVsJyxcbiAgICBBbGNvaG9sQmFycyA9ICdBbGNvaG9sQmFycycsXG4gICAgQWxsb3dhbmNlID0gJ0FsbG93YW5jZScsXG4gICAgQW11c2VtZW50ID0gJ0FtdXNlbWVudCcsXG4gICAgQXJ0cyA9ICdBcnRzJyxcbiAgICBBdXRvVHJhbnNwb3J0ID0gJ0F1dG9UcmFuc3BvcnQnLFxuICAgIEF1dG9JbnN1cmFuY2UgPSAnQXV0b0luc3VyYW5jZScsXG4gICAgQXV0b1BheW1lbnQgPSAnQXV0b1BheW1lbnQnLFxuICAgIEJhYnlTdXBwbGllcyA9ICdCYWJ5U3VwcGxpZXMnLFxuICAgIEJhYnlzaXR0ZXJEYXljYXJlID0gJ0JhYnlzaXR0ZXJEYXljYXJlJyxcbiAgICBCYW5rRmVlID0gJ0JhbmtGZWUnLFxuICAgIEJpbGxzVXRpbGl0aWVzID0gJ0JpbGxzVXRpbGl0aWVzJyxcbiAgICBCb251cyA9ICdCb251cycsXG4gICAgQm9va3NTdXBwbGllcyA9ICdCb29rc1N1cHBsaWVzJyxcbiAgICBCdXNpbmVzc1NlcnZpY2VzID0gJ0J1c2luZXNzIFNlcnZpY2VzJyxcbiAgICBCdXkgPSAnQnV5JyxcbiAgICBDYXNoQXRtID0gJ0Nhc2hBVE0nLFxuICAgIENoYXJpdHkgPSAnQ2hhcml0eScsXG4gICAgQ2hlY2sgPSAnQ2hlY2snLFxuICAgIENoaWxkU3VwcG9ydCA9ICdDaGlsZFN1cHBvcnQnLFxuICAgIENsb3RoaW5nID0gJ0Nsb3RoaW5nJyxcbiAgICBDb2ZmZWVTaG9wcyA9ICdDb2ZmZWVTaG9wcycsXG4gICAgQ3JlZGl0Q2FyZFBheW1lbnQgPSAnQ3JlZGl0Q2FyZFBheW1lbnQnLFxuICAgIERlbnRpc3QgPSAnRGVudGlzdCcsXG4gICAgRG9jdG9yID0gJ0RvY3RvcicsXG4gICAgRWR1Y2F0aW9uID0gJ0VkdWNhdGlvbicsXG4gICAgRWxlY3Ryb25pY3NTb2Z0d2FyZSA9ICdFbGVjdHJvbmljc1NvZnR3YXJlJyxcbiAgICBFbnRlcnRhaW5tZW50ID0gJ0VudGVydGFpbm1lbnQnLFxuICAgIEV5ZWNhcmUgPSAnRXllY2FyZScsXG4gICAgRmFzdEZvb2QgPSAnRmFzdEZvb2QnLFxuICAgIEZlZGVyYWxUYXggPSAnRmVkZXJhbFRheCcsXG4gICAgRmVlc0NoYXJnZXMgPSAnRmVlc0NoYXJnZXMnLFxuICAgIEZpbmFuY2VDaGFyZ2UgPSAnRmluYW5jZUNoYXJnZScsXG4gICAgRmluYW5jaWFsID0gJ0ZpbmFuY2lhbCcsXG4gICAgRmluYW5jaWFsQWR2aXNvciA9ICdGaW5hbmNpYWxBZHZpc29yJyxcbiAgICBGb29kRGluaW5nID0gJ0Zvb2REaW5pbmcnLFxuICAgIEZ1cm5pc2hpbmdzID0gJ0Z1cm5pc2hpbmdzJyxcbiAgICBHYXNGdWVsID0gJ0dhc0Z1ZWwnLFxuICAgIEdpZnRzRG9uYXRpb25zID0gJ0dpZnRzRG9uYXRpb25zJyxcbiAgICBHcm9jZXJpZXMgPSAnR3JvY2VyaWVzJyxcbiAgICBHeW0gPSAnR3ltJyxcbiAgICBIYWlyID0gJ0hhaXInLFxuICAgIEhlYWx0aEZpdG5lc3MgPSAnSGVhbHRoRml0bmVzcycsXG4gICAgSGVhbHRoSW5zdXJhbmNlID0gJ0hlYWx0aEluc3VyYW5jZScsXG4gICAgSG9iYmllcyA9ICdIb2JiaWVzJyxcbiAgICBIb21lID0gJ0hvbWUnLFxuICAgIEhvbWVJbXByb3ZlbWVudCA9ICdIb21lSW1wcm92ZW1lbnQnLFxuICAgIEhvbWVJbnN1cmFuY2UgPSAnSG9tZUluc3VyYW5jZScsXG4gICAgSG9tZVBob25lID0gJ0hvbWVQaG9uZScsXG4gICAgSG9tZVNlcnZpY2VzID0gJ0hvbWVTZXJ2aWNlcycsXG4gICAgSG9tZVN1cHBsaWVzID0gJ0hvbWVTdXBwbGllcycsXG4gICAgSG90ZWwgPSAnSG90ZWwnLFxuICAgIEluY29tZSA9ICdJbmNvbWUnLFxuICAgIEludGVyZXN0SW5jb21lID0gJ0ludGVyZXN0SW5jb21lJyxcbiAgICBJbnRlcm5ldCA9ICdJbnRlcm5ldCcsXG4gICAgSW52ZXN0bWVudHMgPSAnSW52ZXN0bWVudHMnLFxuICAgIEtpZHMgPSAnS2lkcycsXG4gICAgS2lkc0FjdGl2aXRpZXMgPSAnS2lkc0FjdGl2aXRpZXMnLFxuICAgIExhdGVGZWUgPSAnTGF0ZUZlZScsXG4gICAgTGF1bmRyeSA9ICdMYXVuZHJ5JyxcbiAgICBMYXduR2FyZGVuID0gJ0xhd25HYXJkZW4nLFxuICAgIExlZ2FsID0gJ0xlZ2FsJyxcbiAgICBMaWZlSW5zdXJhbmNlID0gJ0xpZmVJbnN1cmFuY2UnLFxuICAgIExvYW5JbnN1cmFuY2UgPSAnTG9hbkluc3VyYW5jZScsXG4gICAgTG9hblBheW1lbnQgPSAnTG9hblBheW1lbnQnLFxuICAgIExvYW5zID0gJ0xvYW5zJyxcbiAgICBNb2JpbGVQaG9uZSA9ICdNb2JpbGVQaG9uZScsXG4gICAgTW9ydGdhZ2VSZW50ID0gJ01vcnRnYWdlUmVudCcsXG4gICAgTW92aWVzRHZkcyA9ICdNb3ZpZXNEVkRzJyxcbiAgICBNdXNpYyA9ICdNdXNpYycsXG4gICAgTmV3c3BhcGVyc01hZ2F6aW5lcyA9ICdOZXdzcGFwZXJzTWFnYXppbmVzJyxcbiAgICBPZmZpY2VTdXBwbGllcyA9ICdPZmZpY2VTdXBwbGllcycsXG4gICAgUGFya2luZyA9ICdQYXJraW5nJyxcbiAgICBQYXljaGVjayA9ICdQYXljaGVjaycsXG4gICAgUGVyc29uYWxDYXJlID0gJ1BlcnNvbmFsQ2FyZScsXG4gICAgUGV0Rm9vZFN1cHBsaWVzID0gJ1BldEZvb2RTdXBwbGllcycsXG4gICAgUGV0R3Jvb21pbmcgPSAnUGV0R3Jvb21pbmcnLFxuICAgIFBldHMgPSAnUGV0cycsXG4gICAgUGhhcm1hY3kgPSAnUGhhcm1hY3knLFxuICAgIFByaW50aW5nID0gJ1ByaW50aW5nJyxcbiAgICBQcm9wZXJ0eVRheCA9ICdQcm9wZXJ0eSBUYXgnLFxuICAgIFB1YmxpY1RyYW5zcG9ydGF0aW9uID0gJ1B1YmxpYyBUcmFuc3BvcnRhdGlvbicsXG4gICAgUmVpbWJ1cnNlbWVudCA9ICdSZWltYnVyc2VtZW50JyxcbiAgICBSZW50YWxDYXJUYXhpID0gJ1JlbnRhbENhclRheGknLFxuICAgIFJlc3RhdXJhbnRzID0gJ1Jlc3RhdXJhbnRzJyxcbiAgICBTYWxlc1RheCA9ICdTYWxlc1RheCcsXG4gICAgU2VydmljZVBhcnRzID0gJ1NlcnZpY2VQYXJ0cycsXG4gICAgU2VydmljZUZlZSA9ICdTZXJ2aWNlRmVlJyxcbiAgICBTaGlwcGluZyA9ICdTaGlwcGluZycsXG4gICAgU2hvcHBpbmcgPSAnU2hvcHBpbmcnLFxuICAgIFNwYU1hc3NhZ2UgPSAnU3BhTWFzc2FnZScsXG4gICAgU3BvcnRpbmdHb29kcyA9ICdTcG9ydGluZ0dvb2RzJyxcbiAgICBTcG9ydHMgPSAnU3BvcnRzJyxcbiAgICBTdGF0ZVRheCA9ICdTdGF0ZVRheCcsXG4gICAgU3R1ZGVudExvYW4gPSAnU3R1ZGVudCBMb2FuJyxcbiAgICBUYXhlcyA9ICdUYXhlcycsXG4gICAgVGVsZXZpc2lvbiA9ICdUZWxldmlzaW9uJyxcbiAgICBUb3lzID0gJ1RveXMnLFxuICAgIFRyYW5zZmVyID0gJ1RyYW5zZmVyJyxcbiAgICBUcmF2ZWwgPSAnVHJhdmVsJyxcbiAgICBUdWl0aW9uID0gJ1R1aXRpb24nLFxuICAgIFVuY2F0ZWdvcml6ZWQgPSAnVW5jYXRlZ29yaXplZCcsXG4gICAgVXRpbGl0aWVzID0gJ1V0aWxpdGllcycsXG4gICAgVmFjYXRpb24gPSAnVmFjYXRpb24nLFxuICAgIFZldGVyaW5hcnkgPSAnVmV0ZXJpbmFyeSdcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbiB7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gRGVzY3JpcHRpb24gU3RyaW5nIHVwIHRvIDMgb2NjdXJyZW5jZXMgMSByZXF1aXJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb246IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbCB7XG4gICAgLyoqXG4gICAgICogQSB2ZW5kb3IgY3JlYXRlZCB1bmlxdWUgSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblVuaXF1ZUlkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBBbW91bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25BbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uRGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IFRyYW5zYWN0aW9uIFBvc3QgRGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblBvc3REYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblR5cGU6IEFzc2V0VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGU/OiBBc3NldEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlIHdpdGggd2hvIGRpZCB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25QYWlkQnlOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlIHdpdGggZm9yIHdob20gdGhlIHRyYW5zYWN0aW9uIGlzIGRvbmVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblBhaWRUb05hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZJIFByb3ZpZGVkIC0gZXhhbXBsZXMgYXJlIGF0bSwgY2FzaCwgY2hlY2ssIGNyZWRpdCwgZGViaXQsIGRlcG9zaXQsIGRpcmVjdERlYml0LCBkaXJlY3REZXBvc2l0LCBkaXZpZGVuZCwgZmVlLCBpbnRlcmVzdCwgb3RoZXIsIHBheW1lbnQsIHBvaW50T2ZTYWxlLCByZXBlYXRQYXltZW50LCBzZXJ2aWNlQ2hhcmdlLCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblR5cGVBZGRpdGlvbmFsRGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzZXQgSW52ZXN0bWVudCBUcmFuc2FjdGlvbiBUeXBlIERlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25DYXRlZ29yeVR5cGU6IEFzc2V0VHJhbnNhY3Rpb25DYXRlZ29yeVR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZJIHByb3ZpZGVkIFRyYW5zYWN0aW9uIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNhY3Rpb25JZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldCBUcmFuc2FjdGlvbiBUeXBlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvblR5cGUge1xuICAgIENyZWRpdCA9ICdDcmVkaXQnLFxuICAgIERlYml0ID0gJ0RlYml0J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OOiBBcnJheTxBc3NldFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgc3BlY2lmaWVzIGZpbmFuY2lhbCBhc3NldHMgaW4gYSBtb3J0Z2FnZSBsb2FuIHRyYW5zYWN0aW9uLiBBc3NldHMgbWF5IGJlIGVpdGhlciBsaXF1aWQgb3IgZml4ZWQgYW5kIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGFzc2V0IGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0VHlwZSB7XG4gICAgQ2hlY2tpbmdBY2NvdW50ID0gJ0NoZWNraW5nQWNjb3VudCcsXG4gICAgU2F2aW5nc0FjY291bnQgPSAnU2F2aW5nc0FjY291bnQnLFxuICAgIEludmVzdG1lbnQgPSAnSW52ZXN0bWVudCcsXG4gICAgTW9uZXlNYXJrZXRGdW5kID0gJ01vbmV5TWFya2V0RnVuZCcsXG4gICAgT3RoZXIgPSAnT3RoZXInXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNcbiAgICAgKi9cbiAgICBBU1NFVDogQXJyYXk8QXNzZXQ+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIEFzc2V0IFJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIFRoZSByZXN1bHRpbmcgYGVycm9yYCB3aWxsIGhhdmUgYW4gYGVycm9yX3R5cGVgIG9mIGBBU1NFVF9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldHNFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHNFcnJvcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgYC9hc3NldF9yZXBvcnQvZ2V0YCBpcyByZWFkeSB0byBiZSBjYWxsZWQuICBJZiB5b3UgYXR0ZW1wdCB0byByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgYmVmb3JlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIHlvdVxcJ2xsIHJlY2VpdmUgYSByZXNwb25zZSB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIDQwMCBhbmQgYSBQbGFpZCBlcnJvciBjb2RlIG9mIGBQUk9EVUNUX05PVF9SRUFEWWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVNTRVRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFzc2V0IFJlcG9ydCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVzZXIgSUQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU/OiBBc3NldFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFBsYWlkIHdpbGwgdHJpZ2dlciBhIGBERUZBVUxUX1VQREFURWAgd2ViaG9vayBmb3IgSXRlbXMgdGhhdCB1bmRlcmdvIGEgY2hhbmdlIGluIEF1dGggZGF0YS4gVGhpcyBpcyBnZW5lcmFsbHkgY2F1c2VkIGJ5IGRhdGEgcGFydG5lcnMgbm90aWZ5aW5nIFBsYWlkIG9mIGEgY2hhbmdlIGluIHRoZWlyIGFjY291bnQgbnVtYmVyaW5nIHN5c3RlbSBvciB0byB0aGVpciByb3V0aW5nIG51bWJlcnMuIFRvIGF2b2lkIHJldHVybmVkIHRyYW5zYWN0aW9ucywgY3VzdG9tZXJzIHRoYXQgcmVjZWl2ZSBhIGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB3aXRoIHRoZSBgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2F1dGhgIG9iamVjdCBwb3B1bGF0ZWQgc2hvdWxkIGltbWVkaWF0ZWx5IGRpc2NvbnRpbnVlIGFsbCB1c2FnZXMgb2YgZXhpc3RpbmcgQXV0aCBkYXRhIGZvciB0aG9zZSBhY2NvdW50cyBhbmQgY2FsbCBgL2F1dGgvZ2V0YCBvciBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgdG8gb2J0YWluIHVwZGF0ZWQgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYFxcJ3MgZm9yIGFjY291bnRzIHRoYXQgY29udGFpbiBuZXcgYXV0aC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF9uZXdfYXV0aDogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBrZXlzIG9mIGBhY2NvdW50X2lkYFxcJ3MgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgYXV0aCBhdHRyaWJ1dGVzIHRoYXQgY2hhbmdlZC4gYEFDQ09VTlRfTlVNQkVSYCBhbmQgYFJPVVRJTkdfTlVNQkVSYCBhcmUgdGhlIHR3byBwb3RlbnRpYWwgdmFsdWVzIHRoYXQgY2FuIGJlIGZsYWdnZWQgYXMgdXBkYXRlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJBQ0NPVU5UX05VTUJFUlxcXCJdIH1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IEFycmF5PEF1dGhVcGRhdGVUeXBlcz47IH19XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9hdXRoOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PEF1dGhVcGRhdGVUeXBlcz47IH07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpZGVudGlmeWluZyBudW1iZXJzIHVzZWQgZm9yIG1ha2luZyBlbGVjdHJvbmljIHRyYW5zZmVycyB0byBhbmQgZnJvbSB0aGUgYGFjY291bnRzYC4gVGhlIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIChBQ0gsIEVGVCwgSUJBTiwgb3IgQmFjcykgdXNlZCB3aWxsIGRlcGVuZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgYWNjb3VudC4gQW4gYWNjb3VudCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIG51bWJlciB0eXBlLiBJZiBhIHBhcnRpY3VsYXIgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgaXMgbm90IHVzZWQgYnkgYW55IGBhY2NvdW50c2AgZm9yIHdoaWNoIGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkLCB0aGUgYXJyYXkgZm9yIHRoYXQgdHlwZSB3aWxsIGJlIGVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBBQ0ggbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FDSD59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYWNoOiBBcnJheTxOdW1iZXJzQUNIPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBFRlQgbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0VGVD59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgZWZ0OiBBcnJheTxOdW1iZXJzRUZUPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBJQkFOIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsOiBBcnJheTxOdW1iZXJzSW50ZXJuYXRpb25hbD47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgQmFjcyBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQkFDUz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjczogQXJyYXk8TnVtYmVyc0JBQ1M+O1xufVxuLyoqXG4gKiBBdXRoR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXV0aEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXV0aC9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRzYCBmb3Igd2hpY2ggbnVtYmVycyBhcmUgYmVpbmcgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBdXRoIGZlYXR1cmVzIG9mIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoU3VwcG9ydGVkTWV0aG9kc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aE1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydGVkX21ldGhvZHM6IEF1dGhTdXBwb3J0ZWRNZXRob2RzIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gd2hpY2ggYXV0aCBtZXRob2RzIGFuIGluc3RpdHV0aW9uIHN1cHBvcnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdXBwb3J0ZWRNZXRob2RzIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBhdXRoIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWF0Y2ggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0cyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGF1dG9tYXRlZF9taWNyb19kZXBvc2l0czogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBtaWNyby1kZXBvc2l0cyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWljcm9fZGVwb3NpdHM6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiBhdXRoIGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXV0aFVwZGF0ZVR5cGVzIHtcbiAgICBBY2NvdW50TnVtYmVyID0gJ0FDQ09VTlRfTlVNQkVSJyxcbiAgICBSb3V0aW5nTnVtYmVyID0gJ1JPVVRJTkdfTlVNQkVSJ1xufVxuXG4vKipcbiAqIEFDSCBudW1iZXJzIGZvciB2ZXJpZmljYXRpb24gdmlhIERhdGFiYXNlIEF1dGhcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aFZlcmlmeU51bWJlcnNBQ0hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoVmVyaWZ5TnVtYmVyc0FDSCB7XG4gICAgLyoqXG4gICAgICogQWNjb3VudFxcJ3MgYWNjb3VudCBudW1iZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5TnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50XFwncyByb3V0aW5nIG51bWJlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhWZXJpZnlOdW1iZXJzQUNIXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xufVxuLyoqXG4gKiBBdXRoVmVyaWZ5UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hdXRoL3ZlcmlmeWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aFZlcmlmeVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoVmVyaWZ5UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFZlcmlmeVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFZlcmlmeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCBvd25lclxcJ3MgbGVnYWwgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhWZXJpZnlSZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhWZXJpZnlSZXF1ZXN0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFZlcmlmeVJlcXVlc3RcbiAgICAgKi9cbiAgICBudW1iZXJzOiBBdXRoVmVyaWZ5UmVxdWVzdE51bWJlcnM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIGFjY291bnQgbnVtYmVycyBmb3IgdmVyaWZpY2F0aW9uIHZpYSBEYXRhYmFzZSBBdXRoXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhWZXJpZnlSZXF1ZXN0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhWZXJpZnlSZXF1ZXN0TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhWZXJpZnlOdW1iZXJzQUNIfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVxdWVzdE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEF1dGhWZXJpZnlOdW1iZXJzQUNIO1xufVxuLyoqXG4gKiBBdXRoVmVyaWZ5UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2F1dGgvdmVyaWZ5YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoVmVyaWZ5UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoVmVyaWZ5UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCB2YWx1ZSBvZiB0aGUgSXRlbSBjcmVhdGVkIGZvciB2ZXJpZmljYXRpb24uIElmIG51bWJlcnMgZGF0YSBwcm92aWRlZCBpcyBpbnZhbGlkLCBhbiBJdGVtIG1heSBub3QgYmUgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIEl0ZW1cXCdzIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBzdGF0dXMuIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNpZ25hbCBmb3IgYmVpbmcgaW52YWxpZCBhbmQvb3IgaGF2ZSBubyBzaWduYWwgZm9yIGJlaW5nIHZhbGlkLiBUeXBpY2FsbHkgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcm91dGluZyBudW1iZXIgaXMgaW52YWxpZCwgdGhlIGFjY291bnQgbnVtYmVyIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NvdW50IG51bWJlciBmb3JtYXQgYXNzb2NpYXRlZCB3aXRoIHRoZSByb3V0aW5nIG51bWJlciwgb3IgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVwb3J0ZWQgYXMgY2xvc2VkIG9yIGZyb3plbi4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3NgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlczogdGhlIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG1hdGNoIGEgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgb2YgYW4gYWNjb3VudCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBhbmQgdGhlIGFjY291bnQgaXMgbm90IGtub3duIGJ5IFBsYWlkIHRvIGJlIGZyb3plbiBvciBjbG9zZWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbmA6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNvbWUgc2lnbmFsIGZvciBiZWluZyB2YWxpZDogdGhlIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIHdlcmUgbm90IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGJ1dCB0aGUgcm91dGluZyBudW1iZXIgaXMgdmFsaWQgYW5kIHRoZSBhY2NvdW50IG51bWJlciBpcyBhIHBvdGVudGlhbCB2YWxpZCBhY2NvdW50IG51bWJlciBmb3IgdGhhdCByb3V0aW5nIG51bWJlci4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFZlcmlmeVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX2luc2lnaHRzOiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG59XG4vKipcbiAqIEFkYXB0aXZlIGd1YXJhbnRlZSBkZXRhaWxzIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24sIGluY2x1ZGluZyB0aGUgZ3VhcmFudGVlIG91dGNvbWUgYW5kIHNldHRsZW1lbnQgc2NoZWR1bGUuIE9taXR0ZWQgd2hlbiBubyBndWFyYW50ZWUgd2FzIGF0dGVtcHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkd1YXJhbnRlZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemF0aW9uR3VhcmFudGVlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyR3VhcmFudGVlT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aG9yaXphdGlvbkd1YXJhbnRlZURldGFpbHNcbiAgICAgKi9cbiAgICBvdXRjb21lOiBUcmFuc2Zlckd1YXJhbnRlZU91dGNvbWU7XG4gICAgLyoqXG4gICAgICogVGhlIGFkYXB0aXZlIGd1YXJhbnRlZSBzZXR0bGVtZW50IHNjaGVkdWxlIGZvciB0aGlzIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEF1dGhvcml6YXRpb25HdWFyYW50ZWVTY2hlZHVsZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRob3JpemF0aW9uR3VhcmFudGVlRGV0YWlsc1xuICAgICAqL1xuICAgIHNjaGVkdWxlOiBBcnJheTxBdXRob3JpemF0aW9uR3VhcmFudGVlU2NoZWR1bGVJdGVtPjtcbn1cbi8qKlxuICogQSBzaW5nbGUgZW50cnkgaW4gYW4gYXV0aG9yaXphdGlvblxcJ3MgYWRhcHRpdmUgZ3VhcmFudGVlIHNldHRsZW1lbnQgc2NoZWR1bGUsIGRlc2NyaWJpbmcgb25lIHRyYW5jaGUgb2YgZ3VhcmFudGVlZCBmdW5kcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkd1YXJhbnRlZVNjaGVkdWxlSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25HdWFyYW50ZWVTY2hlZHVsZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50ZWVkIGFtb3VudCBmb3IgdGhpcyBzY2hlZHVsZSBlbnRyeSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhvcml6YXRpb25HdWFyYW50ZWVTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJ1c2luZXNzIGRheXMgaW4gdGhlIG9ic2VydmF0aW9uIHdpbmRvdyBmb3IgdGhpcyB0cmFuY2hlLiBgMGAgd2hlbiB0aGUgdHJhbmNoZSBpcyBub3Qgc3ViamVjdCB0byBhbiBvYnNlcnZhdGlvbiB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aG9yaXphdGlvbkd1YXJhbnRlZVNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIG9ic2VydmF0aW9uX3dpbmRvd19idXNpbmVzc19kYXlzOiBudW1iZXI7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBpcyB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzLiBXZSByZWNvbW1lbmQgY29tbXVuaWNhdGluZyB0byB5b3VyIHVzZXJzIHdoZW4gdGhpcyBldmVudCBpcyByZWNlaXZlZCB0byBub3RpZnkgdGhlbSB0aGF0IHRoZWlyIGFjY291bnQgaXMgdmVyaWZpZWQgYW5kIHJlYWR5IGZvciB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua0luY29tZUNvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZSwgdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCBpbiBDUkEgZW5hYmxlZCBjbGllbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdDogQmFua0luY29tZUNvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZWZyZXNoIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSByZWZyZXNoZWQgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgcmVmcmVzaGVkIHJlcG9ydCBmYWlsZWQgdG8gYmUgZ2VuZXJhdGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVmcmVzaGVkIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUuIFRoZSBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCBlbmRwb2ludCB0aGF0IHByZXZpb3VzbHkgdHJpZ2dlcmVkIHRoaXMgd2ViaG9vayBpcyBkZXByZWNhdGVkOyB0byByZWZyZXNoIEJhbmsgSW5jb21lIGRhdGEsIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZSwgb3IgbWlncmF0ZSB0byBDUkEgSW5jb21lIEluc2lnaHRzIGFuZCBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGZvciBhIGJhY2tlbmQgcmVmcmVzaC4gVG8gZ2V0IHRoaXMgd2ViaG9vaywgc3Vic2NyaWJlIHZpYSB0aGUgW0Rhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2RldmVsb3BlcnMvd2ViaG9va3MpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgaXMgZGV0ZWN0ZWQuIFRoZSBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCBlbmRwb2ludCB0aGF0IHByZXZpb3VzbHkgc2VydmVkIHRoaXMgcmVmcmVzaCBpcyBkZXByZWNhdGVkOyB0byBnZXQgdXBkYXRlZCBpbmNvbWUgZGF0YSwgc2VuZCB0aGUgdXNlciB0aHJvdWdoIExpbmtcXCdzIHVwZGF0ZSBtb2RlIHNvIHRoZXkgY2FuIGNvbmZpcm0gdGhlaXIgaW5jb21lIHNvdXJjZXMsIG9yIG1pZ3JhdGUgdG8gQ1JBIEluY29tZSBJbnNpZ2h0cyBhbmQgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBmb3IgYSBiYWNrZW5kIHJlZnJlc2guIFRvIHJlY2VpdmUgdGhpcyB3ZWJob29rLCBzdWJzY3JpYmUgaW4gdGhlIFtEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9kZXZlbG9wZXJzL3dlYmhvb2tzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsIFxcXCJSMDlcXFwiLCBcXFwiUjEzXFxcIiwgXFxcIlIxNlxcXCIsIFxcXCJSMTdcXFwiLCBcXFwiUjIwXFxcIiwgXFxcIlIyM1xcXCIuIFRoZXNlIHJldHVybnMgaGF2ZSBhIHR1cm5hcm91bmQgdGltZSBvZiAyIGJhbmtpbmcgZGF5cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBERVBSRUNBVEVELiBVc2UgU2lnbmFsIFJ1bGVzIGluc3RlYWQgdG8gdHJhbnNmb3JtIHRoZSBgc2NvcmVgIGludG8gYSB1c2VmdWwgYWN0aW9uLiAgSW4gdGhlIGBiYW5rX2luaXRpYXRlZF9yZXR1cm5fcmlza2Agb2JqZWN0LCB0aGVyZSBhcmUgZWlnaHQgcmlzayB0aWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29yZXM6ICAgMTogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMCUgLSAwLjUlICAgMjogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuNSUgLSAxLjUlICAgMzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDEuNSUgLSAzJSAgIDQ6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAzJSAtIDUlICAgNTogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDUlIC0gMTAlICAgNjogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDEwJSAtIDE1JSAgIDc6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxNSUgYW5kIDUwJSAgIDg6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgZ3JlYXRlciB0aGFuIDUwJSBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlza1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIEluc2lnaHRzIGludG8gYmFuayBwZW5hbHRpZXMgYW5kIGZlZXMsIGluY2x1ZGluZyBvdmVyZHJhZnQgZmVlcywgTlNGIGZlZXMsIGFuZCBvdGhlciBiYW5rLWltcG9zZWQgY2hhcmdlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rUGVuYWx0aWVzSW5kaWNhdG9ycyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHZhbHVlIG9mIG91dGZsb3cgdHJhbnNhY3Rpb25zIGNhdGVnb3JpemVkIGFzIGBCQU5LX1BFTkFMVElFU2AsIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQgd2l0aGluIHRoZSByZXF1ZXN0ZWQgdGltZSB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rUGVuYWx0aWVzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb250aGx5QXZlcmFnZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBtb250aGx5X2F2ZXJhZ2U/OiBNb250aGx5QXZlcmFnZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlsZWQgY2F0ZWdvcmllcyB2aWV3IG9mIGFsbCB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgQkFOS19QRU5BTFRJRVNgIGNyZWRpdCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeUV4cGVuc2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9kZXRhaWxzPzogQXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBCQU5LX1BFTkFMVElFU2AgY3JlZGl0IGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9udGhseSBzdW1tYXJpZXMgb2YgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEJBTktfUEVOQUxUSUVTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9udGhseVN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rUGVuYWx0aWVzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIG1vbnRobHlfc3VtbWFyaWVzPzogQXJyYXk8TW9udGhseVN1bW1hcnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0aGF0IGZhbGxzIGludG8gdGhlIGBCQU5LX1BFTkFMVElFU2AgY3JlZGl0IGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9sYXN0X29jY3VycmVuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB1c2VyXFwncyBtb250aGx5IGluZmxvd3MgdGhhdCB3YXMgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgQkFOS19QRU5BTFRJRVNgIGNyZWRpdCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMDAgcmVwcmVzZW50cyB0aGF0IDEwMCUgb2YgdGhlIGluZmxvd3Mgd2VyZSBzcGVudCBvbiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBCQU5LX1BFTkFMVElFU2AgY3JlZGl0IGNhdGVnb3J5LiBJZiB0aGVyZVxcJ3Mgbm8gYXZhaWxhYmxlIGluY29tZSBmb3IgdGhlIGdpdmVuIHRpbWUgcGVyaW9kLCB0aGlzIGZpZWxkIHZhbHVlIHdpbGwgYmUgYC0xYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rUGVuYWx0aWVzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHBlcmNlbnRhZ2Vfb2ZfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhbmsgdHJhbnNmZXIgd2l0aGluIHRoZSBCYW5rIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzczogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdGhhdCBzaG91bGQgYmUgY3JlZGl0ZWQvZGViaXRlZCBmb3IgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGJhbmsgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogQmFua1RyYW5zZmVyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB5b3UgY2FuIHN0aWxsIGNhbmNlbCB0aGlzIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNhbmNlbGxhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogQmFua1RyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VzdG9tIHRhZyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGluIHRoZSBjcmVhdGUgcmVxdWVzdC4gV2lsbCBiZSBudWxsIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2Ugb2YgYSBiYW5rIHRyYW5zZmVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIGJhbGFuY2UgLSB0aGUgc3VtIG9mIGFsbCBzdWNjZXNzZnVsIGRlYml0IHRyYW5zZmVyIGFtb3VudHMgbWludXMgYWxsIGNyZWRpdCB0cmFuc2ZlciBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGFibGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IGZvciB3aGljaCBiYWxhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IEJhbmtUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgYmFuayB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYmFuayB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IEJhbmtUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCAtIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYCBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMsIG9yIGBpbmJvdW5kYCBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRGlyZWN0aW9uIHtcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBCYW5rVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYDogZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzIGBpbmJvdW5kYDogZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB7XG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgYWxsIHRyYW5zYWN0aW9ucyB0by9mcm9tIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl90eXBlPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0QmFua1RyYW5zZmVyVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGV2ZW50cyBieSBldmVudCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZXM/OiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudFR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgYmFuayB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBiYW5rIHRyYW5zZmVyIGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IChsYXJnZXN0KSBgZXZlbnRfaWRgIGZldGNoZWQgdmlhIHRoZSBzeW5jIGVuZHBvaW50LCBvciAwIGluaXRpYWxseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgdGhpcyBiYW5rIHRyYW5zZmVyIHJlcHJlc2VudHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZXZlcnNlZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXZlcnNlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIHR5cGUgb2YgdGhpcyB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV2ZXJzZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldmVyc2VkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbQmFuayBUcmFuc2ZlcnMgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy9iYW5rLXRyYW5zZmVycy8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGJhbmsgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcnM6IEFycmF5PEJhbmtUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci4gVGhpcyBpcyB0aGUgQUJBIG51bWJlcjsgZm9yIHNvbWUgaW5zdGl0dXRpb25zLCB0aGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgQUNIIG51bWJlciB1c2VkIGluIGByb3V0aW5nX251bWJlcmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50IChgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuIFZhbGlkIG9wdGlvbnMgYXJlIGBhY2hgLCBgc2FtZS1kYXktYWNoYCwgb3IgYHdpcmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFdpcmUgPSAnd2lyZSdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcCBkZXNjcmliZXMgYSBzd2VlcCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogQmFua1RyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIG11bHRpcGxlIG9yaWdpbmF0aW9uIGFjY291bnRzIGFyZSBhdmFpbGFibGUsIGBvcmlnaW5hdGlvbl9hY2NvdW50X2lkYCBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCB0aGF0IHRoZSBzd2VlcHMgYmVsb25nIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgYGNyZWF0ZWRgIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgYGNyZWF0ZWRgIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZS4gSWYgdGhlIHRyYW5zZmVyIGBhY2hfY2xhc3NgIGlzIGBjY2RgLCB0aGlzIHNob3VsZCBiZSB0aGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXJcXCdzIGVtYWlsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXJcXCdzIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpbiByZXNwb25zZSBkYXRhLiBEbyBub3QgcHJvdmlkZSB0aGlzIGZpZWxkIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgYmFuayB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IEFDSCBldmVudHMgYXJlIGF2YWlsYWJsZS4gVG8gYmVnaW4gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IG11c3QgZmlyc3QgcmVnaXN0ZXIgeW91ciB3ZWJob29rIGxpc3RlbmVyIGVuZHBvaW50IHZpYSB0aGUgW3dlYmhvb2tzIHBhZ2UgaW4gdGhlIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vd2ViaG9va3MpLiBUaGUgYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgY2FuIGJlIHVzZWQgdG8gdHJhY2sgdGhlIHByb2dyZXNzIG9mIEFDSCB0cmFuc2ZlcnMgdXNlZCBpbiBbbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AuIE5vdGUgdGhhdCBbVHJhbnNmZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIGN1c3RvbWVycyBzaG91bGQgdXNlIFRyYW5zZmVyIHdlYmhvb2tzIGluc3RlYWQgb2YgdXNpbmcgYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgOyBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoIHtcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhIEJhc2UgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQmFzZSBSZXBvcnQgd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF0ZV9nZW5lcmF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IFBsYWlkIGFib3V0IGVhY2ggb2YgdGhlIEl0ZW1zIGluY2x1ZGVkIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEJhc2VSZXBvcnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlcztcbn1cbi8qKlxuICogQmFzZSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBwcmV2aW91c2x5IHN1Ym1pdHRlZCB2YWxpZCBkaXNwdXRlIHN0YXRlbWVudHMgYnkgdGhlIGNvbnN1bWVyXG4gICAgICogQHR5cGUge0FycmF5PENvbnN1bWVyRGlzcHV0ZT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZXM6IEFycmF5PENvbnN1bWVyRGlzcHV0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcmVwb3J0IGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbiBoaXN0b3J5IHJldHVybmVkIGJ5IGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSB0b3AtbGV2ZWwgYHRyYW5zYWN0aW9uc2AgZmllbGQgaW5zdGVhZC4gU29tZSB0cmFuc2FjdGlvbnMgbWF5IGhhdmUgdGhlaXIgZGV0YWlscyBtYXNrZWQgaW4gYWNjb3JkYW5jZSB0byB0aGUgRkNSQS4gVGhlc2Ugd2lsbCBhcHBlYXIgd2l0aCBhIGBjcmVkaXRfY2F0ZWdvcnlgIG9mIGBNQVNLRURfVFJBTlNBQ1RJT05fQ0FURUdPUllgLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBUaGlzIGFycmF5IGNhbiBhbHNvIGJlIGVtcHR5IGlmIG5vIG93bmVycyBhcmUgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZTogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LiBDdXJyZW50bHkgbm90IHN1cHBvcnRlZCBieSBgYnJva2VyYWdlYCBvciBgaW52ZXN0bWVudGAgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRBY2NvdW50SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2NvdW50X2luc2lnaHRzPzogQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IEJhc2VSZXBvcnRBdHRyaWJ1dGVzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XFwncyBiYWxhbmNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbC10aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBmb3IgdGhlIGVudGlyZSByZXBvcnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2Ugb2YgZWFjaCBjYWxlbmRhciBtb250aFxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX21vbnRobHlfYmFsYW5jZXM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcz47XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZyb20gdGhlIG1vc3QgcmVjZW50IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbW9zdF9yZWNlbnRfdGhpcnR5X2RheV9hdmVyYWdlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVkIGluc2lnaHRzIGRlcml2ZWQgZnJvbSB0cmFuc2FjdGlvbi1sZXZlbCBkYXRhLiBUaGlzIGZpZWxkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgW0Jhc2UgUmVwb3J0IGF0dHJpYnV0ZXMgYWdncmVnYXRlZCBhY3Jvc3MgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2NoZWNrLyNjcmEtY2hlY2tfcmVwb3J0LWJhc2VfcmVwb3J0LWdldC1yZXNwb25zZS1yZXBvcnQtYXR0cmlidXRlcykgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBhdmFpbGFibGUgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gc2VxdWVudGlhbCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9kYXlzX2JldHdlZW5fdHJhbnNhY3Rpb25zPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIExvbmdlc3QgZ2FwIGJldHdlZW4gc2VxdWVudGlhbCB0cmFuc2FjdGlvbnMgaW4gYSB0aW1lIHBlcmlvZC4gVGhpcyBhcnJheSBjYW4gaW5jbHVkZSBtdWx0aXBsZSB0aW1lIHBlcmlvZHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbG9uZ2VzdF9nYXBzX2JldHdlZW5fdHJhbnNhY3Rpb25zPzogQXJyYXk8QmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkZWJpdHMgaW50byB0aGUgYWNjb3VudC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfaW5mbG93cz86IEFycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIGEgdGltZSBwZXJpb2QuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2luZmxvd19hbW91bnRzPzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb3V0Zmxvd3MgZnJvbSB0aGUgYWNjb3VudC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBudW1iZXJfb2Zfb3V0Zmxvd3M/OiBBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGFtb3VudCBvZiB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50IGluIGEgdGltZSBwZXJpb2QuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdmVyYWdlX291dGZsb3dfYW1vdW50cz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyB3aXRoIG5vIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfZGF5c19ub190cmFuc2FjdGlvbnM/OiBudW1iZXI7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBleHRyYWN0ZWQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gcHJvdmlkZWQgZGF0YSBmb3IgdGhlIGFjY291bnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIG9mIHRoZSByYW5nZSBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHByb3ZpZGVkIGRhdGEgZm9yIHRoZSBhY2NvdW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVkIGF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFByZWRpY3Rpb24gaW5kaWNhdG9yIG9mIHdoZXRoZXIgdGhlIGFjY291bnQgaXMgYSBwcmltYXJ5IGFjY291bnQuIE9ubHkgb25lIGFjY291bnQgcGVyIGFjY291bnQgdHlwZSBhY3Jvc3MgdGhlIGl0ZW1zIGNvbm5lY3RlZCB3aWxsIGhhdmUgYSB2YWx1ZSBvZiB0cnVlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnlfYWNjb3VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIHJhbmdpbmcgZnJvbSAwLTEuIFRoZSBoaWdoZXIgdGhlIHNjb3JlLCB0aGUgbW9yZSBjb25maWRlbnQgd2UgYXJlIG9mIHRoZSBhY2NvdW50IGJlaW5nIHRoZSBwcmltYXJ5IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwcmltYXJ5X2FjY291bnRfc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV0IE5TRiBmZWUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQgd2l0aGluIHRoZSByZXBvcnQgdGltZSByYW5nZSAobm90IGNvdW50aW5nIGFueSBmZWVzIHRoYXQgd2VyZSByZXZlcnNlZCB3aXRoaW4gdGhlIHRpbWUgcmFuZ2UpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXQgTlNGIGZlZSB0cmFuc2FjdGlvbnMgd2l0aGluIHRoZSBsYXN0IDMwIGRheXMgZm9yIGEgZ2l2ZW4gYWNjb3VudCAobm90IGNvdW50aW5nIGFueSBmZWVzIHRoYXQgd2VyZSByZXZlcnNlZCB3aXRoaW4gdGhlIHRpbWUgcmFuZ2UpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV0IE5TRiBmZWUgdHJhbnNhY3Rpb25zIHdpdGhpbiB0aGUgbGFzdCA2MCBkYXlzIGZvciBhIGdpdmVuIGFjY291bnQgKG5vdCBjb3VudGluZyBhbnkgZmVlcyB0aGF0IHdlcmUgcmV2ZXJzZWQgd2l0aGluIHRoZSB0aW1lIHJhbmdlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldCBOU0YgZmVlIHRyYW5zYWN0aW9ucyB3aXRoaW4gdGhlIGxhc3QgOTAgZGF5cyBmb3IgYSBnaXZlbiBhY2NvdW50IChub3QgY291bnRpbmcgYW55IGZlZXMgdGhhdCB3ZXJlIHJldmVyc2VkIHdpdGhpbiB0aGUgdGltZSByYW5nZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsSW5mbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnQ/OiBUb3RhbEluZmxvd0Ftb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsSW5mbG93QW1vdW50MzBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnRfMzBkPzogVG90YWxJbmZsb3dBbW91bnQzMGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbEluZmxvd0Ftb3VudDYwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50XzYwZD86IFRvdGFsSW5mbG93QW1vdW50NjBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnQ5MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudF85MGQ/OiBUb3RhbEluZmxvd0Ftb3VudDkwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsT3V0Zmxvd0Ftb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudD86IFRvdGFsT3V0Zmxvd0Ftb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsT3V0Zmxvd0Ftb3VudDMwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudF8zMGQ/OiBUb3RhbE91dGZsb3dBbW91bnQzMGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbE91dGZsb3dBbW91bnQ2MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnRfNjBkPzogVG90YWxPdXRmbG93QW1vdW50NjBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50OTBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50XzkwZD86IFRvdGFsT3V0Zmxvd0Ftb3VudDkwZCB8IG51bGw7XG59XG4vKipcbiAqIEF2ZXJhZ2UgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgb3IgZGViaXQgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgaW5jbHVkZWQgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudDogQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5O1xufVxuLyoqXG4gKiBBdmVyYWdlIGJhbGFuY2UgaW4gZG9sbGFyIGFtb3VudCBwZXIgbW9udGhcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzXG4gICAgICovXG4gICAgYXZlcmFnZV9iYWxhbmNlOiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBjYWxjdWxhdGVkIGhpc3RvcmljYWwgYmFsYW5jZSwgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi4gIElmIHRoZSBhY2NvdW50IGhhcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMsIGhpc3RvcmljYWwgYmFsYW5jZSBhbW91bnRzIG9uIG9yIGFmdGVyIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRyYW5zYWN0aW9uIG1heSBkaWZmZXIgaWYgcmV0cmlldmVkIGluIHN1YnNlcXVlbnQgQXNzZXQgUmVwb3J0cyBhcyBhIHJlc3VsdCBvZiB0aG9zZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBwb3N0aW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBob2xkaW5nLCBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdG90YWwgdmFsdWUgb2YgdGhlIGhvbGRpbmcuIFRoaXMgZmllbGQgaXMgY2FsY3VsYXRlZCBieSBQbGFpZCBhcyB0aGUgc3VtIG9mIHRoZSBwdXJjaGFzZSBwcmljZSBvZiBhbGwgb2YgdGhlIHNoYXJlcyBpbiB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHkge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNpbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgY3VzaXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBnaXZlbiB0byB0aGUgc2VjdXJpdHkgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWRgIGlzIHByZXNlbnQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBQbGFpZCBgaW5zdGl0dXRpb25faWRgIG9mIHRoZSBpbnN0aXR1dGlvbiB0byB3aG9tIHRoZSBpZGVudGlmaWVyIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eVxcJ3MgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB3aXRoaW4gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBJbnZlc3RtZW50IHRyYW5zYWN0aW9uLCB1bmlxdWUgYWNyb3NzIGFsbCBQbGFpZCB0cmFuc2FjdGlvbnMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhZ2FpbnN0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gcG9zdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBzZWN1cml0eV9pZGAgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBpcyByZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIGZvciBidXkgdHJhbnNhY3Rpb25zOyBuZWdhdGl2ZSBmb3Igc2VsbCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBsZXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBkZWJpdGVkLCBlLmcuIHB1cmNoYXNlcyBvZiBzdG9jazsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBjcmVkaXRlZCwgZS5nLiBzYWxlcyBvZiBzdG9jay4gVHJlYXRtZW50IHJlbWFpbnMgdGhlIHNhbWUgZm9yIGNhc2gtb25seSBtb3ZlbWVudHMgdW5hc3NvY2lhdGVkIHdpdGggc2VjdXJpdGllcy4gRm9yIHRyYW5zYWN0aW9ucyByZXByZXNlbnRpbmcgYSBzaW11bHRhbmVvdXMgY2FzaCBjb250cmlidXRpb24gYW5kIHB1cmNoYXNlIG9mIGEgc2VjdXJpdHksIHRoZSBwb3J0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiByZXByZXNlbnRpbmcgdGhlIHB1cmNoYXNlIHRha2VzIHByZWNlZGVuY2UsIGFuZCB0aGUgYGFtb3VudGAgaXMgcmVwcmVzZW50ZWQgYXMgcG9zaXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBpbnZlc3RtZW50cyBkYXRhIG9uIGFuIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRJbnZlc3RtZW50cyB7XG4gICAgLyoqXG4gICAgICogUXVhbnRpdGllcyBhbmQgdmFsdWVzIG9mIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgaW52ZXN0bWVudCBhY2NvdW50LiBNYXAgdG8gdGhlIGBzZWN1cml0aWVzYCBhcnJheSBmb3Igc2VjdXJpdHkgZGV0YWlscy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEJhc2VSZXBvcnRJbnZlc3RtZW50SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvZiBzcGVjaWZpYyBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGludmVzdG1lbnQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PEJhc2VSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3Rvcnkgb24gdGhlIGludmVzdG1lbnQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBBcnJheTxCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBJdGVtIHdpdGhpbiBhIEJhc2UgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0SXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBkYXRlX2xhc3RfdXBkYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmFzZVJlcG9ydEFjY291bnQ+O1xufVxuLyoqXG4gKiBMYXJnZXN0IG51bWJlciBvZiBkYXlzIGJldHdlZW4gc2VxdWVudGlhbCB0cmFuc2FjdGlvbnMgcGVyIGNhbGVuZGFyIG1vbnRoXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGFyZ2VzdCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGlzIHRpbWUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG51bWJlciBvZiBjcmVkaXRzIG9yIGRlYml0cyBvdXQgb2YgdGhlIGFjY291bnQuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGluY2x1ZGVkIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNyZWRpdHMgb3IgZGViaXRzIG91dCBvZiB0aGUgYWNjb3VudCBmb3IgdGhpcyB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiBvbiB0aGUgQmFzZSBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBOb3RlOiBUaGlzIGlzIGEgbGVnYWN5IGZpZWxkIHRoYXQgaXMgbm90IGFjdGl2ZWx5IG1haW50YWluZWQuIFVzZSBgbWVyY2hhbnRfbmFtZWAgaW5zdGVhZCBmb3IgdGhlIG1lcmNoYW50IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY3JlZGl0X2NhdGVnb3J5PzogQ3JlZGl0Q2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IEJhc2VSZXBvcnRUcmFuc2FjdGlvblR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeTtcbn1cbi8qKlxuICogYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0eXBlcy4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYXNlUmVwb3J0VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVkIGF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEsIGFnZ3JlZ2F0ZWQgYWNyb3NzIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV0IE5TRiBmZWUgdHJhbnNhY3Rpb25zIGluIHRoZSB0aW1lIHJhbmdlIGZvciB0aGUgcmVwb3J0IChub3QgY291bnRpbmcgYW55IGZlZXMgdGhhdCB3ZXJlIHJldmVyc2VkIHdpdGhpbiB0aGF0IHRpbWUgcmFuZ2UpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV0IE5TRiBmZWUgdHJhbnNhY3Rpb25zIGluIHRoZSBsYXN0IDMwIGRheXMgaW4gdGhlIHJlcG9ydCAobm90IGNvdW50aW5nIGFueSBmZWVzIHRoYXQgd2VyZSByZXZlcnNlZCB3aXRoaW4gdGhhdCB0aW1lIHJhbmdlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXQgTlNGIGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgNjAgZGF5cyBpbiB0aGUgcmVwb3J0IChub3QgY291bnRpbmcgYW55IGZlZXMgdGhhdCB3ZXJlIHJldmVyc2VkIHdpdGhpbiB0aGF0IHRpbWUgcmFuZ2UpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldCBOU0YgZmVlIHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCA5MCBkYXlzIGluIHRoZSByZXBvcnQgKG5vdCBjb3VudGluZyBhbnkgZmVlcyB0aGF0IHdlcmUgcmV2ZXJzZWQgd2l0aGluIHRoYXQgdGltZSByYW5nZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfOTBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbFJlcG9ydEluZmxvd0Ftb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudD86IFRvdGFsUmVwb3J0SW5mbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxSZXBvcnRJbmZsb3dBbW91bnQzMGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnRfMzBkPzogVG90YWxSZXBvcnRJbmZsb3dBbW91bnQzMGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDYwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudF82MGQ/OiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDYwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsUmVwb3J0SW5mbG93QW1vdW50OTBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50XzkwZD86IFRvdGFsUmVwb3J0SW5mbG93QW1vdW50OTBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxSZXBvcnRPdXRmbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudD86IFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDMwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnRfMzBkPzogVG90YWxSZXBvcnRPdXRmbG93QW1vdW50MzBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxSZXBvcnRPdXRmbG93QW1vdW50NjBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudF82MGQ/OiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ5MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50XzkwZD86IFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDkwZCB8IG51bGw7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhIEJhc2UgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQmFzZSBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0V2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFTRV9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0V2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBCYXNlUmVwb3J0V2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYElERU5USVRZX1VOQVZBSUxBQkxFYDogQWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBDcmVkaXQgYW5kIERlcG9zaXRvcnkgYWNjb3VudHMgYXJlIHVuYXZhaWxhYmxlLiBgVVNFUl9GUkFVRF9BTEVSVGA6IFRoZSBVc2VyIGhhcyBwbGFjZWQgYSBmcmF1ZCBhbGVydCBvbiB0aGVpciBQbGFpZCBDaGVjayBjb25zdW1lciByZXBvcnQgZHVlIHRvIHN1c3BlY3RlZCBmcmF1ZC4gTm90ZTogd2hlbiBhIGZyYXVkIGFsZXJ0IGlzIGluIHBsYWNlLCB0aGUgcmVjaXBpZW50IG9mIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGFuIG9ibGlnYXRpb24gdG8gdmVyaWZ5IHRoZSBjb25zdW1lclxcJ3MgaWRlbnRpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYXNlUmVwb3J0V2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgVXNlckZyYXVkQWxlcnQgPSAnVVNFUl9GUkFVRF9BTEVSVCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIEJhc2UgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEJBU0VfUkVQT1JUX0VSUk9SYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJBU0VfUkVQT1JUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgYWNjb3VudCByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6IGBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb25gOiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWQgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5cyBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgYHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50YDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBzYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbjogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gb3IgdGhlIGNvbnN1bWVyLCBvciBpcyBhdCByaXNrIG9mIGJlaW5nIGNsb3NlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Nsb3NlZDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgaGFzIHdpdGhkcmF3YWxzIGFuZCB0cmFuc2ZlcnMgZGlzYWJsZWQgb3IgaWYgYWNjZXNzIHRvIHRoZSBhY2NvdW50IGlzIHJlc3RyaWN0ZWQuIFRoaXMgY291bGQgYmUgZHVlIHRvIGEgZnJlZXplIGJ5IHRoZSBjcmVkaXQgaXNzdWVyLCBsZWdhbCByZXN0cmljdGlvbnMgKGUuZy4sIHNhbmN0aW9ucyksIG9yIHJlZ3VsYXRvcnkgcmVxdWlyZW1lbnRzIGxpbWl0aW5nIG1vbnRobHkgd2l0aGRyYXdhbHMsIGFtb25nIG90aGVyIHJlYXNvbnNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9mcm96ZW5fb3JfcmVzdHJpY3RlZDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzNkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzNkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzI4ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGJhbmsgYWNjb3VudCB3YXMgb3BlbmVkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9hY2NvdW50X29wZW5pbmc6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXZhaWxhYmxlIHRvIFBsYWlkIGZvciB0aGlzIGFjY291bnQuIFRoaXMgbWVhc3VyZSwgY29tYmluZWQgd2l0aCBQbGFpZCBjb25uZWN0aW9uIGhpc3RvcnksIGNhbiBiZSB1c2VkIHRvIGluZmVyIHRoZSBhZ2Ugb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X29ic2VydmVkX3RyYW5zYWN0aW9uOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBhY2NvdW50IGluIHRoZSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgIHJlc3BvbnNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU/OiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudFxuICAgICAqL1xuICAgIGF0dHJpYnV0ZXM/OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXM7XG59XG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9iamVjdCBjb250YWlucyBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXNzZXNzIGFjY291bnQgcmlzay4gRXhhbXBsZXMgb2YgZGF0YSBpbmNsdWRlOiBgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uYDogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXMgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgRm9yIHRoZSBmdWxsIGxpc3QgYW5kIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2YgY29yZSBhdHRyaWJ1dGVzIGF2YWlsYWJsZSwgb3IgdG8gcmVxdWVzdCB0aGF0IGNvcmUgYXR0cmlidXRlcyBub3QgYmUgcmV0dXJuZWQsIGNvbnRhY3Qgc2FsZXMgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb24/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB0aGUgY29uc3VtZXIsIG9yIGlzIGF0IHJpc2sgb2YgYmVpbmcgY2xvc2VkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgaGFzIHdpdGhkcmF3YWxzIGFuZCB0cmFuc2ZlcnMgZGlzYWJsZWQgb3IgaWYgYWNjZXNzIHRvIHRoZSBhY2NvdW50IGlzIHJlc3RyaWN0ZWQuIFRoaXMgY291bGQgYmUgZHVlIHRvIGEgZnJlZXplIGJ5IHRoZSBjcmVkaXQgaXNzdWVyLCBsZWdhbCByZXN0cmljdGlvbnMgKGUuZy4sIHNhbmN0aW9ucyksIG9yIHJlZ3VsYXRvcnkgcmVxdWlyZW1lbnRzIGxpbWl0aW5nIG1vbnRobHkgd2l0aGRyYXdhbHMsIGFtb25nIG90aGVyIHJlYXNvbnNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9mcm96ZW5fb3JfcmVzdHJpY3RlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGJhbmsgYWNjb3VudCB3YXMgb3BlbmVkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9hY2NvdW50X29wZW5pbmc/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIGF2YWlsYWJsZSB0byBQbGFpZCBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIG1lYXN1cmUsIGNvbWJpbmVkIHdpdGggUGxhaWQgY29ubmVjdGlvbiBoaXN0b3J5LCBjYW4gYmUgdXNlZCB0byBpbmZlciB0aGUgYWdlIG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9vYnNlcnZlZF90cmFuc2FjdGlvbj86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24geW91IHdhbnQgdG8gZXZhbHVhdGUgcmlzay4gYE9OQk9BUkRJTkdgOiB1c2VyIGxpbmtzIGEgZmlyc3QgYmFuayBhY2NvdW50IGFzIHBhcnQgb2YgdGhlIG9uYm9hcmRpbmcgZmxvdyBvZiB5b3VyIHBsYXRmb3JtLiBgTkVXX0FDQ09VTlRgOiB1c2VyIGxpbmtzIGFub3RoZXIgYmFuayBhY2NvdW50IG9yIHJlcGxhY2VzIHRoZSBjdXJyZW50bHkgbGlua2VkIGJhbmsgYWNjb3VudCBvbiB5b3VyIHBsYXRmb3JtLiBgSU5GT1JNQVRJT05fQ0hBTkdFYDogdXNlciBjaGFuZ2VzIHRoZWlyIGluZm9ybWF0aW9uIG9uIHlvdXIgcGxhdGZvcm0sIGUuZy4sIHVwZGF0aW5nIHRoZWlyIHBob25lIG51bWJlci4gYERPUk1BTlRfVVNFUmA6ICB5b3UgZGVjaWRlIHRvIHJlLWV2YWx1YXRlIGEgdXNlciB0aGF0IGJlY29tZXMgYWN0aXZlIGFmdGVyIGEgcGVyaW9kIG9mIGluYWN0aXZpdHkuIGBPVEhFUmA6IGFueSBvdGhlciByZWFzb25zIG5vdCBsaXN0ZWQgaGVyZSBQb3NzaWJsZSB2YWx1ZXM6ICBgT05CT0FSRElOR2AsIGBORVdfQUNDT1VOVGAsIGBJTkZPUk1BVElPTl9DSEFOR0VgLCBgRE9STUFOVF9VU0VSYCwgYE9USEVSYCBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVFdmFsdWF0aW9uUmVhc29uIHtcbiAgICBPbmJvYXJkaW5nID0gJ09OQk9BUkRJTkcnLFxuICAgIE5ld0FjY291bnQgPSAnTkVXX0FDQ09VTlQnLFxuICAgIEluZm9ybWF0aW9uQ2hhbmdlID0gJ0lORk9STUFUSU9OX0NIQU5HRScsXG4gICAgRG9ybWFudFVzZXIgPSAnRE9STUFOVF9VU0VSJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgaXMgdXNlZCB0byBjb3JyZWxhdGUgcmVxdWVzdHMgYnkgYSB1c2VyIHdpdGggbXVsdGlwbGUgZXZhbHVhdGlvbnMgYW5kL29yIG11bHRpcGxlIGxpbmtlZCBhY2NvdW50cy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHdoYXQgeW91IGFyZSBsb29raW5nIHRvIGV2YWx1YXRlIChhY2NvdW50IGFkZCwgaW5mb3JtYXRpb24gY2hhbmdlLCBldGMuKSB0byBhbGxvdyB1cyB0byB0aWUgdGhlIGFjdGl2aXR5IHRvIHRoZSBkZWNpc2lvbnMgYW5kIHBvc3NpYmxlIGZyYXVkIG91dGNvbWUgc2VudCB2aWEgb3VyIGZlZWRiYWNrIGVuZHBvaW50cy4gWW91IGNhbiB1c2UgeW91ciBpbnRlcm5hbCByZXF1ZXN0IElEIG9yIHNpbWlsYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfZXZhbHVhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUV2YWx1YXRpb25SZWFzb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZhbHVhdGlvbl9yZWFzb24/OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlRXZhbHVhdGlvblJlYXNvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFNpZ25hbERldmljZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgZm9yIGV2YWx1YXRpb24gaGFzIG9jY3VycmVkLiBQb3B1bGF0ZSB0aGlzIGZpZWxkIGZvciBiYWNrZmlsbGluZyBkYXRhLiBJZiB5b3UgZG9uXFwndCBwb3B1bGF0ZSB0aGlzIGZpZWxkLCB3ZVxcJ2xsIHVzZSB0aGUgdGltZXN0YW1wIGF0IHRoZSB0aW1lIG9mIHJlY2VpcHQuIFVzZSBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2YWx1YXRlX3RpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCByZXN1bHRzIHRvIGEgc3Vic2V0IG9mIHRoZSBhY2NvdW50cyBvbiB0aGUgbGlua2VkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCBmb3IgdGhlIHNwZWNpZmljIGFjY291bnRzIHRvIGV2YWx1YXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggYSByaXNrIGV2YWx1YXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudD47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGNoYW5nZSBtYWRlIHRvIHRoZSBwYXJlbnQgb2JqZWN0IHNwZWNpZnlpbmcgd2hhdCBjYXVzZWQgdGhlIGNoYW5nZSBhcyB3ZWxsIGFzIHdoZW4gaXQgb2NjdXJyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkF1ZGl0VHJhaWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BdWRpdFRyYWlsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbFNvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHNvdXJjZTogQmVhY29uQXVkaXRUcmFpbFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHR5cGUgaW5kaWNhdGluZyB3aGF0IGNhdXNlZCBhIHJlc291cmNlIHRvIGJlIGNoYW5nZWQgb3IgdXBkYXRlZC4gICBgZGFzaGJvYXJkYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGJ5IGEgbWVtYmVyIG9mIHlvdXIgdGVhbSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC4gIGBhcGlgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgdmlhIHRoZSBQbGFpZCBBUEkuICBgc3lzdGVtYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBwYXJ0IG9mIHRoZSBQbGFpZCBCZWFjb24gc3lzdGVtLiBGb3IgZXhhbXBsZSwgaWYgYW5vdGhlciBidXNpbmVzcyB1c2luZyBQbGFpZCBCZWFjb24gY3JlYXRlZCBhIGZyYXVkIHJlcG9ydCB0aGF0IG1hdGNoZWQgb25lIG9mIHlvdXIgdXNlcnMsIHlvdXIgbWF0Y2hpbmcgdXNlclxcJ3Mgc3RhdHVzIHdvdWxkIGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCBhbmQgdGhlIGF1ZGl0IHRyYWlsIHNvdXJjZSB3b3VsZCBiZSBgc3lzdGVtYC4gIGBidWxrX2ltcG9ydGAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBhcyBwYXJ0IG9mIGEgYnVsayBpbXBvcnQgcHJvY2Vzcy4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgY29tcGFueSBwcm92aWRlZCBhIENTViBvZiB1c2VyIGRhdGEgYXMgcGFydCBvZiB5b3VyIGluaXRpYWwgb25ib2FyZGluZywgdGhlIGF1ZGl0IHRyYWlsIHNvdXJjZSB3b3VsZCBiZSBgYnVsa19pbXBvcnRgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uQXVkaXRUcmFpbFNvdXJjZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgQXBpID0gJ2FwaScsXG4gICAgU3lzdGVtID0gJ3N5c3RlbScsXG4gICAgQnVsa0ltcG9ydCA9ICdidWxrX2ltcG9ydCdcbn1cblxuLyoqXG4gKiBCYW5rIEFjY291bnQgSW5zaWdodHMgZW5jYXBzdWxhdGUgdGhlIHJpc2sgaW5zaWdodHMgZm9yIGEgc2luZ2xlIEJhbmsgQWNjb3VudCBsaW5rZWQgdG8gYW4gSXRlbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzOiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBCYW5rIEFjY291bnRzIGxpbmtlZCB0byBhbiBJdGVtIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkJhbmtBY2NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkJhbmtBY2NvdW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQgdGhlIEJhbmsgQWNjb3VudHMgYmVsb25nIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkJhbmtBY2NvdW50c1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uQmFua0FjY291bnRJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkJhbmtBY2NvdW50c1xuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIEJlYWNvbiBVc2VyIGNyZWF0ZWQgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uIG1hdGNoZXMgb25lIG9mIHlvdXIgZXhpc3RpbmcgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRFVQTElDQVRFX0RFVEVDVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIER1cGxpY2F0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIER1cGxpY2F0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX2R1cGxpY2F0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIG1hdGNoaW5nIEJlYWNvbiBVc2VycyBhbmQgYW4gYW5hbHlzaXMgb2YgdGhlIGZpZWxkcyB0aGV5IG1hdGNoZWQgb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmV2aXNpb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXIxOiBCZWFjb25Vc2VyUmV2aXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXZpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcjI6IEJlYWNvblVzZXJSZXZpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHlzaXMgb2Ygd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBvbmUgQmVhY29uIFVzZXIgYW5kIGFub3RoZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWU6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIG1hdGNoIHR5cGUgYmV0d2VlbiB0d28gQmVhY29uIFVzZXJzLiAgIGBtYXRjaGAgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgd2FzIGEgc3Ryb25nIG1hdGNoIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyLiAgYHBhcnRpYWxfbWF0Y2hgIGluZGljYXRlcyB0aGUgZGF0YSBhcHByb3hpbWF0ZWx5IG1hdGNoZWQgdGhlIG90aGVyIEJlYWNvbiBVc2VyLiBGb3IgZXhhbXBsZSwgXFxcIktub3BlXFxcIiB2cy4gXFxcIktub3BlLVd5YXR0XFxcIiBmb3IgbGFzdCBuYW1lLiAgYG5vX21hdGNoYCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgYWJsZSB0byBjb21wYXJlIHRoaXMgZmllbGQgYWdhaW5zdCB0aGUgb3RoZXIgQmVhY29uIFVzZXIgYW5kIGl0IGRpZCBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBjb21wYXJlIHRoaXMgZmllbGQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgQmVhY29uIFVzZXIgYmVjYXVzZSB0aGUgZmllbGQgd2FzIG5vdCBwcmVzZW50IGluIG9uZSBvZiB0aGUgQmVhY29uIFVzZXJzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBldmVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydENyZWF0ZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRDcmVhdGVUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudD86IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgZnJhdWQgY29tbWl0dGVkIGJ5IGEgdXNlciBhcyB3ZWxsIGFzIHRoZSBkYXRlIHRoZSBmcmF1ZCB3YXMgY29tbWl0dGVkIGFuZCB0aGUgdG90YWwgYW1vdW50IG9mIG1vbmV5IGxvc3QgZHVlIHRvIHRoZSBmcmF1ZCBpbmNpZGVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBibG9jayBzaW1pbGFyIGZyYXVkIGF0dGVtcHRzIG9uIHlvdXIgcGxhdGZvcm0gYXMgd2VsbCBhcyBhbGVydCBvdGhlciBjb21wYW5pZXMgd2hvIHNjcmVlbiBhIHVzZXIgd2l0aCBtYXRjaGluZyBpZGVudGl0eSBpbmZvcm1hdGlvbi4gT3RoZXIgY29tcGFuaWVzIHdpbGwgbm90IHJlY2VpdmUgYW55IG5ldyBpZGVudGl0eSBpbmZvcm1hdGlvbiwganVzdCB3aGF0IG1hdGNoZWQsIHBsdXMgaW5mb3JtYXRpb24gc3VjaCBhcyBpbmR1c3RyeSwgdHlwZSBvZiBmcmF1ZCwgYW5kIGRhdGUgb2YgZnJhdWQuICBZb3UgY2FuIG1hbmFnZSB5b3VyIGZyYXVkIHJlcG9ydHMgYnkgYWRkaW5nLCBkZWxldGluZywgb3IgZWRpdGluZyByZXBvcnRzIGFzIHlvdSBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBmcmF1ZHVsZW50IHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBldmVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudDogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgQmVhY29uIFJlcG9ydC4gIGBmaXJzdF9wYXJ0eWA6IElmIHRoaXMgaXMgdGhlIHNhbWUgaW5kaXZpZHVhbCBhcyB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzdG9sZW5gOiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50IGluZGl2aWR1YWwgZnJvbSB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzeW50aGV0aWNgOiBJZiB0aGlzIGlzIGFuIGluZGl2aWR1YWwgdXNpbmcgZmFicmljYXRlZCBpbmZvcm1hdGlvbi4gIGBhY2NvdW50X3Rha2VvdmVyYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBhY2NvdW50IHdhcyBjb21wcm9taXNlZC4gIGB1bmtub3duYDogSWYgeW91IGFyZW5cXCd0IHN1cmUgd2hvIGNvbW1pdHRlZCB0aGUgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25SZXBvcnRDcmVhdGVUeXBlIHtcbiAgICBGaXJzdFBhcnR5ID0gJ2ZpcnN0X3BhcnR5JyxcbiAgICBTdG9sZW4gPSAnc3RvbGVuJyxcbiAgICBTeW50aGV0aWMgPSAnc3ludGhldGljJyxcbiAgICBBY2NvdW50VGFrZW92ZXIgPSAnYWNjb3VudF90YWtlb3ZlcicsXG4gICAgRGF0YUJyZWFjaCA9ICdkYXRhX2JyZWFjaCcsXG4gICAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzIGlzIGZpcnN0IHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfQ1JFQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgZnJhdWQgY29tbWl0dGVkIGJ5IGEgdXNlciBhcyB3ZWxsIGFzIHRoZSBkYXRlIHRoZSBmcmF1ZCB3YXMgY29tbWl0dGVkIGFuZCB0aGUgdG90YWwgYW1vdW50IG9mIG1vbmV5IGxvc3QgZHVlIHRvIHRoZSBmcmF1ZCBpbmNpZGVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBibG9jayBzaW1pbGFyIGZyYXVkIGF0dGVtcHRzIG9uIHlvdXIgcGxhdGZvcm0gYXMgd2VsbCBhcyBhbGVydCBvdGhlciBjb21wYW5pZXMgd2hvIHNjcmVlbiBhIHVzZXIgd2l0aCBtYXRjaGluZyBpZGVudGl0eSBpbmZvcm1hdGlvbi4gT3RoZXIgY29tcGFuaWVzIHdpbGwgbm90IHJlY2VpdmUgYW55IG5ldyBpZGVudGl0eSBpbmZvcm1hdGlvbiwganVzdCB3aGF0IG1hdGNoZWQsIHBsdXMgaW5mb3JtYXRpb24gc3VjaCBhcyBpbmR1c3RyeSwgdHlwZSBvZiBmcmF1ZCwgYW5kIGRhdGUgb2YgZnJhdWQuICBZb3UgY2FuIG1hbmFnZSB5b3VyIGZyYXVkIHJlcG9ydHMgYnkgYWRkaW5nLCBkZWxldGluZywgb3IgZWRpdGluZyByZXBvcnRzIGFzIHlvdSBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBmcmF1ZHVsZW50IHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBldmVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudDogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBCZWFjb24gUmVwb3J0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZWFjb24vcmVwb3J0L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblJlcG9ydD59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRzOiBBcnJheTxCZWFjb25SZXBvcnQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gcmVwcmVzZW50cyBhIEJlYWNvbiBSZXBvcnQgY3JlYXRlZCBlaXRoZXIgYnkgeW91ciBvcmdhbml6YXRpb24gb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIgeW91XFwndmUgY3JlYXRlZC4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCB3YXMgc3luZGljYXRlZCB0by4gIFRoZSBgcmVwb3J0YCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgY29udGFpbnMgYSBzdWJzZXQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzOiBBcnJheTxCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlcG9ydCBjcmVhdGVkIG9uIHRoZSBCZWFjb24gTmV0d29yayBtYXRjaGVzIHdpdGggb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFUE9SVF9TWU5ESUNBVElPTl9DUkVBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0U3luZGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25zOiBBcnJheTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIGEgQmVhY29uIFJlcG9ydCB0aGF0IGhhcyBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBtYXRjaGluZyBCZWFjb24gVXNlciBpbiB5b3VyIHByb2dyYW0uICBUaGUgYGlkYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaXMgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQgdGhhdCB3YXMgc3luZGljYXRlZC4gSWYgdGhlIG9yaWdpbmFsIHJlcG9ydCB3YXMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiwgdGhlIGZpZWxkIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIElEIG9mIHRoZSByZXBvcnQuIE90aGVyd2lzZSwgdGhlIGZpZWxkIHdpbGwgYmUgYG51bGxgIGluZGljYXRpbmcgdGhhdCB0aGUgb3JpZ2luYWwgcmVwb3J0IHdhcyBjcmVhdGVkIGJ5IGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGV2ZW50X2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgQmVhY29uIFJlcG9ydC4gIGBmaXJzdF9wYXJ0eWA6IElmIHRoaXMgaXMgdGhlIHNhbWUgaW5kaXZpZHVhbCBhcyB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzdG9sZW5gOiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50IGluZGl2aWR1YWwgZnJvbSB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzeW50aGV0aWNgOiBJZiB0aGlzIGlzIGFuIGluZGl2aWR1YWwgdXNpbmcgZmFicmljYXRlZCBpbmZvcm1hdGlvbi4gIGBhY2NvdW50X3Rha2VvdmVyYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBhY2NvdW50IHdhcyBjb21wcm9taXNlZC4gIGBkYXRhX2JyZWFjaGA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgZGF0YSB3YXMgY29tcHJvbWlzZWQgaW4gYSBicmVhY2guICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0VHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIERhdGFCcmVhY2ggPSAnZGF0YV9icmVhY2gnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIGV4aXN0aW5nIEJlYWNvbiBSZXBvcnRzIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoZXRoZXIgdGhpcyBhY2NvdW50IG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IG51bWVyaWMgY2hhcmFjdGVycyBvZiB0aGlzIGFjY291bnRcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhY2NvdW50X21hc2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBtYXRjaF9zdGF0dXM6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCBJdGVtIElEcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIHRoZSByaXNrIGluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXFwncyBCYW5rIEFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZWFjb24vdXNlci9hY2NvdW50X2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25CYW5rQWNjb3VudHN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfYWNjb3VudF9pbnNpZ2h0czogQmVhY29uQmFua0FjY291bnRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEV2ZW4gaWYgYW4gYWRkcmVzcyBoYXMgYmVlbiBjb2xsZWN0ZWQsIHNvbWUgZmllbGRzIG1heSBiZSBudWxsIGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uXFwncyBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBhIHBvc3RhbCBjb2RlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuIElmIHByb3ZpZGVkLCBhIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDUwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlLiBcXFwiU3ViZGl2aXNpb25cXFwiIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgZXRjLiBGb3IgdGhlIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBVc2VyLiAgVGhlIHByaW1hcnkgdXNlIGZvciB0aGlzIGVuZHBvaW50IGlzIHRvIGFkZCBhIG5ldyBlbmQgdXNlciB0byBCZWFjb24gZm9yIGZyYXVkIGFuZCBkdXBsaWNhdGUgc2Nhbm5pbmcuICBTb21lIGZpZWxkcyBhcmUgb3B0aW9uYWwsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgcG9zc2libGUgdG8gaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIGZyYXVkIGFuZCBkdXBsaWNhdGUgc2Nhbm5pbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJSZXF1ZXN0RGF0YTtcbiAgICAvKipcbiAgICAgKiBTZW5kIHRoaXMgYXJyYXkgb2YgYWNjZXNzIHRva2VucyB0byBsaW5rIGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlciBhbmQgaGF2ZSB0aGVtIGV2YWx1YXRlZCBmb3IgQWNjb3VudCBJbnNpZ2h0cy4gQSBtYXhpbXVtIG9mIDUwIGFjY291bnRzIHRvdGFsIGNhbiBiZSBhZGRlZCB0byBhIHNpbmdsZSBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgSXRlbSBJRHMgY29ycmVzcG9uZGluZyB0byB0aGUgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgZWFjaCB0aW1lIHRoZSB1c2VyIGlzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSBhbmQgcmVzdWx0aW5nIGFuYWx5c2lzIHdoZW4gY2hlY2tlZCBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25Vc2VyRGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnlfYWNjb3VudHM6IEFycmF5PEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIHRoaXMgYWNjb3VudFxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9tYXNrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgdGhlIGhpc3Rvcnkgb2YgYSBCZWFjb24gVXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZWFjb24vdXNlci9oaXN0b3J5L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25Vc2VyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcnM6IEFycmF5PEJlYWNvblVzZXI+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIElEIG51bWJlciBhc3NvY2lhdGVkIHdpdGggYSBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlcklETnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlcklETnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiB0aGUgaWRlbnRpdHkgZG9jdW1lbnQgdHlwZWQgaW4gYnkgdGhlIHVzZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC4gRm9yIHNwZWNpZmljIGZvcm1hdCByZXF1aXJlbWVudHMgYnkgSUQgdHlwZSwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaWQtbnVtYmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SUROdW1iZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBJRE51bWJlclR5cGU7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyTmFtZU51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZU51bGxhYmxlXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN1YmRpdmlzaW9uIGNvZGUuIFxcXCJTdWJkaXZpc2lvblxcXCIgaXMgYSBnZW5lcmljIHRlcm0gZm9yIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBldGMuIEZvciB0aGUgbGlzdCBvZiB2YWxpZCBjb2Rlcywgc2VlIFtjb3VudHJ5IHN1YmRpdmlzaW9uIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY291bnRyeV9zdWJkaXZpc2lvbl9jb2Rlcy5qc29uKS4gQ291bnRyeSBwcmVmaXhlcyBhcmUgb21pdHRlZCwgc2luY2UgdGhleSBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYGNvdW50cnlgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlLiBcXFwiU3ViZGl2aXNpb25cXFwiIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgZXRjLiBGb3IgdGhlIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXJcXCdzIGRhdGEgd2hpY2ggaXMgdXNlZCB0byBjaGVjayBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuICBJbiBvcmRlciB0byBjcmVhdGUgYSBCZWFjb24gVXNlciwgaW4gYWRkaXRpb24gdG8gdGhlIGBuYW1lYCwgX2VpdGhlcl8gdGhlIGBkYXRlX29mX2JpcnRoYCBfb3JfIHRoZSBgZGVwb3NpdG9yeV9hY2NvdW50c2AgZmllbGQgbXVzdCBiZSBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIG5hbWU6IEJlYWNvblVzZXJOYW1lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogQmVhY29uVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJUHY0IG9yIElQdjYgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcm92aWRlIGEgbGlzdCBvZiBiYW5rIGFjY291bnRzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLiBUaGVzZSBhY2NvdW50cyB3aWxsIGJlIHNjYW5uZWQgYWNyb3NzIHRoZSBCZWFjb24gTmV0d29yayBhbmQgdXNlZCB0byBmaW5kIGR1cGxpY2F0ZSByZWNvcmRzLiAgTm90ZTogVGhlc2UgYWNjb3VudHMgd2lsbCBub3QgaGF2ZSBCYW5rIEFjY291bnQgSW5zaWdodHMuIFRvIHJlY2VpdmUgQmFuayBBY2NvdW50IEluc2lnaHRzIHBsZWFzZSBzdXBwbHkgYGFjY2Vzc190b2tlbnNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25Vc2VyUmVxdWVzdERlcG9zaXRvcnlBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGVwb3NpdG9yeV9hY2NvdW50cz86IEFycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+O1xufVxuLyoqXG4gKiBEZXBvc2l0b3J5IGFjY291bnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERlcG9zaXRvcnlBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgVVMgQmFuayBBY2NvdW50IE51bWJlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByb3V0aW5nIG51bWJlciBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERlcG9zaXRvcnlBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgdXBkYXRpbmcgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgUmV2aXNpb24gaWRlbnRpZmllcyBhIEJlYWNvbiBVc2VyIGF0IHNvbWUgcG9pbnQgaW4gaXRzIHJldmlzaW9uIGhpc3RvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJSZXZpc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXZpc2lvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlzaW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgcmV2aXNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlzaW9uXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgYHJlamVjdGVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIHJlamVjdGVkIGZvciBmcmF1ZC4gVXNlcnMgY2FuIGJlIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkgcmVqZWN0ZWQuICBgcGVuZGluZ19yZXZpZXdgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gbWFya2VkIGZvciByZXZpZXcuICBgY2xlYXJlZGA6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBjbGVhcmVkIG9mIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uVXNlclN0YXR1cyB7XG4gICAgUmVqZWN0ZWQgPSAncmVqZWN0ZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIENsZWFyZWQgPSAnY2xlYXJlZCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQmVhY29uIFVzZXIgc3RhdHVzIGhhcyBjaGFuZ2VkLCB3aGljaCBjYW4gb2NjdXIgbWFudWFsbHkgdmlhIHRoZSBkYXNoYm9hcmQgb3Igd2hlbiBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZCB0byB0aGUgQmVhY29uIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9TVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZW5kIHRoaXMgYXJyYXkgb2YgYWNjZXNzIHRva2VucyB0byBhZGQgYWNjb3VudHMgdG8gdGhpcyB1c2VyIGZvciBldmFsdWF0aW9uLiBUaGlzIHdpbGwgYWRkIGFjY291bnRzIHRvIHRoaXMgQmVhY29uIFVzZXIuIElmIGxlZnQgbnVsbCBvbmx5IGV4aXN0aW5nIGFjY291bnRzIHdpbGwgYmUgcmV0dXJuZWQgaW4gcmVzcG9uc2UuIEEgbWF4aW11bSBvZiA1MCBhY2NvdW50cyB0b3RhbCBjYW4gYmUgYWRkZWQgdG8gYSBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3Vic2V0IG9mIGEgQmVhY29uIFVzZXJcXCdzIGRhdGEgd2hpY2ggaXMgdXNlZCB0byBwYXRjaCB0aGUgZXhpc3RpbmcgaWRlbnRpdHkgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBCZWFjb24gVXNlci4gQXQgbGVhc3Qgb25lIGZpZWxkIG11c3QgYmUgcHJvdmlkZWQuIElmIGxlZnQgdW5zZXQgb3IgbnVsbCwgdXNlciBkYXRhIHdpbGwgbm90IGJlIHBhdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YSB7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJOYW1lTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBCZWFjb25Vc2VyTmFtZU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVB2NiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25Vc2VyUmVxdWVzdERlcG9zaXRvcnlBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGVwb3NpdG9yeV9hY2NvdW50cz86IEFycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+O1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS9ld2FfcmVwb3J0L3YxL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS9ld2FfcmVwb3J0L3YxL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YUV3YVJlcG9ydFYxR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFFd2FSZXBvcnRWMUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGdlbmVyYXRlZCBFV0Egc2NvcmUgZ3JvdXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YUV3YVJlcG9ydFYxR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBld2FfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gYGV3YV9zY29yZXNgIHdhcyBnZW5lcmF0ZWQsIGluIElTTyA4NjAxIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGdlbmVyYXRpb25fdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZWFybmVkIHdhZ2UgYWNjZXNzIChFV0EpIHNjb3JpbmcgZW50cmllcyB0aGF0IG1hcCBwb3RlbnRpYWwgYWR2YW5jZSBhbW91bnRzIHRvIHJlcGF5bWVudCBsaWtlbGlob29kIHNjb3Jlcy4gVGhlIHByZWRlZmluZWQgYWR2YW5jZSBhbW91bnQgcmFuZ2VzIGFyZSBgWzAsIDI1XWAsIGBbMjUsIDUwXWAsIGBbNTAsIDEwMF1gLCBgWzEwMCwgMjAwXWAsIGBbMjAwLCAzMDBdYCwgYFszMDAsIDQwMF1gLCBhbmQgYFs0MDAsIDUwMF1gLlxuICAgICAqIEB0eXBlIHtBcnJheTxFd2FTY29yZT59XG4gICAgICogQG1lbWJlcm9mIEJldGFFd2FSZXBvcnRWMUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXdhX3Njb3Jlcz86IEFycmF5PEV3YVNjb3JlPjtcbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiBhdHRyaWJ1dGVzIHByb3ZpZGluZyBjb250ZXh0IGFib3V0IHRoZSBmYWN0b3JzIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhlIEVXQSBzY29yZXMuIEVhY2gga2V5IGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdGhlIHZhbHVlIGlzIGl0cyBudW1lcmljIHNjb3JlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgY291bGQgbm90IGJlIGNvbXB1dGVkLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG51bWJlcjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YUV3YVJlcG9ydFYxR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBld2FfYXR0cmlidXRlcz86IHsgW2tleTogc3RyaW5nXTogbnVtYmVyOyB9IHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyIGJlaW5nIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGVuZCBjdXN0b21lciBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciBvciBub3QgdGhlIHBhcnRuZXIgaGFzIGNvbXBsZXRlZCBhdHRlc3RhdGlvbiBvZiBkaWxpZ2VuY2UgZm9yIHRoZSBlbmQgY3VzdG9tZXIgdG8gYmUgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2RpbGlnZW5jZV9hdHRlc3RlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIElmIHlvdSByZXF1aXJlIHRoZSBhYmlsaXR5IHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGVuZCBjdXN0b21lcnMgdXNpbmcgbXVsdGlwbGUgZGlmZmVyZW50IExpbmsgY3VzdG9taXphdGlvbiBwcm9maWxlcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBmb3IgYXNzaXN0YW5jZS4gIEltcG9ydGFudDogRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nIChEVE0pIHVzZSBjYXNlcyB3aWxsIG5vdCBiZSBjb3BpZWQgdG8gdGhlIGVuZCBjdXN0b21lclxcJ3MgTGluayBjdXN0b21pemF0aW9uIHVubGVzcyB0aGUgKipQdWJsaXNoIGNoYW5nZXMqKiBidXR0b24gaXMgY2xpY2tlZCBhZnRlciB0aGUgdXNlIGNhc2VzIGFyZSBhcHBsaWVkLiBMaW5rIHdpbGwgbm90IHdvcmsgaW4gUHJvZHVjdGlvbiB1bmxlc3MgdGhlIGVuZCBjdXN0b21lclxcJ3MgRFRNIHVzZSBjYXNlcyBhcmUgY29uZmlndXJlZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHdlYnNpdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbi4gVGhpcyB3aWxsIGJlIHNob3duIHRvIGVuZCB1c2VycyB3aGVuIHRoZXkgZ28gdGhyb3VnaCB0aGUgUGxhaWQgTGluayBmbG93LiBUaGUgYXBwbGljYXRpb24gbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbmQgY2Fubm90IG1hdGNoIHRoZSBuYW1lIG9mIGFub3RoZXIgYXBwbGljYXRpb24gYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggUGxhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlY2huaWNhbF9jb250YWN0PzogUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3R9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiaWxsaW5nX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbWVyX3N1cHBvcnRfaW5mbzogUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mbztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFVSSXMgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24ocykgd2hlcmUgYSB1c2VyIGNhbiBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciBhbm90aGVyIGFwcC4gVVJJcyBzaG91bGQgbm90IGNvbnRhaW4gYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFdoZW4gdXNlZCBpbiBQcm9kdWN0aW9uLCBVUklzIG11c3QgdXNlIGh0dHBzLiBUbyBtb2RpZnkgcmVkaXJlY3QgVVJJcyBmb3IgYW4gZW5kIGN1c3RvbWVyIGFmdGVyIGNyZWF0aW5nIHRoZW0sIGdvIHRvIHRoZSBlbmQgY3VzdG9tZXJcXCdzIFtBUEkgcGFnZV0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKSBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckJhbmtBZGRlbmR1bUFjY2VwdGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX2FkZGVuZHVtX2FjY2VwdGFuY2U/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJCYW5rQWRkZW5kdW1BY2NlcHRhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlc31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHF1ZXN0aW9ubmFpcmVzPzogUGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZXM7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBCZXRhUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2VuYWJsZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvZW5hYmxlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIE1hcHBpbmcgb2YgcHJvZHVjdCBuYW1lcyB0byB0aGVpciBjdXJyZW50IHN0YXR1cy5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdF9zdGF0dXNlcz86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmV0YVBhcnRuZXJFbmRDdXN0b21lcn1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBCZXRhUGFydG5lckVuZEN1c3RvbWVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckJhbmtBZGRlbmR1bUFjY2VwdGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX2FkZGVuZHVtX2FjY2VwdGFuY2U/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJCYW5rQWRkZW5kdW1BY2NlcHRhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlc31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHF1ZXN0aW9ubmFpcmVzPzogUGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZXM7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JldGFQYXJ0bmVyRW5kQ3VzdG9tZXJ9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogQmV0YVBhcnRuZXJFbmRDdXN0b21lcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBmb3IgYW4gZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhUGFydG5lckVuZEN1c3RvbWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmV0YVBhcnRuZXJFbmRDdXN0b21lciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBNYXBwaW5nIG9mIHByb2R1Y3QgbmFtZXMgdG8gdGhlaXIgY3VycmVudCBzdGF0dXMuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgcHJvZHVjdF9zdGF0dXNlcz86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWVsZHMgdGhhdCBhcmUgc3RpbGwgcmVxdWlyZWQgdG8gYmUgc3VibWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJSZXF1aXJlbWVudER1ZT59XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICByZXF1aXJlbWVudHNfZHVlPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyUmVxdWlyZW1lbnREdWU+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZW5kIGN1c3RvbWVyLCBpbmNsdWRpbmcgc2VjcmV0cyBmb3Igbm9uLVByb2R1Y3Rpb24gZW52aXJvbm1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogTWFwcGluZyBvZiBwcm9kdWN0IG5hbWVzIHRvIHRoZWlyIGN1cnJlbnQgc3RhdHVzLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgcHJvZHVjdF9zdGF0dXNlcz86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWVsZHMgdGhhdCBhcmUgc3RpbGwgcmVxdWlyZWQgdG8gYmUgc3VibWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJSZXF1aXJlbWVudER1ZT59XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHJlcXVpcmVtZW50c19kdWU/OiBBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJSZXF1aXJlbWVudER1ZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHNlY3JldHM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzO1xufVxuLyoqXG4gKiBCdXNpbmVzcyBpZGVudGl0eSBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIFdoZW4gdXNpbmcgYSBDUkEgZW5kcG9pbnQgKGFuIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIGkuZS4gYW55IGVuZHBvaW50IGJlZ2lubmluZyB3aXRoIGAvY3JhL2ApLCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIHdpbGwgbm90IG1hdGNoIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgYnkgYSBub24tQ1JBIGVuZHBvaW50LiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHVzaW5nIEF1dGggYW5kIGZhbGxpbmcgYmFjayB0byBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQuICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB1bnNlbnRgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCBidXQgUGxhaWQgaGFzIG5vdCB5ZXQgc2VudCB0aGUgbWljcm8tZGVwb3NpdC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc2lnbmFsIGZvciBiZWluZyBpbnZhbGlkIGFuZC9vciBoYXZlIG5vIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIFR5cGljYWxseSB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSByb3V0aW5nIG51bWJlciBpcyBpbnZhbGlkLCB0aGUgYWNjb3VudCBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIGZvcm1hdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRpbmcgbnVtYmVyLCBvciB0aGUgYWNjb3VudCBoYXMgYmVlbiByZXBvcnRlZCBhcyBjbG9zZWQgb3IgZnJvemVuLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc2A6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgbWF0Y2ggYSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBvZiBhbiBhY2NvdW50IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGFuZCB0aGUgYWNjb3VudCBpcyBub3Qga25vd24gYnkgUGxhaWQgdG8gYmUgZnJvemVuIG9yIGNsb3NlZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc29tZSBzaWduYWwgZm9yIGJlaW5nIHZhbGlkOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgd2VyZSBub3QgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYnV0IHRoZSByb3V0aW5nIG51bWJlciBpcyB2YWxpZCBhbmQgdGhlIGFjY291bnQgbnVtYmVyIGlzIGEgcG90ZW50aWFsIHZhbGlkIGFjY291bnQgbnVtYmVyIGZvciB0aGF0IHJvdXRpbmcgbnVtYmVyLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfbWF0Y2hlZGA6IChkZXByZWNhdGVkKSBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBudWxsYCBvciBlbXB0eSBzdHJpbmc6IE5laXRoZXIgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gbm9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEJ1c2luZXNzQWNjb3VudFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX2luc2lnaHRzPzogQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgZm9yIEl0ZW1zIGF0IGluc3RpdHV0aW9ucyB0aGF0IHVzZSBUb2tlbml6ZWQgQWNjb3VudCBOdW1iZXJzIChpLmUuLCBDaGFzZSwgUE5DLCBhbmQgVVMgQmFuaykuIEJlY2F1c2UgdGhlc2UgYWNjb3VudHMgaGF2ZSBhIGRpZmZlcmVudCBhY2NvdW50IG51bWJlciBlYWNoIHRpbWUgdGhleSBhcmUgbGlua2VkLCB0aGlzIGZpZWxkIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFjY291bnQgbnVtYmVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGFjY291bnQgYWNyb3NzIG11bHRpcGxlIEl0ZW1zIGZvciBwYXltZW50cyB1c2UgY2FzZXMsIGhlbHBpbmcgdG8gcmVkdWNlIGR1cGxpY2F0ZSBJdGVtcyBvciBhdHRlbXB0ZWQgZnJhdWQuIEluIFNhbmRib3gsIHRoaXMgZmllbGQgaXMgcG9wdWxhdGVkIGZvciBUQU4tYmFzZWQgaW5zdGl0dXRpb25zIChgaW5zXzU2YCwgYGluc18xM2AsIGBpbnNfMTI3OTkwYCkgYXMgd2VsbCBhcyB0aGUgT0F1dGggU2FuZGJveCBpbnN0aXR1dGlvbiAoYGluc18xMjcyODdgKTsgaW4gUHJvZHVjdGlvbiwgaXQgd2lsbCBvbmx5IGJlIHBvcHVsYXRlZCBmb3IgYWNjb3VudHMgYXQgYXBwbGljYWJsZSBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudFxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBvd25lciBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzPzogQXJyYXk8T3duZXI+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEJ1c2luZXNzQWNjb3VudFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NBY2NvdW50QWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0FjY291bnRBbGxPZiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudEFsbE9mXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRBbGxPZlxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgb3duZXIgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudEFsbE9mXG4gICAgICovXG4gICAgb3duZXJzPzogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBUcmktc3RhdGUgYm9vbGVhbiBzdGF0dXMsIHdoZXJlIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlIGNoZWNrIGNvdWxkIG5vdCBkZXRlcm1pbmUgYSB2YWx1ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJ1c2luZXNzQ2hlY2tCb29sZWFuU3RhdHVzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogUmVzdWx0cyBmcm9tIHRoZSBkaWdpdGFsIHByZXNlbmNlIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVjayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzV2ViUHJlc2VuY2VDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVja1xuICAgICAqL1xuICAgIHN0YXR1czogQnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNXZWJQcmVzZW5jZUNoZWNrO1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAwIHRvIDEwMCBpbmRpY2F0aW5nIGRpZ2l0YWwgcHJlc2VuY2UgY29uZmlkZW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVja1xuICAgICAqL1xuICAgIGFkZHJlc3M6IEJ1c2luZXNzRmllbGRNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmllbGRNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2tcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEJ1c2luZXNzRmllbGRNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmllbGRNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2tcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrXG4gICAgICovXG4gICAgd2Vic2l0ZTogQnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NXZWJzaXRlQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2tcbiAgICAgKi9cbiAgICB3ZWJzaXRlX2FuYWx5c2lzOiBCdXNpbmVzc1dlYnNpdGVBbmFseXNpcyB8IG51bGw7XG59XG4vKipcbiAqIEVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGEgYnVzaW5lc3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NFbWFpbEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0VtYWlsQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogRW1haWwgYWRkcmVzcyBvZiB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0VtYWlsQWRkcmVzc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBsZWdhbCBzdHJ1Y3R1cmUgb3IgdHlwZSBvZiBidXNpbmVzcyBlbnRpdHlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJ1c2luZXNzRW50aXR5VHlwZSB7XG4gICAgU29sZVByb3ByaWV0b3JzaGlwID0gJ3NvbGVfcHJvcHJpZXRvcnNoaXAnLFxuICAgIEdlbmVyYWxQYXJ0bmVyc2hpcCA9ICdnZW5lcmFsX3BhcnRuZXJzaGlwJyxcbiAgICBMbGMgPSAnbGxjJyxcbiAgICBMbHAgPSAnbGxwJyxcbiAgICBMbGxwID0gJ2xsbHAnLFxuICAgIExwID0gJ2xwJyxcbiAgICBDQ29ycG9yYXRpb24gPSAnY19jb3Jwb3JhdGlvbicsXG4gICAgU0NvcnBvcmF0aW9uID0gJ3NfY29ycG9yYXRpb24nLFxuICAgIEJDb3Jwb3JhdGlvbiA9ICdiX2NvcnBvcmF0aW9uJyxcbiAgICBOb25wcm9maXQgPSAnbm9ucHJvZml0JyxcbiAgICBDb29wZXJhdGl2ZSA9ICdjb29wZXJhdGl2ZScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFByb2Zlc3Npb25hbEFzc29jaWF0aW9uID0gJ3Byb2Zlc3Npb25hbF9hc3NvY2lhdGlvbicsXG4gICAgUHJvZmVzc2lvbmFsQ29ycG9yYXRpb24gPSAncHJvZmVzc2lvbmFsX2NvcnBvcmF0aW9uJyxcbiAgICBUcmFkZU5hbWUgPSAndHJhZGVfbmFtZScsXG4gICAgQmFuayA9ICdiYW5rJyxcbiAgICBDcmVkaXRVbmlvbiA9ICdjcmVkaXRfdW5pb24nLFxuICAgIEluc3VyYW5jZSA9ICdpbnN1cmFuY2UnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nXG59XG5cbi8qKlxuICogU3VtbWFyeSBvZiBob3cgYSBzcGVjaWZpYyBidXNpbmVzcyBmaWVsZCBtYXRjaGVkIGFnYWluc3QgZGF0YSBwcm92aWRlciByZXN1bHRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzRmllbGRNYXRjaFN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIE1vc3QgcmVsZXZhbnQgZm9yIGJ1c2luZXNzIGZpbmFuY2UgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzRmluYW5jZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NGaW5hbmNlQ2F0ZWdvcnkge1xuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgcHJpbWFyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZ3JhbnVsYXIgY2F0ZWdvcnkgY29udmV5aW5nIHRoZSB0cmFuc2FjdGlvblxcJ3MgaW50ZW50LiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgZGV0YWlsZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNhdGVnb3JpZXMgYWNjdXJhdGVseSBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24gaW50ZW50LiAgYFZFUllfSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTglIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBISUdIYDogV2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBMT1dgOiBUaGlzIGNhdGVnb3J5IG1heSByZWZsZWN0IHRoZSBpbnRlbnQsIGJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgY2F0ZWdvcmllcyB0aGF0IGFyZSBtb3JlIGFjY3VyYXRlLiBgVU5LTk9XTmA6IFdlIGRvblxcJ3Qga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0ZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcHJlZGljdGVkIGluZHVzdHJ5IGNsYXNzaWZpY2F0aW9uIGZvciB0aGUgYnVzaW5lc3MsIGJhc2VkIG9uIGRpZ2l0YWwgcHJlc2VuY2UgYXNzZXNzbWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzSW5kdXN0cnlQcmVkaWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIE5BSUNTIGNvZGUgZm9yIHRoZSBwcmVkaWN0ZWQgYnVzaW5lc3MgaW5kdXN0cnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb25cbiAgICAgKi9cbiAgICBjb2RlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJ1c2luZXNzIGluZHVzdHJ5IGNsYXNzaWZpY2F0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgTkFJQ1MgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0luZHVzdHJ5UHJlZGljdGlvblxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG59XG4vKipcbiAqIE51bGxhYmxlIGluZHVzdHJ5IHByZWRpY3Rpb24gZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb25OdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzSW5kdXN0cnlQcmVkaWN0aW9uTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIE5BSUNTIGNvZGUgZm9yIHRoZSBwcmVkaWN0ZWQgYnVzaW5lc3MgaW5kdXN0cnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb25OdWxsYWJsZVxuICAgICAqL1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYnVzaW5lc3MgaW5kdXN0cnkgY2xhc3NpZmljYXRpb24gb2YgdGhlIHByZWRpY3RlZCBOQUlDUyBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzSW5kdXN0cnlQcmVkaWN0aW9uTnVsbGFibGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHRzIGZyb20gdGhlIEtZQiAoS25vdyBZb3VyIEJ1c2luZXNzKSBpZGVudGl0eSB2ZXJpZmljYXRpb24gY2hlY2tcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NLWUJDaGVja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzS1lCQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c0tZQkNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQkNoZWNrXG4gICAgICovXG4gICAgc3RhdHVzOiBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c0tZQkNoZWNrO1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAwIHRvIDEwMCBpbmRpY2F0aW5nIHRoZSBjb25maWRlbmNlIGluIEtZQiAoS25vdyBZb3VyIEJ1c2luZXNzKSBpZGVudGl0eSBhc3Nlc3NtZW50IGZvciB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQkNoZWNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJDaGVja1xuICAgICAqL1xuICAgIG5hbWU6IEJ1c2luZXNzRmllbGRNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmllbGRNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCQ2hlY2tcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQkNoZWNrXG4gICAgICovXG4gICAgd2Vic2l0ZTogQnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NLWUJNYXRjaERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCQ2hlY2tcbiAgICAgKi9cbiAgICBtYXRjaF9kZXRhaWxzOiBCdXNpbmVzc0tZQk1hdGNoRGV0YWlscyB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBidXNpbmVzcyBmcm9tIGRhdGEgcHJvdmlkZXIgcmVzdWx0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc0tZQk1hdGNoRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzS1lCTWF0Y2hEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBOYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm92aWRlckJ1c2luZXNzTmFtZT59XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCTWF0Y2hEZXRhaWxzXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PFByb3ZpZGVyQnVzaW5lc3NOYW1lPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NFbnRpdHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQk1hdGNoRGV0YWlsc1xuICAgICAqL1xuICAgIGVudGl0eV90eXBlOiBCdXNpbmVzc0VudGl0eVR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1c2luZXNzXG4gICAgICogQHR5cGUge0FycmF5PFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJNYXRjaERldGFpbHNcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzPjtcbiAgICAvKipcbiAgICAgKiBQaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8QnVzaW5lc3NQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCTWF0Y2hEZXRhaWxzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8QnVzaW5lc3NQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogRW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8QnVzaW5lc3NFbWFpbEFkZHJlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQk1hdGNoRGV0YWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3NlczogQXJyYXk8QnVzaW5lc3NFbWFpbEFkZHJlc3M+O1xuICAgIC8qKlxuICAgICAqIFdlYnNpdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8QnVzaW5lc3NXZWJzaXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJNYXRjaERldGFpbHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlczogQXJyYXk8QnVzaW5lc3NXZWJzaXRlPjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJNYXRjaERldGFpbHNcbiAgICAgKi9cbiAgICBmb3JtYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGhvbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIGJ1c2luZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzUGhvbmVOdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1Bob25lTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBQaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NQaG9uZU51bWJlclxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVzdWx0cyBmcm9tIHRoZSBidXNpbmVzcyByaXNrIGFzc2Vzc21lbnQgY2hlY2tcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NSaXNrQ2hlY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1Jpc2tDaGVjayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzUmlza0NoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1Jpc2tDaGVja1xuICAgICAqL1xuICAgIHN0YXR1czogQnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNSaXNrQ2hlY2s7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIHJpc2sgYXNzZXNzbWVudCBmb3IgdGhlIGJ1c2luZXNzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NSaXNrQ2hlY2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0luZHVzdHJ5UHJlZGljdGlvbk51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1Jpc2tDaGVja1xuICAgICAqL1xuICAgIGluZHVzdHJ5X3ByZWRpY3Rpb246IEJ1c2luZXNzSW5kdXN0cnlQcmVkaWN0aW9uTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYnVzaW5lc3MgaW5mb3JtYXRpb24gdGhhdCB3YXMgdXNlZCB0byBwZXJmb3JtIHRoZSB2ZXJpZmljYXRpb24gc2VhcmNoXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzU2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFuZCBhIG1heGltdW0gbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsdGVybmF0aXZlIGJ1c2luZXNzIG5hbWVzIHRoYXQgd2VyZSBzdWJtaXR0ZWQgYXMgc2VhcmNoIGlucHV0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGFsdGVybmF0aXZlX25hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXNwb25zZUJ1c2luZXNzQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGFkZHJlc3M6IFJlc3BvbnNlQnVzaW5lc3NBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSBidXNpbmVzcyB2ZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYnVzaW5lc3M/OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQnVzaW5lc3MgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlIHZlcmlmaWNhdGlvbiByZXF1ZXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdEJ1c2luZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0QnVzaW5lc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcy4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYW5kIGEgbWF4aW11bSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0QnVzaW5lc3NcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcy4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYW5kIGEgbWF4aW11bSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0QnVzaW5lc3NcbiAgICAgKi9cbiAgICBhbHRlcm5hdGl2ZV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVxdWVzdEJ1c2luZXNzQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0QnVzaW5lc3NcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUmVxdWVzdEJ1c2luZXNzQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0QnVzaW5lc3NcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgYnVzaW5lc3MgdmVyaWZpY2F0aW9uIHJlcHJlc2VudHMgYSBjaGVjayBvZiBhIGJ1c2luZXNzXFwncyBpZGVudGl0eSBhbmQgcmlzayBwcm9maWxlLCBpbmNsdWRpbmcgaW5mb3JtYXRpb24gY29sbGVjdGVkIGFib3V0IHRoZSBidXNpbmVzcyBhbmQgcmVzdWx0cyBmcm9tIHRoaXJkLXBhcnR5IGRhdGEgcHJvdmlkZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgYnVzaW5lc3MgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzT3ZlcmFsbH1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogQnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNPdmVyYWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBCdXNpbmVzc1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0tZQkNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAga3liX2NoZWNrOiBCdXNpbmVzc0tZQkNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NSaXNrQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBCdXNpbmVzc1Jpc2tDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaWdpdGFsX3ByZXNlbmNlX2NoZWNrOiBCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBidXNpbmVzcyB2ZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBidXNpbmVzcyB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYnVzaW5lc3NfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBidXNpbmVzcyB2ZXJpZmljYXRpb24gcmVwcmVzZW50cyBhIGNoZWNrIG9mIGEgYnVzaW5lc3NcXCdzIGlkZW50aXR5IGFuZCByaXNrIHByb2ZpbGUsIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgYWJvdXQgdGhlIGJ1c2luZXNzIGFuZCByZXN1bHRzIGZyb20gdGhpcmQtcGFydHkgZGF0YSBwcm92aWRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBidXNpbmVzcyB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNPdmVyYWxsfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c092ZXJhbGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEJ1c2luZXNzU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzS1lCQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWJfY2hlY2s6IEJ1c2luZXNzS1lCQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1Jpc2tDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IEJ1c2luZXNzUmlza0NoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRpZ2l0YWxfcHJlc2VuY2VfY2hlY2s6IEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEtZQiAoS25vdyBZb3VyIEJ1c2luZXNzKSBpZGVudGl0eSBhc3Nlc3NtZW50IGNoZWNrXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c0tZQkNoZWNrIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogU3RhdHVzIG9mIHRoZSBvdmVyYWxsIGJ1c2luZXNzIHZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNPdmVyYWxsIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogU3RhdHVzIG9mIHRoZSBidXNpbmVzcyByaXNrIGFzc2Vzc21lbnQgY2hlY2tcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJ1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzUmlza0NoZWNrIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogU3RhdHVzIG9mIHRoZSBkaWdpdGFsIHByZXNlbmNlIGNoZWNrXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c1dlYlByZXNlbmNlQ2hlY2sge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTm90QXBwbGljYWJsZSA9ICdub3RfYXBwbGljYWJsZSdcbn1cblxuLyoqXG4gKiBXZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCBhIGJ1c2luZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzV2Vic2l0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzV2Vic2l0ZSB7XG4gICAgLyoqXG4gICAgICogVVJMIG9mIHRoZSBidXNpbmVzcyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXZWJzaXRlXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBXZWJzaXRlIGFuYWx5c2lzIGRldGFpbHMgaWYgYSB3ZWJzaXRlIGlzIGZvdW5kIGZvciB0aGUgcHJvdmlkZWQgd2Vic2l0ZSBpbiB0aGUgc2VhcmNoIHRlcm1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc1dlYnNpdGVBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzV2Vic2l0ZUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NDaGVja0Jvb2xlYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzV2Vic2l0ZUFuYWx5c2lzXG4gICAgICovXG4gICAgaXNfcGFya2VkOiBCdXNpbmVzc0NoZWNrQm9vbGVhblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NDaGVja0Jvb2xlYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzV2Vic2l0ZUFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfaXNfZGVsaXZlcmFibGU6IEJ1c2luZXNzQ2hlY2tCb29sZWFuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1dlYnNpdGVCdWlsZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXZWJzaXRlQW5hbHlzaXNcbiAgICAgKi9cbiAgICB3ZWJzaXRlX2J1aWxkX3N0YXR1czogQnVzaW5lc3NXZWJzaXRlQnVpbGRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzV2hvaXNSZWNvcmR9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzV2Vic2l0ZUFuYWx5c2lzXG4gICAgICovXG4gICAgd2hvaXNfcmVjb3JkOiBCdXNpbmVzc1dob2lzUmVjb3JkO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1dlYnNpdGVTU0x9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzV2Vic2l0ZUFuYWx5c2lzXG4gICAgICovXG4gICAgc3NsOiBCdXNpbmVzc1dlYnNpdGVTU0w7XG59XG4vKipcbiAqIEJ1aWxkIHN0YXR1cyBvZiB0aGUgYnVzaW5lc3Mgd2Vic2l0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJ1c2luZXNzV2Vic2l0ZUJ1aWxkU3RhdHVzIHtcbiAgICBDb21pbmdTb29uID0gJ2NvbWluZ19zb29uJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBJbmFjdGl2ZSA9ICdpbmFjdGl2ZSdcbn1cblxuLyoqXG4gKiBTU0wgc3RhdHVzIGZvciB0aGUgYnVzaW5lc3Mgd2Vic2l0ZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NXZWJzaXRlU1NMXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NXZWJzaXRlU1NMIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NDaGVja0Jvb2xlYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzV2Vic2l0ZVNTTFxuICAgICAqL1xuICAgIGlzX3ZhbGlkOiBCdXNpbmVzc0NoZWNrQm9vbGVhblN0YXR1cztcbn1cbi8qKlxuICogV0hPSVMgbWV0YWRhdGEgZm9yIHRoZSBidXNpbmVzcyB3ZWJzaXRlIGRvbWFpbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NXaG9pc1JlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzV2hvaXNSZWNvcmQge1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1dob2lzUmVjb3JkXG4gICAgICovXG4gICAgZG9tYWluX2NyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzV2hvaXNSZWNvcmRcbiAgICAgKi9cbiAgICBkb21haW5fdXBkYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXaG9pc1JlY29yZFxuICAgICAqL1xuICAgIGRvbWFpbl9leHBpcmVzX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERvbWFpbiByZWdpc3RyYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXaG9pc1JlY29yZFxuICAgICAqL1xuICAgIHJlZ2lzdHJhcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhTG9hbnNSZWdpc3RlclJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2xvYW5zL3JlZ2lzdGVyYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gcmVnaXN0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyYUxvYW5SZWdpc3Rlcj59XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5SZWdpc3Rlcj47XG59XG4vKipcbiAqIEFuIGluc2lnaHQgdGhhdCBjYW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIENhc2ggRmxvdyBVcGRhdGVzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENhc2hGbG93SW5zaWdodCB7XG4gICAgTGFyZ2VEZXBvc2l0RGV0ZWN0ZWQgPSAnTEFSR0VfREVQT1NJVF9ERVRFQ1RFRCcsXG4gICAgTG93QmFsYW5jZURldGVjdGVkID0gJ0xPV19CQUxBTkNFX0RFVEVDVEVEJyxcbiAgICBOZXdMb2FuUGF5bWVudERldGVjdGVkID0gJ05FV19MT0FOX1BBWU1FTlRfREVURUNURUQnLFxuICAgIE5zZk92ZXJkcmFmdERldGVjdGVkID0gJ05TRl9PVkVSRFJBRlRfREVURUNURUQnXG59XG5cbi8qKlxuICogV2ViaG9vayBjb2RlIGZvciBhIENhc2ggRmxvdyBVcGRhdGVzIGV2ZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ2FzaEZsb3dVcGRhdGVzRXZlbnRXZWJob29rQ29kZXMge1xuICAgIExhcmdlRGVwb3NpdERldGVjdGVkID0gJ0xBUkdFX0RFUE9TSVRfREVURUNURUQnLFxuICAgIExvd0JhbGFuY2VEZXRlY3RlZCA9ICdMT1dfQkFMQU5DRV9ERVRFQ1RFRCcsXG4gICAgTmV3TG9hblBheW1lbnREZXRlY3RlZCA9ICdORVdfTE9BTl9QQVlNRU5UX0RFVEVDVEVEJyxcbiAgICBOc2ZPdmVyZHJhZnREZXRlY3RlZCA9ICdOU0ZfT1ZFUkRSQUZUX0RFVEVDVEVEJ1xufVxuXG4vKipcbiAqIEZvciBlYWNoIHVzZXJcXCdzIEl0ZW0gZW5hYmxlZCBmb3IgQ2FzaCBGbG93IFVwZGF0ZXMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbiB1cGRhdGUgZGV0ZWN0cyB0aGF0IGFuIGV4cGVjdGVkIGRlcG9zaXQgd2FzIG1pc3NlZC4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNFeHBlY3RlZERlcG9zaXRNaXNzZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzRXhwZWN0ZWREZXBvc2l0TWlzc2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19VUERBVEVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0V4cGVjdGVkRGVwb3NpdE1pc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVhQRUNURURfREVQT1NJVF9NSVNTRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzRXhwZWN0ZWREZXBvc2l0TWlzc2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5zaWdodHNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0V4cGVjdGVkRGVwb3NpdE1pc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIHRoYXQgdGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNFeHBlY3RlZERlcG9zaXRNaXNzZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0V4cGVjdGVkRGVwb3NpdE1pc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGb3IgZWFjaCBpdGVtIG9uIGFuIGVuYWJsZWQgdXNlciwgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB1cCB0byBmb3VyIHRpbWVzIGEgZGF5IHdpdGggc3RhdHVzIGluZm9ybWF0aW9uLiBUaGlzIHdlYmhvb2sgd2lsbCBub3QgZmlyZSBpbW1lZGlhdGVseSB1cG9uIGVucm9sbG1lbnQgaW4gQ2FzaCBGbG93IFVwZGF0ZXMuIFRoZSBwYXlsb2FkIG1heSBjb250YWluIGFuIGBpbnNpZ2h0c2AgYXJyYXkgd2l0aCBpbnNpZ2h0cyB0aGF0IGhhdmUgYmVlbiBkZXRlY3RlZCwgaWYgYW55IChlLmcuIGBMT1dfQkFMQU5DRV9ERVRFQ1RFRGAsIGBMQVJHRV9ERVBPU0lUX0RFVEVDVEVEYCkuIFVwb24gcmVjZWl2aW5nIHRoZSB3ZWJob29rLCBjYWxsIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvZ2V0YCB0byByZXRyaWV2ZSB0aGUgdXBkYXRlZCBpbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNWMldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNJbnNpZ2h0c1YyV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19VUERBVEVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzVjJXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19JTlNJR0hUU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzVjJXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNWMldlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB3aG9zZSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBpcyByZWNlaXZlZCBieSBjYWxsaW5nIGAvdXNlci9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzVjJXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IGNvbnRhaW5pbmcgdGhlIGluc2lnaHRzIGRldGVjdGVkIHdpdGhpbiB0aGUgZ2VuZXJhdGVkIHJlcG9ydCwgaWYgYW55LiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogICBgTEFSR0VfREVQT1NJVF9ERVRFQ1RFRGA6IHNpZ25hbGluZyBhIGRlcG9zaXQgb3ZlciAkNSwwMDAgICBgTE9XX0JBTEFOQ0VfREVURUNURURgOiBzaWduYWxpbmcgYSBiYWxhbmNlIGJlbG93ICQxMDAgICBgTkVXX0xPQU5fUEFZTUVOVF9ERVRFQ1RFRGA6IHNpZ25hbGluZyBhIG5ldyBsb2FuIHBheW1lbnQgICBgTlNGX09WRVJEUkFGVF9ERVRFQ1RFRGA6IHNpZ25hbGluZyBhbiBOU0Ygb3ZlcmRyYWZ0XG4gICAgICogQHR5cGUge0FycmF5PENhc2hGbG93SW5zaWdodD59XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzVjJXZWJob29rXG4gICAgICovXG4gICAgaW5zaWdodHM6IEFycmF5PENhc2hGbG93SW5zaWdodD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNWMldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyXFwncyBJdGVtIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIGEgZGF5IHdpdGggaW5mb3JtYXRpb24gb24gdGhlIHN0YXR1cyBvZiB0aGUgdXBkYXRlLiBUaGlzIHdlYmhvb2sgd2lsbCBub3QgZmlyZSBpbW1lZGlhdGVseSB1cG9uIGVucm9sbG1lbnQgaW4gQ2FzaCBGbG93IFVwZGF0ZXMuIFVwb24gcmVjZWl2aW5nIHRoZSB3ZWJob29rLCBjYWxsIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvZ2V0YCB0byByZXRyaWV2ZSB0aGUgdXBkYXRlZCBpbnNpZ2h0cy4gQXQgYXBwcm94aW1hdGVseSB0aGUgc2FtZSB0aW1lIGFzIHRoZSBgSU5TSUdIVFNfVVBEQVRFRGAgd2ViaG9vaywgYW55IGV2ZW50LWRyaXZlbiBgQ0FTSF9GTE9XX1VQREFURVNgIHdlYmhvb2tzIChlLmcuIGBMT1dfQkFMQU5DRV9ERVRFQ1RFRGAsIGBMQVJHRV9ERVBPU0lUX0RFVEVDVEVEYCkgdGhhdCB3ZXJlIHRyaWdnZXJlZCBieSB0aGUgdXBkYXRlIHdpbGwgYWxzbyBmaXJlLiBUaGlzIHdlYmhvb2sgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIGBDQVNIX0ZMT1dfSU5TSUdIVFNfVVBEQVRFRGAgd2ViaG9vayBmb3IgYWxsIGN1c3RvbWVycyB3aG8gYmVnYW4gdXNpbmcgUGxhaWQgQ2hlY2sgb24gb3IgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc0luc2lnaHRzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc0luc2lnaHRzV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19VUERBVEVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTlNJR0hUU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5zaWdodHNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgdGhhdCB0aGUgcmVwb3J0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNJbnNpZ2h0c1dlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyXFwncyBJdGVtIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYW4gdXBkYXRlIGRldGVjdHMgYSBkZXBvc2l0IG92ZXIgJDUsMDAwLiBVcG9uIHJlY2VpdmluZyB0aGUgd2ViaG9vaywgY2FsbCBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGAgdG8gcmV0cmlldmUgdGhlIHVwZGF0ZWQgaW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc0xhcmdlRGVwb3NpdFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNMYXJnZURlcG9zaXRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ0FTSF9GTE9XX1VQREFURVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTGFyZ2VEZXBvc2l0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMQVJHRV9ERVBPU0lUX0RFVEVDVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0xhcmdlRGVwb3NpdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMYXJnZURlcG9zaXRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBNb25pdG9yaW5nSW5zaWdodHNTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCB0aGF0IHRoZSByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTGFyZ2VEZXBvc2l0V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMYXJnZURlcG9zaXRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRm9yIGVhY2ggdXNlclxcJ3MgSXRlbSBlbmFibGVkIGZvciBDYXNoIEZsb3cgVXBkYXRlcywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFuIHVwZGF0ZSBkZXRlY3RzIGEgYmFsYW5jZSBiZWxvdyAkMTAwLiBVcG9uIHJlY2VpdmluZyB0aGUgd2ViaG9vaywgY2FsbCBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGAgdG8gcmV0cmlldmUgdGhlIHVwZGF0ZWQgaW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc0xvd0JhbGFuY2VXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzTG93QmFsYW5jZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDQVNIX0ZMT1dfVVBEQVRFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMb3dCYWxhbmNlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMT1dfQkFMQU5DRV9ERVRFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMb3dCYWxhbmNlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5zaWdodHNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0xvd0JhbGFuY2VXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBNb25pdG9yaW5nSW5zaWdodHNTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCB0aGF0IHRoZSByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTG93QmFsYW5jZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTG93QmFsYW5jZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyXFwncyBJdGVtIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYW4gdXBkYXRlIGluY2x1ZGVzIGFuIE5TRiBvdmVyZHJhZnQgdHJhbnNhY3Rpb24uIFVwb24gcmVjZWl2aW5nIHRoZSB3ZWJob29rLCBjYWxsIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvZ2V0YCB0byByZXRyaWV2ZSB0aGUgdXBkYXRlZCBpbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzTlNGV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc05TRldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDQVNIX0ZMT1dfVVBEQVRFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOU0ZXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYE5TRl9PVkVSRFJBRlRfREVURUNURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTlNGV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5zaWdodHNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05TRldlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIHRoYXQgdGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOU0ZXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05TRldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyXFwncyBJdGVtIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYW4gdXBkYXRlIGluY2x1ZGVzIGEgbmV3IGluY29tZSBzdHJlYW0uIFVwb24gcmVjZWl2aW5nIHRoZSB3ZWJob29rLCBjYWxsIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvZ2V0YCB0byByZXRyaWV2ZSB0aGUgdXBkYXRlZCBpbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzTmV3SW5jb21lU3RyZWFtV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc05ld0luY29tZVN0cmVhbVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDQVNIX0ZMT1dfVVBEQVRFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdJbmNvbWVTdHJlYW1XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYE5FV19JTkNPTUVfU1RSRUFNX0RFVEVDVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0luY29tZVN0cmVhbVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdJbmNvbWVTdHJlYW1XZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBNb25pdG9yaW5nSW5zaWdodHNTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCB0aGF0IHRoZSByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTmV3SW5jb21lU3RyZWFtV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdJbmNvbWVTdHJlYW1XZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRm9yIGVhY2ggdXNlclxcJ3MgSXRlbSBlbmFibGVkIGZvciBDYXNoIEZsb3cgVXBkYXRlcywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFuIHVwZGF0ZSBkZXRlY3RzIGEgbmV3IGxvYW4gcGF5bWVudC4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNOZXdMb2FuUGF5bWVudFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNOZXdMb2FuUGF5bWVudFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDQVNIX0ZMT1dfVVBEQVRFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdMb2FuUGF5bWVudFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTkVXX0xPQU5fUEFZTUVOVF9ERVRFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdMb2FuUGF5bWVudFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdMb2FuUGF5bWVudFdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIHRoYXQgdGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdMb2FuUGF5bWVudFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTmV3TG9hblBheW1lbnRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgY2FzaGZsb3cgYXR0cmlidXRlcy4gUmVxdWlyZWQgaWYgdXNpbmcgQ2FzaCBGbG93IEluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbiB7XG4gICAgVjEwID0gJ3YxLjAnLFxuICAgIFYyMCA9ICd2Mi4wJyxcbiAgICBDZmkxID0gJ0NGSTEnXG59XG5cbi8qKlxuICogSW5zaWdodHMgb24gdGhlIGFjY291bnQgbGV2ZWwuIFRoZXNlIGFyZSBvbmx5IHJldHVybmVkIGZvciBDcmVkaXQgYW5kIERlcG9zaXRvcnkgdHlwZSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEFjY291bnRJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LiAgQXZhaWxhYmxlIGZvciBgY3JlZGl0YCBhbmQgYGRlcG9zaXRvcnlgIHR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PENhc2hmbG93UmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYmFsYW5jZXM6IEFycmF5PENhc2hmbG93UmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+O1xuICAgIC8qKlxuICAgICAqIE1vbnRobHkgc3VtbWFyeSBzdGF0aXN0aWNzIGRlcml2ZWQgZnJvbSB0cmFuc2FjdGlvbi1sZXZlbCBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBtb250aGx5X3N1bW1hcmllczogQXJyYXk8Q2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeT47XG59XG4vKipcbiAqIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jYXNoZmxvd19yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHRvIHJldHJpZXZlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciAoMSB0byA3MzApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoIHBlciBjYWxsXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnNvciB2YWx1ZSByZXByZXNlbnRzIHRoZSBsYXN0IHVwZGF0ZSByZXF1ZXN0ZWQuIFBhc3MgaW4gdGhlIGVtcHR5IHN0cmluZyBcXFwiXFxcIiBpbiB0aGUgZmlyc3QgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2FzaGZsb3dfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGBhY2NvdW50c2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCB0cmFuc2FjdGlvbnMgYXJlIGJlaW5nIHJldHVybmVkLiBFYWNoIHRyYW5zYWN0aW9uIGNhbiBiZSBtYXBwZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYWNjb3VudCB2aWEgdGhlIGBhY2NvdW50X2lkYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QnVzaW5lc3NBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxCdXNpbmVzc0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBhbnkgZnV0dXJlIHVwZGF0ZXMgYWZ0ZXIgdGhlIGxhdGVzdCB1cGRhdGUgcHJvdmlkZWQgaW4gdGhpcyByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGlmIG1vcmUgdGhhbiByZXF1ZXN0ZWQgY291bnQgb2YgdHJhbnNhY3Rpb25zIGV4aXN0cyB0byBiZSBmZXRjaGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBzdWNjZXNzZnVsIHVwZGF0ZSB0aW1lIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0SGlzdG9yaWNhbEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY2FzaGZsb3dfcmVwb3J0L2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2FzaGZsb3dfcmVwb3J0L2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEJ1c2luZXNzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxCdXNpbmVzc0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydEFjY291bnRJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9pbnNpZ2h0czogQ2FzaGZsb3dSZXBvcnRBY2NvdW50SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogRGF0ZXRpbWUgb2YgbGFzdCBDYXNoZmxvdyBSZXBvcnQgZ2VuZXJhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgIClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X2dlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTW9udGhseSBzdW1tYXJ5IHN0YXRpc3RpY3MgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuICBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGJlZ2luIHdpdGggdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGguICBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguICBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydGluZ19iYWxhbmNlOiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5U3RhcnRpbmdCYWxhbmNlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUVuZGluZ0JhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRpbmdfYmFsYW5jZTogQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUVuZGluZ0JhbGFuY2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGFpbHlfZW5kaW5nX2JhbGFuY2U6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlFbmRpbmdCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5SW5mbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgYXZlcmFnZV9kYWlseV9pbmZsb3dfYW1vdW50OiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5SW5mbG93QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGFpbHlfb3V0Zmxvd19hbW91bnQ6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlPdXRmbG93QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5TmV0Q2FzaGZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBhdmVyYWdlX2RhaWx5X25ldF9jYXNoZmxvd19hbW91bnQ6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlOZXRDYXNoZmxvd0Ftb3VudDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGRhaWx5IGluZmxvdyB0cmFuc2FjdGlvbnMuIFJvdW5kZWQgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgYXZlcmFnZV9kYWlseV9pbmZsb3dfdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGRhaWx5IG91dGZsb3cgdHJhbnNhY3Rpb25zLiBSb3VuZGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGFpbHlfb3V0Zmxvd190cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfcmV2ZW51ZTogQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUmV2ZW51ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnR9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9sb2FuX3BheW1lbnQ6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbExvYW5QYXltZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxWYXJpYWJsZUV4cGVuc2V9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF92YXJpYWJsZV9leHBlbnNlOiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxWYXJpYWJsZUV4cGVuc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFBheXJvbGx9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9wYXlyb2xsOiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxQYXlyb2xsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgYWxsIE5TRiB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIG5zZl90cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgYWxsIG92ZXJkcmFmdCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIG92ZXJkcmFmdF90cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB3aXRoIGEgbmVnYXRpdmUgZGFpbHkgYXZlcmFnZSBlbmRpbmcgYmFsYW5jZS4gVGhlIGRhaWx5IGF2ZXJhZ2UgaXMgY2FsY3VsYXRlZCBhY3Jvc3MgYWxsIHZhbGlkIGFjY291bnRzLiBWYWx1ZXMgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsIDMxXS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgbmVnYXRpdmVfZW5kaW5nX2JhbGFuY2VfZGF5X2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIENhbGVuZGFyLWRheSBhdmVyYWdlIG9mIHRoZSBlbmRpbmcgYmFsYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseUVuZGluZ0JhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlFbmRpbmdCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGF2ZXJhZ2UgZGFpbHkgc3VtIG9mIGluZmxvdyB0cmFuc2FjdGlvbnMsIGNhbGN1bGF0ZWQgb3ZlciB0aGUgbW9udGguIEFsd2F5cyByZXByZXNlbnRlZCBhcyBhIHBvc2l0aXZlIG1vbmV0YXJ5IGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseUluZmxvd0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseUluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhdmVyYWdlIGRhaWx5IG5ldCBjYXNoIGZsb3cgYW1vdW50LCBjYWxjdWxhdGVkIGFzIHRvdGFsIGRhaWx5IGluZmxvd3MgbGVzcyB0b3RhbCBkYWlseSBvdXRmbG93cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU5ldENhc2hmbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU5ldENhc2hmbG93QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlOZXRDYXNoZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlOZXRDYXNoZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU5ldENhc2hmbG93QW1vdW50XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYXZlcmFnZSBkYWlseSBzdW0gb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbnMsIGNhbGN1bGF0ZWQgb3ZlciB0aGUgbW9udGguIEFsd2F5cyByZXByZXNlbnRlZCBhcyBhIHBvc2l0aXZlIG1vbmV0YXJ5IGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU91dGZsb3dBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBtb250aC4gVGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBzdGFydGluZyBiYWxhbmNlIG9mIHRoZSBuZXh0IG1vbnRoLiBUaGlzIGZpZWxkIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBmb3IgdGhlIGxhc3QgbW9udGhseSBzdW1tYXJ5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5RW5kaW5nQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlFbmRpbmdCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlFbmRpbmdCYWxhbmNlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUVuZGluZ0JhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlFbmRpbmdCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgbW9udGguIFRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgZW5kaW5nIGJhbGFuY2Ugb2YgdGhlIHByZXZpb3VzIG1vbnRoLiBUaGlzIGZpZWxkIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBmb3IgdGhlIGZpcnN0IG1vbnRobHkgc3VtbWFyeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVN0YXJ0aW5nQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVN0YXJ0aW5nQmFsYW5jZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0b3RhbCBhbW91bnQgb2YgYWxsIGxvYW4gcGF5bWVudCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbExvYW5QYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxMb2FuUGF5bWVudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0b3RhbCBhbW91bnQgb2YgYWxsIHBheXJvbGwgdHJhbnNhY3Rpb25zIGR1cmluZyB0aGlzIG1vbnRoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxQYXlyb2xsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUGF5cm9sbCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxQYXlyb2xsXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUGF5cm9sbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUGF5cm9sbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCBvZiBhbGwgcmV2ZW51ZSB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFJldmVudWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFJldmVudWVcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdG90YWwgYW1vdW50IG9mIGFsbCB2YXJpYWJsZSBleHBlbnNlIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhpcyBtb250aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsVmFyaWFibGVFeHBlbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsVmFyaWFibGVFeHBlbnNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFZhcmlhYmxlRXhwZW5zZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFZhcmlhYmxlRXhwZW5zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsVmFyaWFibGVFeHBlbnNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBpbnRlci1iYW5rIHRyYW5zZmVycy4gSWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBub3QgYW4gaW50ZXItYmFuayB0cmFuc2ZlciwgYWxsIGZpZWxkcyB3aWxsIGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0UGF5bWVudE1ldGEge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiByZWZlcmVuY2UgbnVtYmVyIHN1cHBsaWVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBQUEQgSUQgZm9yIHRoZSBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcHBkX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHJlY2VpdmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0eSBpbml0aWF0aW5nIGEgd2lyZSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBhIHdpcmUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIGJ5X29yZGVyX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHBheWluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLCBlLmcuIFxcJ0FDSFxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0UGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGF5bWVudCBwcm9jZXNzb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9jZXNzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgdG8gcmV0cmlldmUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yICgxIHRvIDczMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFuc2FjdGlvbiByZXR1cm5lZCBmcm9tIENhc2hmbG93IFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gRm9yIGFsbCBwcm9kdWN0cyBleGNlcHQgSW5jb21lOiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuIEZvciBJbmNvbWUgZW5kcG9pbnRzLCB2YWx1ZXMgYXJlIHBvc2l0aXZlIHdoZW4gcmVwcmVzZW50aW5nIGluY29tZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgTm90ZTogVGhpcyBpcyBhIGxlZ2FjeSBmaWVsZCB0aGF0IGlzIG5vdCBhY3RpdmVseSBtYWludGFpbmVkLiBVc2UgYG1lcmNoYW50X25hbWVgIGluc3RlYWQgZm9yIHRoZSBtZXJjaGFudCBuYW1lLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgaW5jbHVkZWQgaWYgdGhlIGNsaWVudCBoYXMgc2V0IGBvcHRpb25zLmluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb25gIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhOiBDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBwcm92aWRlIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuIEEgc3ViLWFjY291bnQgbW9zdCBjb21tb25seSBleGlzdHMgaW4gY2FzZXMgd2hlcmUgYSBzaW5nbGUgYWNjb3VudCBpcyBsaW5rZWQgdG8gbXVsdGlwbGUgY2FyZHMsIGVhY2ggd2l0aCBpdHMgb3duIGNhcmQgbnVtYmVyIGFuZCBjYXJkIGhvbGRlciBuYW1lOyBlYWNoIGNhcmQgd2lsbCBiZSBjb25zaWRlcmVkIGEgc3ViLWFjY291bnQuIElmIHRoZSBhY2NvdW50IGRvZXMgaGF2ZSBzdWItYWNjb3VudHMsIHRoaXMgZmllbGQgd2lsbCB0eXBpY2FsbHkgYmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGUgc3ViLWFjY291bnQgb3duZXJcXCdzIG5hbWUgYW5kL29yIHRoZSBzdWItYWNjb3VudCBtYXNrLiBUaGUgZm9ybWF0IG9mIHRoaXMgZmllbGQgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgd2lsbCB2YXJ5IGJhc2VkIG9uIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRldGltZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRldGltZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRldGltZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgcmF0aGVyIHRoYW4gcG9zdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCBmaWVsZC4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENoYW5uZWx9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYnVzaW5lc3NfZmluYW5jZV9jYXRlZ29yeT86IEJ1c2luZXNzRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvZGU6IFRyYW5zYWN0aW9uQ29kZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LiBJbiB0aGUgY2FzZSBvZiBhIG1lcmNoYW50IHdpdGggbXVsdGlwbGUgcmV0YWlsIGxvY2F0aW9ucywgdGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYnJvYWRlciBtZXJjaGFudCwgbm90IGEgc3BlY2lmaWMgbG9jYXRpb24gb3Igc3RvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoIHBlciBjYWxsXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnNvciB2YWx1ZSByZXByZXNlbnRzIHRoZSBsYXN0IHVwZGF0ZSByZXF1ZXN0ZWQuIFBhc3MgaW4gdGhlIGVtcHR5IHN0cmluZyBcXFwiXFxcIiBpbiB0aGUgZmlyc3QgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEJ1c2luZXNzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QnVzaW5lc3NBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBpZiBtb3JlIHRoYW4gcmVxdWVzdGVkIGNvdW50IG9mIHRyYW5zYWN0aW9ucyBleGlzdHMgdG8gYmUgZmV0Y2hlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENhdGVnb3JpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2F0ZWdvcmllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWxsIG9mIHRoZSB0cmFuc2FjdGlvbiBjYXRlZ29yaWVzIHVzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2F0ZWdvcmllczogQXJyYXk8Q2F0ZWdvcnk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYSB0cmFuc2FjdGlvbiBjYXRlZ29yeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmeWluZyBudW1iZXIgZm9yIHRoZSBjYXRlZ29yeS4gYGNhdGVnb3J5X2lkYCBpcyBhIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gbWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBwbGFjZWAgZm9yIHBoeXNpY2FsIHRyYW5zYWN0aW9ucyBvciBgc3BlY2lhbGAgZm9yIG90aGVyIHRyYW5zYWN0aW9ucyBzdWNoIGFzIGJhbmsgY2hhcmdlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGdyb3VwOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyBgY2F0ZWdvcnlfaWRgIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgaGllcmFyY2h5OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBEZXRhaWxlZCBleHBlbnNlIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIGNyZWRpdCBjYXRlZ29yeSwgaW5jbHVkaW5nIHRyYW5zYWN0aW9uIGNvdW50IGFuZCB0b3RhbCBhbW91bnQgc3BlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5RXhwZW5zZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUV4cGVuc2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNyZWRpdCBjYXRlZ29yeS4gIFNlZSB0aGUgW2NhdGVnb3J5IHRheG9ub215XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGNhdGVnb3J5IElEcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUV4cGVuc2VzXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhpcyBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUV4cGVuc2VzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgdmFsdWUgZm9yIGFsbCB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUV4cGVuc2VzXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlFeHBlbnNlc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlFeHBlbnNlc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbnRobHlBdmVyYWdlfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUV4cGVuc2VzXG4gICAgICovXG4gICAgbW9udGhseV9hdmVyYWdlPzogTW9udGhseUF2ZXJhZ2UgfCBudWxsO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvYmplY3QgZm9yIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBDYXRlZ29yeSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkgc29ydGVkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3BfY291bnRlcnBhcnRpZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvbiBhIHVzZXJcXCdzIHRvcCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluc2lnaHRzIG9mIHRvcCBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmltYXJ5X2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgZGV0YWlsZWQgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIHJhbmtlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeUluc2lnaHREZXRhaWxzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRldGFpbGVkX2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG59XG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogUGxhaWRFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBPQXV0aC1iYXNlZCBpdGVtIGVycm9yczsgYG51bGxgIHdpbGwgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiAgUG9zc2libGUgdmFsdWVzOiBgT0FVVEhfSU5WQUxJRF9UT0tFTmA6IFRoZSB1c2VyXFwncyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICBgT0FVVEhfQ09OU0VOVF9FWFBJUkVEYDogVGhlIHVzZXJcXCdzIGFjY2VzcyBjb25zZW50IGZvciB0aGlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgZXhwaXJlZC4gIGBPQVVUSF9VU0VSX1JFVk9LRURgOiBUaGUgdXNlclxcJ3MgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdXNlciByZXZva2VkIHRoZWlyIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhpcyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIGJlIHByb3ZpZGVkIGZvciB0aGUgYGVycm9yX3R5cGVgIGBBU1NFVF9SRVBPUlRfRVJST1JgIG9yIGBDSEVDS19SRVBPUlRfRVJST1JgLiBgY2F1c2VzYCB3aWxsIGFsc28gbm90IGJlIHBvcHVsYXRlZCBpbnNpZGUgYW4gZXJyb3IgbmVzdGVkIHdpdGhpbiBhIGB3YXJuaW5nYCBvYmplY3QuXG4gICAgICogQHR5cGUge0FycmF5PGFueT59XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgY2F1c2VzPzogQXJyYXk8YW55PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLiBUaGlzIHdpbGwgb25seSBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keSB3aGVuIHRoZSBlcnJvciBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB2aWEgYSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgUGxhaWQgZG9jdW1lbnRhdGlvbiBwYWdlIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGRvY3VtZW50YXRpb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1Z2dlc3RlZCBzdGVwcyBmb3IgcmVzb2x2aW5nIHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgc3VnZ2VzdGVkX2FjdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBhY2NvdW50IHN1YnR5cGVzIHRoYXQgd2VyZSByZXF1ZXN0ZWQgdmlhIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIEN1cnJlbnRseSBvbmx5IHBvcHVsYXRlZCBmb3IgYE5PX0FDQ09VTlRTYCBlcnJvcnMgZnJvbSBJdGVtcyB3aXRoIGBpbnZlc3RtZW50c19hdXRoYCBhcyBhbiBlbmFibGVkIHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHJlcXVpcmVkX2FjY291bnRfc3VidHlwZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHdlcmUgZXh0cmFjdGVkIGJ1dCBkaWQgbm90IG1hdGNoIHRoZSByZXF1ZXN0ZWQgc3VidHlwZXMgdmlhIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIEN1cnJlbnRseSBvbmx5IHBvcHVsYXRlZCBmb3IgYE5PX0FDQ09VTlRTYCBlcnJvcnMgZnJvbSBJdGVtcyB3aXRoIGBpbnZlc3RtZW50c19hdXRoYCBhcyBhbiBlbmFibGVkIHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHByb3ZpZGVkX2FjY291bnRfc3VidHlwZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdXNlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VBbGxPZlxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhIENoZWNrIFJlcG9ydCBwcm9kdWN0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBpbmZvcm1hdGlvbi4gSW4gc3VjaCBjYXNlcywgdGhlIHByb2R1Y3Qgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDaGVja1JlcG9ydFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja1JlcG9ydFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIHR5cGUsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBDSEVDS19SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDaGVja1JlcG9ydFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2hlY2tSZXBvcnRXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2hlY2tSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBDaGVja1JlcG9ydFdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2hlY2tSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENhdXNlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiAgQWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBDcmVkaXQgYW5kIERlcG9zaXRvcnkgYWNjb3VudHMgYXJlIHVuYXZhaWxhYmxlLiBgVVNFUl9GUkFVRF9BTEVSVGA6IFRoZSB1c2VyIGhhcyBwbGFjZWQgYSBmcmF1ZCBhbGVydCBvbiB0aGVpciBQbGFpZCBDaGVjayBjb25zdW1lciByZXBvcnQgZHVlIHRvIHN1c3BlY3RlZCBmcmF1ZC4gUGxlYXNlIG5vdGUgdGhhdCB3aGVuIGEgZnJhdWQgYWxlcnQgaXMgaW4gcGxhY2UsIHRoZSByZWNpcGllbnQgb2YgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgYW4gb2JsaWdhdGlvbiB0byB2ZXJpZnkgdGhlIGNvbnN1bWVyXFwncyBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENoZWNrUmVwb3J0V2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgVXNlckZyYXVkQWxlcnQgPSAnVVNFUl9GUkFVRF9BTEVSVCdcbn1cblxuLyoqXG4gKiBDdXN0b20gY2xpZW50IGZpZWxkc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRDdXN0b21pemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q3VzdG9taXphdGlvbiB7XG4gICAgLyoqXG4gICAgICogQ3VzdG9tIGVudGl0eSBJRCB0aGF0IG1hcHMgdG8gYSBtZXJjaGFudCBvciBjb3VudGVycGFydHkuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGBtZXJjaGFudF9lbnRpdHlfaWRgIGFzIHdlbGwgYXMgdGhlIGBlbnRpdHlfaWRgIG9uIHRoZSBjb3VudGVycGFydGllcyBvYmplY3QgdG8gbWVldCBjbGllbnQgc3BlY2lmaWMgbmVlZHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50Q3VzdG9taXphdGlvblxuICAgICAqL1xuICAgIGN1c3RvbV9lbnRpdHlfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIHRoYXQgUGxhaWQgaGFzIGVuaGFuY2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIHRvIHRpZSB0cmFuc2FjdGlvbnMgYmFjayB0byBjbGllbnRzXFwnIHN5c3RlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSBhY2NvdW50XFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5oYW5jZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBlbmhhbmNlbWVudHM6IEVuaGFuY2VtZW50cztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gdGhhdCBQbGFpZCBoYXMgZW5yaWNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIHRyYW5zYWN0aW9uIGFzIHByb3ZpZGVkIGJ5IHlvdSBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWNjb3VudCBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiBhY2NvdW50LCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF9hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2htZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5yaWNobWVudHM6IEVucmljaG1lbnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRDdXN0b21pemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfY3VzdG9taXphdGlvbj86IENsaWVudEN1c3RvbWl6YXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5oYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGlyZWN0aW9uLiAoTk9URTogdGhpcyB3aWxsIGFmZmVjdCBlbnJpY2htZW50IHJlc3VsdHMsIHNvIGRpcmVjdGlvbnMgYXJlIGltcG9ydGFudCk6LiAgIE5lZ2F0aXZlICgtKSBmb3IgY3JlZGl0cyAoZS5nLiwgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzKSAgIFBvc2l0aXZlICgrKSBmb3IgZGViaXRzIChlLmcuLCBwdXJjaGFzZXMsIGZlZXMsIG91dGdvaW5nIHRyYW5zZmVycylcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5yaWNoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGhlbHAgeW91IHRpZSBkYXRhIGJhY2sgdG8geW91ciBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBnZW5lcmF0ZWQgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBmb3Igd2hvbSB5b3Ugd291bGQgbGlrZSB0byBlbnJpY2ggdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFjY291bnQgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gYWNjb3VudCwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNsaWVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi4gSWYgeW91IGhhdmUgbG9jYXRpb24gZGF0YSBpbiBhdmFpbGFibGUgYW4gdW5zdHJ1Y3R1cmVkIGZvcm1hdCwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24gKD49IDApLiBXaGVuIHRlc3RpbmcgRW5yaWNoLCBub3RlIHRoYXQgYGFtb3VudGAgZGF0YSBzaG91bGQgYmUgcmVhbGlzdGljLiBVbnJlYWxpc3RpYyBvciBpbmFjY3VyYXRlIGBhbW91bnRgIGRhdGEgbWF5IHJlc3VsdCBpbiByZWR1Y2VkIHF1YWxpdHkgb3V0cHV0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMgKE1DQ3MpIGFyZSBmb3VyLWRpZ2l0IG51bWJlcnMgdGhhdCBkZXNjcmliZSBhIG1lcmNoYW50XFwncyBwcmltYXJ5IGJ1c2luZXNzIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1jYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZD86IHN0cmluZztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UuICBVc2UgdGhpcyBmaWVsZCB0byBwYXNzIGluIHN0cnVjdHVyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24geW91IG1heSBoYXZlIGFib3V0IHlvdXIgdHJhbnNhY3Rpb25zLiBQcm92aWRpbmcgbG9jYXRpb24gZGF0YSBpcyBvcHRpb25hbCBidXQgY2FuIGluY3JlYXNlIHJlc3VsdCBxdWFsaXR5LiBJZiB5b3UgaGF2ZSB1bnN0cnVjdHVyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24sIGl0IG1heSBiZSBhcHBlbmRlZCB0byB0aGUgYGRlc2NyaXB0aW9uYCBmaWVsZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQsIGZvcm1hdHRlZCBhcyBhbiBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIChcXFwiVVNcXFwiIG9yIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQsIGZvcm1hdHRlZCBhcyB0aGUgb2ZmaWNpYWwgdHdvLWxldHRlciBVUyBzdGF0ZSBvciBDYW5hZGlhbiBwcm92aW5jZSBwb3N0YWwgY29kZSwgZS5nLiBcXFwiQ1RcXFwiIG9yIFxcXCJRQ1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZmllbGRzIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuIEZvciBhIHVzZXIgdG8gYmUgZWxpZ2libGUgZm9yIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCBhbGwgZmllbGRzIGFyZSByZXF1aXJlZCBleGNlcHQgYGlkX251bWJlcmAuIFByb3ZpZGluZyBhIHBhcnRpYWwgU1NOIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLCBhbmQgaW1wcm92ZXMgdGhlIGFjY3VyYWN5IG9mIG1hdGNoaW5nIHVzZXIgcmVjb3JkcyBkdXJpbmcgY29tcGxpYW5jZSBwcm9jZXNzZXMgc3VjaCBhcyBmaWxlIGRpc2Nsb3N1cmUsIGRpc3B1dGUsIG9yIHNlY3VyaXR5IGZyZWV6ZSByZXF1ZXN0cy4gSWYgY3JlYXRpbmcgYSByZXBvcnQgdGhhdCB3aWxsIGJlIHNoYXJlZCB3aXRoIEdTRXMgc3VjaCBhcyBGYW5uaWUgb3IgRnJlZGRpZSwgYSBmdWxsIFNvY2lhbCBTZWN1cml0eSBOdW1iZXIgbXVzdCBiZSBwcm92aWRlZCB2aWEgdGhlIGBpZF9udW1iZXJgIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRVc2VySWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRVc2VySWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRVc2VySWRlbnRpdHlOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBuYW1lPzogQ2xpZW50VXNlcklkZW50aXR5TmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGRhdGUgb2YgYmlydGgsIHRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbHMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFVzZXJJZGVudGl0eUVtYWlsPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZW1haWxzPzogQXJyYXk8Q2xpZW50VXNlcklkZW50aXR5RW1haWw+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXJzLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTU3NDUyMTMwXFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuIFBob25lIG51bWJlciBpbnB1dCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRVc2VySWRlbnRpdHlQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM/OiBBcnJheTxDbGllbnRVc2VySWRlbnRpdHlQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFkZHJlc3Nlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50VXNlcklkZW50aXR5QWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGFkZHJlc3Nlcz86IEFycmF5PENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3M+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBJRCBudW1iZXJzLlxuICAgICAqIEB0eXBlIHtBcnJheTxVc2VySUROdW1iZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBpZF9udW1iZXJzPzogQXJyYXk8VXNlcklETnVtYmVyPjtcbn1cbi8qKlxuICogVXNlciBhZGRyZXNzIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRVc2VySWRlbnRpdHlBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50VXNlcklkZW50aXR5QWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogRmlyc3QgbGluZSBvZiBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0XzE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlY29uZCBsaW5lIG9mIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXRfMj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSwgcHJvdmluY2Ugb3IgcmVnaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBvc3RhbCBvciBaSVAgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgdGhlIHByaW1hcnkgYWRkcmVzcyBmb3IgdGhlIFVzZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuO1xufVxuLyoqXG4gKiBVc2VyIGVtYWlsIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRVc2VySWRlbnRpdHlFbWFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eUVtYWlsIHtcbiAgICAvKipcbiAgICAgKiBVc2VyXFwncyBlbWFpbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlFbWFpbFxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IGVtYWlsIGZvciB0aGUgVXNlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5RW1haWxcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuO1xufVxuLyoqXG4gKiBVc2VyIG5hbWUgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eU5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRVc2VySWRlbnRpdHlOYW1lIHtcbiAgICAvKipcbiAgICAgKiBVc2VyXFwncyBnaXZlbiBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eU5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVXNlclxcJ3MgZmFtaWx5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5TmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXIgcGhvbmUgbnVtYmVyIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRVc2VySWRlbnRpdHlQaG9uZU51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eVBob25lTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBVc2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5UGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICBkYXRhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyB0aGUgcHJpbWFyeSBwaG9uZSBudW1iZXIgZm9yIHRoZSBVc2VyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29ubmVjdGVkIGFwcGxpY2F0aW9uIGZvciBhIHBhcnRpY3VsYXIgZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGAsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGNvbnNlbnQgZXZlbnQgb2NjdXJyZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zZW50RXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlPzogQ29uc2VudEV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfY29kZT86IENvbnNlbnRFdmVudENvZGU7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lLURheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50SW5pdGlhdG9yfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I/OiBDb25zZW50RXZlbnRJbml0aWF0b3I7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyB0aGUgZW5kIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0uICBTZWUgdGhlIFtmdWxsIGxpc3RdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLyN1cGRhdGluZy1saW5rLWN1c3RvbWl6YXRpb25zKSBvZiB1c2UgY2FzZXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudFxuICAgICAqL1xuICAgIGNvbnNlbnRlZF91c2VfY2FzZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGZ1bGwgbGlzdCBvZiBkYXRhIHNjb3BlcyB0aGUgZW5kIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0uIFRoZXNlIGNvcnJlc3BvbmQgdG8gY29uc2VudGVkIHByb2R1Y3RzOyBzZWUgdGhlIFtmdWxsIG1hcHBpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLyNkYXRhLXNjb3Blcy1ieS1wcm9kdWN0KSBvZiBkYXRhIHNjb3BlcyBhbmQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudFxuICAgICAqL1xuICAgIGNvbnNlbnRlZF9kYXRhX3Njb3Blcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBhdXRob3JpemF0aW9ucyBhcmUgZ3JhbnRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29uc2VudGVkQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudFxuICAgICAqL1xuICAgIGNvbnNlbnRlZF9hY2NvdW50cz86IEFycmF5PENvbnNlbnRlZEFjY291bnQ+O1xufVxuLyoqXG4gKiBDb2RlcyBkZXNjcmliaW5nIHRoZSBvYmplY3Qgb2YgYSBjb25zZW50IGV2ZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ29uc2VudEV2ZW50Q29kZSB7XG4gICAgVXNlckFncmVlbWVudCA9ICdVU0VSX0FHUkVFTUVOVCcsXG4gICAgVXNlQ2FzZXMgPSAnVVNFX0NBU0VTJyxcbiAgICBEYXRhU2NvcGVzID0gJ0RBVEFfU0NPUEVTJyxcbiAgICBBY2NvdW50U2NvcGVzID0gJ0FDQ09VTlRfU0NPUEVTJyxcbiAgICBSZXZvY2F0aW9uID0gJ1JFVk9DQVRJT04nXG59XG5cbi8qKlxuICogVGhlIGVudGl0eSB0aGF0IGluaXRpYXRlZCBjb2xsZWN0aW9uIG9mIGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRJbml0aWF0b3Ige1xuICAgIFBsYWlkID0gJ1BMQUlEJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgQ3VzdG9tZXIgPSAnQ1VTVE9NRVInLFxuICAgIEVuZFVzZXIgPSAnRU5EX1VTRVInXG59XG5cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgY29uc2VudCBldmVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnNlbnRFdmVudFR5cGUge1xuICAgIEdyYW50ZWQgPSAnQ09OU0VOVF9HUkFOVEVEJyxcbiAgICBSZXZva2VkID0gJ0NPTlNFTlRfUkVWT0tFRCcsXG4gICAgVXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnXG59XG5cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29uc2VudCBldmVudHMuXG4gICAgICogQHR5cGUge0FycmF5PENvbnNlbnRFdmVudD59XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXZlbnRzOiBBcnJheTxDb25zZW50RXZlbnQ+O1xufVxuLyoqXG4gKiBBIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zZW50ZWRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc2VudGVkQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseSBzdWJtaXR0ZWQgdmFsaWQgZGlzcHV0ZSBzdGF0ZW1lbnQgYnkgdGhlIGNvbnN1bWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZSB7XG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIEEgdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQpIG9mIHRoZSBjb25zdW1lciBkaXNwdXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyRGlzcHV0ZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIGRpc3B1dGVkIGZpZWxkIChlLmcuIHRyYW5zYWN0aW9uIGRhdGUpLCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgZGlzcHV0ZV9maWVsZF9jcmVhdGVfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lckRpc3B1dGVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRleHQgY29udGVudCBvZiBkaXNwdXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgc3RhdGVtZW50OiBzdHJpbmc7XG59XG4vKipcbiAqIFR5cGUgb2YgZGF0YSBiZWluZyBkaXNwdXRlZCBieSB0aGUgY29uc3VtZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5IHtcbiAgICBUcmFuc2FjdGlvbiA9ICdUUkFOU0FDVElPTicsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBJZGVudGl0eSA9ICdJREVOVElUWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NvbnN1bWVyX3JlcG9ydC9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcmVhc29uIHlvdSBhcmUgZ2VuZXJhdGluZyBhIENvbnN1bWVyIFJlcG9ydCBmb3IgdGhpcyB1c2VyLiBXaGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBQbGFpZCBDaGVjayAoQ1JBKSBwcm9kdWN0czsgaW52YWxpZCBpZiBub3QgdXNpbmcgUGxhaWQgQ2hlY2sgKENSQSkgcHJvZHVjdHMuICBgQUNDT1VOVF9SRVZJRVdfQ1JFRElUYDogSW4gY29ubmVjdGlvbiB3aXRoIGEgY29uc3VtZXIgY3JlZGl0IHRyYW5zYWN0aW9uIGZvciB0aGUgcmV2aWV3IG9yIGNvbGxlY3Rpb24gb2YgYW4gYWNjb3VudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEEpLiAgYEFDQ09VTlRfUkVWSUVXX05PTl9DUkVESVRgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgb2YgdGhlIGluZm9ybWF0aW9uIHRvIHJldmlldyBhIG5vbi1jcmVkaXQgYWNjb3VudCBwcm92aWRlZCBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uc3VtZXIgY29udGludWVzIHRvIG1lZXQgdGhlIHRlcm1zIG9mIHRoZSBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoRikoMikuICBgRVhURU5TSU9OX09GX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNyZWRpdCB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgYnkgYW5kIGludm9sdmluZyB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gIGBMRUdJVElNQVRFX0JVU0lORVNTX05FRURfVEVOQU5UX1NDUkVFTklOR2A6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIHB1cnBvc2VzIGluIGNvbm5lY3Rpb24gd2l0aCBhIHByb3BlcnR5IHJlbnRhbCBhc3Nlc3NtZW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoRikoaSkuICBgTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX09USEVSYDogRm9yIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBuZWVkIGluIGNvbm5lY3Rpb24gd2l0aCBhIGJ1c2luZXNzIHRyYW5zYWN0aW9uIG1hZGUgcHJpbWFyaWx5IGZvciBwZXJzb25hbCwgZmFtaWx5LCBvciBob3VzZWhvbGQgaW5pdGlhdGVkIGJ5IHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEYpKGkpLiAgYFdSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHRvIGV2YWx1YXRlIGFuIGFwcGxpY2F0aW9uXFwncyBwcm9maWxlIHRvIG1ha2UgYW4gb2ZmZXIgdG8gdGhlIGNvbnN1bWVyLiAgYFdSSVRURU5fSU5TVFJVQ1RJT05fT1RIRVJgOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCBzdWNoIGFzIHdoZW4gYW4gaW5kaXZpZHVhbCBhZ3JlZXMgdG8gYWN0IGFzIGEgZ3VhcmFudG9yIG9yIGFzc3VtZXMgcGVyc29uYWwgbGlhYmlsaXR5IGZvciBhIGNvbnN1bWVyLCBidXNpbmVzcywgb3IgY29tbWVyY2lhbCBsb2FuLiAgYEVMSUdJQklMSVRZX0ZPUl9HT1ZUX0JFTkVGSVRTYDogIEluIGNvbm5lY3Rpb24gd2l0aCBhbiBlbGlnaWJpbGl0eSBkZXRlcm1pbmF0aW9uIGZvciBhIGdvdmVybm1lbnQgYmVuZWZpdCB3aGVyZSB0aGUgZW50aXR5IGlzIHJlcXVpcmVkIHRvIGNvbnNpZGVyIGFuIGFwcGxpY2FudFxcJ3MgZmluYW5jaWFsIHN0YXR1cyBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2Uge1xuICAgIEFjY291bnRSZXZpZXdDcmVkaXQgPSAnQUNDT1VOVF9SRVZJRVdfQ1JFRElUJyxcbiAgICBBY2NvdW50UmV2aWV3Tm9uQ3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX05PTl9DUkVESVQnLFxuICAgIEV4dGVuc2lvbk9mQ3JlZGl0ID0gJ0VYVEVOU0lPTl9PRl9DUkVESVQnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRUZW5hbnRTY3JlZW5pbmcgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkcnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRPdGhlciA9ICdMRUdJVElNQVRFX0JVU0lORVNTX05FRURfT1RIRVInLFxuICAgIFdyaXR0ZW5JbnN0cnVjdGlvblByZXF1YWxpZmljYXRpb24gPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9QUkVRVUFMSUZJQ0FUSU9OJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25PdGhlciA9ICdXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSJyxcbiAgICBFbGlnaWJpbGl0eUZvckdvdnRCZW5lZml0cyA9ICdFTElHSUJJTElUWV9GT1JfR09WVF9CRU5FRklUUydcbn1cblxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBieSBpbnRlZ3JhdGlvbnMgY3JlYXRlZCBiZWZvcmUgRGVjZW1iZXIgMTAsIDIwMjUuIEFsbCBvdGhlciBpbnRlZ3JhdGlvbnMgbXVzdCB1c2UgdGhlIGBpZGVudGl0eWAgb2JqZWN0IGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS4gVG8gY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGZvciBhIHVzZXIgd2hlbiB1c2luZyBhIGB1c2VyX3Rva2VuYCwgdGhpcyBmaWVsZCBtdXN0IGJlIHByZXNlbnQuIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkIGR1cmluZyB1c2VyIHRva2VuIGNyZWF0aW9uLCB5b3UgY2FuIGFkZCBpdCB0byB0aGUgdXNlciBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiBPbmNlIHRoZSBmaWVsZCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgdXNlciwgeW91IHdpbGwgYmUgYWJsZSB0byBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYSBub24tZW1wdHkgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCAod2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCksIG9yIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgZm9yIHRoYXQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGZpcnN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBsYXN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTU3NDUyMTMwXFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuIFBob25lIG51bWJlciBpbnB1dCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZnVsbCBTb2NpYWwgU2VjdXJpdHkgbnVtYmVyLiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHByb3ZpZGVkIGJ5IGxlbmRlcnMgaW50ZW5kaW5nIHRvIHNoYXJlIHRoZSByZXN1bHRpbmcgY29uc3VtZXIgcmVwb3J0IHdpdGggYSBHb3Zlcm5tZW50LVNwb25zb3JlZCBFbnRlcnByaXNlIChHU0UpLCBzdWNoIGFzIEZhbm5pZSBNYWUgb3IgRnJlZGRpZSBNYWMuICBGb3JtYXQ6IFxcXCJkZGQtZGQtZGRkZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHNzbl9mdWxsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCA0IGRpZ2l0cyBvZiB0aGUgdXNlclxcJ3MgU29jaWFsIFNlY3VyaXR5IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHNzbl9sYXN0XzQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcInl5eXktbW0tZGRcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGZvciBhbGwgUGxhaWQgQ2hlY2sgY3VzdG9tZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcHJpbWFyeV9hZGRyZXNzOiBBZGRyZXNzRGF0YTtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHkge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRuXFwndCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvblxcJ3Qga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSBpbiBFLjE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJzPzogQ291bnRlcnBhcnR5TnVtYmVycyB8IG51bGw7XG59XG4vKipcbiAqIEluc2lnaHRzIGFyb3VuZCBhIHVzZXJcXCdzIGNvdW50ZXJwYXJ0aWVzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIEluc2lnaHRzIHJlbGF0ZWQgdG8gYSB1c2VyXFwncyB0cmFuc2FjdGlvbnMgd2l0aCBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgZmluYW5jaWFsX2luc3RpdHV0aW9uX2luc2lnaHRzPzogQXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgYWJvdXQgYSB1c2VyXFwncyB0b3AgbWVyY2hhbnRzLCByYW5rZWQgYnkgc3BlbmQuXG4gICAgICogQHR5cGUge0FycmF5PE1lcmNoYW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1lcmNoYW50X2luc2lnaHRzPzogQXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIEFjY291bnQgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSwgd2hlbiBhdmFpbGFibGUuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IG9ubHkgZmlsbGVkIGluIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBpbiBFdXJvcGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHlOdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5TnVtYmVyc0JBQ1N9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzPzogQ291bnRlcnBhcnR5TnVtYmVyc0JBQ1MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlOdW1iZXJzSW50ZXJuYXRpb25hbH1cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBDb3VudGVycGFydHlOdW1iZXJzSW50ZXJuYXRpb25hbCB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciBhIFVLIGJhbmsgYWNjb3VudCB2aWEgQmFjcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ291bnRlcnBhcnR5TnVtYmVyc0JBQ1NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHlOdW1iZXJzQkFDUyB7XG4gICAgLyoqXG4gICAgICogVGhlIEJhY3MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eU51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEJhY3Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFjY291bnQgbnVtYmVycyB1c2luZyB0aGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIGFuZCBCSUMvU1dJRlQgY29kZSBmb3JtYXQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eU51bWJlcnNJbnRlcm5hdGlvbmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5TnVtYmVyc0ludGVybmF0aW9uYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSUJBTk51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW4/OiBOdW1iZXJzSUJBTk51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCdXNpbmVzcyBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoaXMgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eU51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYmljPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSB0eXBlLiAgYG1lcmNoYW50YDogYSBwcm92aWRlciBvZiBnb29kcyBvciBzZXJ2aWNlcyBmb3IgcHVyY2hhc2UgYGZpbmFuY2lhbF9pbnN0aXR1dGlvbmA6IGEgZmluYW5jaWFsIGVudGl0eSAoYmFuaywgY3JlZGl0IHVuaW9uLCBCTlBMLCBmaW50ZWNoKSBgcGF5bWVudF9hcHBgOiBhIHRyYW5zZmVyIG9yIFAyUCBhcHAgKGUuZy4gWmVsbGUpIGBtYXJrZXRwbGFjZWA6IGEgbWFya2V0cGxhY2UgKGUuZy4gRG9vckRhc2gsIEdvb2dsZSBQbGF5IFN0b3JlKSBgcGF5bWVudF90ZXJtaW5hbGA6IGEgcG9pbnQtb2Ytc2FsZSBwYXltZW50IHRlcm1pbmFsIChlLmcuIFNxdWFyZSwgVG9hc3QpIGBpbmNvbWVfc291cmNlYDogdGhlIHBheWVyIGluIGFuIGluY29tZSB0cmFuc2FjdGlvbiAoZS5nLiwgYW4gZW1wbG95ZXIsIGNsaWVudCwgb3IgZ292ZXJubWVudCBhZ2VuY3kpXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb3VudGVycGFydHlUeXBlIHtcbiAgICBNZXJjaGFudCA9ICdtZXJjaGFudCcsXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb24gPSAnZmluYW5jaWFsX2luc3RpdHV0aW9uJyxcbiAgICBQYXltZW50QXBwID0gJ3BheW1lbnRfYXBwJyxcbiAgICBNYXJrZXRwbGFjZSA9ICdtYXJrZXRwbGFjZScsXG4gICAgUGF5bWVudFRlcm1pbmFsID0gJ3BheW1lbnRfdGVybWluYWwnLFxuICAgIEluY29tZVNvdXJjZSA9ICdpbmNvbWVfc291cmNlJ1xufVxuXG4vKipcbiAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb3VudHJ5Q29kZSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIEdiID0gJ0dCJyxcbiAgICBFcyA9ICdFUycsXG4gICAgTmwgPSAnTkwnLFxuICAgIEZyID0gJ0ZSJyxcbiAgICBJZSA9ICdJRScsXG4gICAgQ2EgPSAnQ0EnLFxuICAgIERlID0gJ0RFJyxcbiAgICBJdCA9ICdJVCcsXG4gICAgUGwgPSAnUEwnLFxuICAgIERrID0gJ0RLJyxcbiAgICBObyA9ICdOTycsXG4gICAgU2UgPSAnU0UnLFxuICAgIEVlID0gJ0VFJyxcbiAgICBMdCA9ICdMVCcsXG4gICAgTHYgPSAnTFYnLFxuICAgIFB0ID0gJ1BUJyxcbiAgICBCZSA9ICdCRScsXG4gICAgQXQgPSAnQVQnLFxuICAgIEZpID0gJ0ZJJ1xufVxuXG4vKipcbiAqIE1vZGVsZWQgZXN0aW1hdGUgb2YgdGhlIGFubnVhbCBpbmNvbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUFubnVhbEluY29tZVZhbHVlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUFubnVhbEluY29tZVZhbHVlcyB7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgSW5jb21lIG1vZGVsZWQgZnJvbSB0cmVuZHMgb2Ygb2JzZXJ2ZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUFubnVhbEluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIGdyb3NzX2luY29tZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE5ldCBJbmNvbWUgZXN0aW1hdGVkIGZyb20gb2JzZXJ2ZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUFubnVhbEluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIG5ldF9pbmNvbWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBleHRyYWN0ZWQgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGJvbnVzIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiByZXByZXNlbnRzLCBpZiBpdCBpcyBhIGJvbnVzLiBgQk9OVVNfSU5DTFVERURgOiBCb251cyBpcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uIGFsb25nIHdpdGggdGhlIG5vcm1hbCBwYXkgYEJPTlVTX09OTFlgOiBUaGlzIHRyYW5zYWN0aW9uIGlzIGEgc3RhbmRhbG9uZSBib251c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZUJvbnVzVHlwZSB7XG4gICAgQm9udXNJbmNsdWRlZCA9ICdCT05VU19JTkNMVURFRCcsXG4gICAgQm9udXNPbmx5ID0gJ0JPTlVTX09OTFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogQ3JlZGl0QmFua0luY29tZUVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBFcnJvciBmaWVsZHMgd2lsbCBiZSBgbnVsbGAgaWYgbm8gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gbnVsbCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ/OiBDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDUkFfSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBwZXJpb2QgaW5jbHVkZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgdGhlIGluY29tZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJbmNvbWVQcm92aWRlclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5jb21lIHByb3ZpZGVyIG5hbWUgaXMgbm9ybWFsaXplZCBieSBjb21wYXJpbmcgaXQgYWdhaW5zdCBhIGNhbm9uaWNhbCBzZXQgb2Yga25vd24gcHJvdmlkZXJzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSW5jb21lUHJvdmlkZXJcbiAgICAgKi9cbiAgICBpc19ub3JtYWxpemVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgYmFuayBpbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBWMSAoSUkxKSBmaWVsZC4gRm9yIHRoZSBWMiAoSUkyKSBlcXVpdmFsZW50LCB1c2UgdGhlIGBhY2NvdW50c2AgZmllbGQuIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgYmFuayBpbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2FjY291bnRzOiBBcnJheTxDcmFCYW5rSW5jb21lQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIFYxIChJSTEpIGZpZWxkLiBGb3IgdGhlIFYyIChJSTIpIGVxdWl2YWxlbnQsIHVzZSB0aGUgcmVwb3J0LWxldmVsIGBpbmNvbWVfc3RyZWFtc2AgZmllbGQuIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzOiBBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgd2l0aCB3aGljaCB0aGlzIGluY29tZSBzb3VyY2UgaXMgYXNzb2NpYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLiBJZiB0aGUgcmVwb3J0IGlzIHJlZ2VuZXJhdGVkIGFuZCBhIG5ldyBgcmVwb3J0X2lkYCBpcyBjcmVhdGVkLCB0aGUgbmV3IHJlcG9ydCB3aWxsIGhhdmUgYSBuZXcgc2V0IG9mIGBpbmNvbWVfc291cmNlX2lkYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIG5hbWUgb3Igb3JpZ2luYWwgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGluY29tZSB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3J5PzogQ3JlZGl0QmFua0luY29tZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBpbiB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGZvciB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgZm9yIHRoZSBpbmNvbWUgc291cmNlIHdpdGhpbiB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgZGF0ZSBvZiB0aGUgZW5kIHVzZXJcXCdzIG5leHQgcGF5Y2hlY2sgZm9yIHRoZSBpbmNvbWUgc291cmNlLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHN0YXR1cz86IENyYUJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3Rpb24gaW50ZXJ2YWwocykgZm9yIHRoZSBmb3JlY2FzdGVkIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUuXG4gICAgICogQHR5cGUge0FycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBmb3JlY2FzdGVkX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWVfcHJlZGljdGlvbl9pbnRlcnZhbHM6IEFycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lSW5jb21lUHJvdmlkZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfcHJvdmlkZXI6IENyYUJhbmtJbmNvbWVJbmNvbWVQcm92aWRlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBpbmNvbWUgc291cmNlcy4gYEFDVElWRWA6IFRoZSBpbmNvbWUgc291cmNlIGlzIGFjdGl2ZS4gYElOQUNUSVZFYDogVGhlIGluY29tZSBzb3VyY2UgaXMgaW5hY3RpdmUuIGBVTktOT1dOYDogVGhlIGluY29tZSBzb3VyY2Ugc3RhdHVzIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBJbmFjdGl2ZSA9ICdJTkFDVElWRScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYSBWMSAoSUkxKSBzY2hlbWEuIEZvciB0aGUgVjIgKElJMikgZXF1aXZhbGVudCwgdXNlIGBDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5YC4gU3VtbWFyeSBmb3IgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBncm9zcyBtb250aGx5IGluY29tZSBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBuZXQgYW1vdW50IGFuZCBpbmNvbWUgY2F0ZWdvcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLiBUaGUgYXZlcmFnZSBtb250aGx5IGluY29tZSBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBsaWZldGltZSBvZiB0aGUgaW5jb21lIHN0cmVhbSwgcmF0aGVyIHRoYW4gdGhlIGVudGlyZSBoaXN0b3JpY2FsIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGUgc2NvcGUgb2YgdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9ncm9zc19pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGFtb3VudCBlc3RpbWF0ZWQgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZGF0YSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuIFRoZSBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGxpZmV0aW1lIG9mIHRoZSBpbmNvbWUgc3RyZWFtLCByYXRoZXIgdGhhbiB0aGUgZW50aXJlIGhpc3RvcmljYWwgcGVyaW9kIGluY2x1ZGVkIGluIHRoZSBzY29wZSBvZiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3RlZCBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZm9yZWNhc3RlZF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYW5udWFsIGdyb3NzIGluY29tZSBmb3IgdGhlIGluY29tZSBzb3VyY2UsIGNhbGN1bGF0ZWQgYnkgbXVsdGlwbHlpbmcgdGhlIGBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9ncm9zc19pbmNvbWVgIGJ5IDEyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYW5udWFsX2dyb3NzX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGFubnVhbCBuZXQgaW5jb21lIGZvciB0aGUgaW5jb21lIHNvdXJjZSwgY2FsY3VsYXRlZCBieSBtdWx0aXBseWluZyB0aGUgYGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZWAgYnkgMTIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hbm51YWxfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgYW5udWFsIGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYW5udWFsX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiBUaGlzIGlzIGEgbGVnYWN5IGZpZWxkIHRoYXQgaXMgbm8gbG9uZ2VyIG1haW50YWluZWQuIEZvciBtZXJjaGFudCBuYW1lLCB1c2UgdGhlIGBtZXJjaGFudF9uYW1lYCBmaWVsZDsgZm9yIGRlc2NyaXB0aW9uLCB1c2UgdGhlIGBvcmlnaW5hbF9kZXNjcmlwdGlvbmAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQm9udXNUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBib251c190eXBlPzogQ3JhQmFua0luY29tZUJvbnVzVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmFCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyYUJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYFJFUE9SVF9ERUxFVEVEYDogUmVwb3J0IGRlbGV0ZWQgZHVlIHRvIGN1c3RvbWVyIG9yIGNvbnN1bWVyIHJlcXVlc3QgYERBVEFfVU5BVkFJTEFCTEVgOiBObyByZWxldmFudCBkYXRhIHdhcyBmb3VuZCBmb3IgdGhlIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZSB7XG4gICAgSWRlbnRpdHlVbmF2YWlsYWJsZSA9ICdJREVOVElUWV9VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIENhc2hmbG93IEluc2lnaHRzIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIGNhc2ggZmxvdyBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi4gVGhlIHNwZWNpZmljIGxpc3Qgb2YgYXR0cmlidXRlcyB3aWxsIGRlcGVuZCBvbiB0aGUgY2FzaCBmbG93IGF0dHJpYnV0ZXMgdmVyc2lvbiB1c2VkLiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXR0cmlidXRlcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IG9iamVjdDtcbn1cbi8qKlxuICogQmFzZVJlcG9ydEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9iYXNlX3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEcyB0byBpbmNsdWRlIGluIHRoZSBCYXNlIFJlcG9ydC4gSWYgbm90IHByb3ZpZGVkLCBhbGwgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHdpbGwgYmUgaW5jbHVkZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVVzZXJUaWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90aWVyPzogQ3JhVXNlclRpZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9iYXNlX3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGFycmF5IGNvbnRhaW5zIGFueSBpbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgb3IgYWxlcnRzIHJlbGF0ZWQgdG8gdGhlIEJhc2UgUmVwb3J0IHRoYXQgZGlkIG5vdCBibG9jayBnZW5lcmF0aW9uIG9mIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgQ2FzaGZsb3cgSW5zaWdodHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd0F0dHJpYnV0ZXNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zXG4gICAgICovXG4gICAgYXR0cmlidXRlc192ZXJzaW9uPzogQ2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jYXNoZmxvd19pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jYXNoZmxvd19pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBhIHN1YnNldCBvZiBkYXRhIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PENoZWNrUmVwb3J0V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+O1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBnZW5lcmF0ZSBhIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZUJhc2VSZXBvcnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBgY2xpZW50X3JlcG9ydF9pZGAgZmllbGQgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgcmVxdWVzdCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydEdTRU9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAgICAgKi9cbiAgICBnc2Vfb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0R1NFT3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHJlcG9ydCBtdXN0IGluY2x1ZGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uIElmIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoZSByZXBvcnQgd2lsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZUJhc2VSZXBvcnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWlyZV9pZGVudGl0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydEhvbWVMZW5kaW5nUmVwb3J0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9uc1xuICAgICAqL1xuICAgIGhvbWVfbGVuZGluZ19yZXBvcnRfb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIHRvIGdlbmVyYXRlIFBhcnRuZXIgSW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUGFydG5lckluc2lnaHRzT3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUGFydG5lckluc2lnaHRzT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUGFydG5lckluc2lnaHRzT3B0aW9uc1xuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVQYXJ0bmVySW5zaWdodHNPcHRpb25zXG4gICAgICovXG4gICAgZmljbz86IENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dCB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzdGluYXRpb24gVVJMIHRvIHdoaWNoIHdlYmhvb2tzIHdpbGwgYmUgc2VudCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIHJlcG9ydC4gRGVmYXVsdCB2YWx1ZSBpcyAzNjU7IG1heGltdW0gaXMgNzMxOyBtaW5pbXVtIGlzIDE4MC4gSWYgYSB2YWx1ZSBsb3dlciB0aGFuIDE4MCBpcyBwcm92aWRlZCwgYSBtaW5pbXVtIG9mIDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHJlcXVpcmVkIGZvciB0aGUgcmVwb3J0IHRvIGJlIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1aXJlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHdpbGwgYmUgZWFnZXJseSBnZW5lcmF0ZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVwb3J0IChpbiBhZGRpdGlvbiB0byB0aGUgQmFzZSBSZXBvcnQsIHdoaWNoIGlzIGFsd2F5cyBlYWdlcmx5IGdlbmVyYXRlZCkuIFRoZXNlIHByb2R1Y3RzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgYmVmb3JlIGEgc3VjY2VzcyB3ZWJob29rIGlzIHNlbnQuIFVzZSB0aGlzIG9wdGlvbiB0byBtaW5pbWl6ZSByZXNwb25zZSBsYXRlbmN5IGZvciBwcm9kdWN0IGAvZ2V0YCBlbmRwb2ludHMuIE5vdGUgdGhhdCBzcGVjaWZ5aW5nIGBjcmFfcGFydG5lcl9pbnNpZ2h0c2AgaW4gdGhpcyBmaWVsZCB3aWxsIHRyaWdnZXIgYSBiaWxsYWJsZSBldmVudC4gT3RoZXIgcHJvZHVjdHMgYXJlIG5vdCBiaWxsZWQgdW50aWwgdGhlIHJlc3BlY3RpdmUgcmVwb3J0cyBhcmUgZmV0Y2hlZCB2aWEgcHJvZHVjdC1zcGVjaWZpYyBgL2dldGAgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFzZV9yZXBvcnQ/OiBDcmFDaGVja1JlcG9ydENyZWF0ZUJhc2VSZXBvcnRPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2FzaGZsb3dfaW5zaWdodHM/OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVQYXJ0bmVySW5zaWdodHNPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXJ0bmVyX2luc2lnaHRzPzogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVQYXJ0bmVySW5zaWdodHNPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsZW5kX3Njb3JlPzogQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrX2luc2lnaHRzPzogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCBpbnZlc3RtZW50IGRhdGEgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBsaW5rZWQgYWNjb3VudChzKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnZlc3RtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jb21lX2luc2lnaHRzPzogQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldE9wdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U6IENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBDaGVjayBSZXBvcnQgaGFzIGZhaWxlZCB0byBnZW5lcmF0ZS4gVG8gZ2V0IG1vcmUgZGV0YWlscywgY2FsbCBgL3VzZXIvaXRlbXMvZ2V0YCBhbmQgY2hlY2sgZm9yIG5vbi1udWxsIGBlcnJvcmAgb2JqZWN0cyBvbiB0aGUgYXNzb2NpYXRlZCBJdGVtcyBpbiB0aGUgcmVzcG9uc2UuIFRoZXNlIGBlcnJvcmAgb2JqZWN0cyB3aWxsIGNvbnRhaW4gbW9yZSBkZXRhaWxzIG9uIHdoeSB0aGUgSXRlbSBpcyBpbiBhbiBlcnJvciBzdGF0ZSBhbmQgaG93IHRvIHJlc29sdmUgaXQuIEFmdGVyIHJlc29sdmluZyB0aGUgZXJyb3JzLCB5b3UgY2FuIHRyeSB0byByZS1nZW5lcmF0ZSB0aGUgcmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVF9GQUlMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgaXRlbV9pZHNgIGluY2x1ZGVkIGluIHRoZSBDaGVjayBSZXBvcnQuIEFjY2VzcyB0byB0aGlzIGZpZWxkIGlzIGluIGNsb3NlZCBiZXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChWT0EpIHNjaGVtYSB2ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgU2NoZW1hVmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgQmFzZSBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBzY2hlbWEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgTE9BTlM6IENyZWRpdEZyZWRkaWVNYWNMb2FucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1BhcnRpZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFBBUlRJRVM6IENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFNFUlZJQ0VTOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXM7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBjcmVhdGluZyByZXBvcnRzIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIEdTRXMgZm9yIG1vcnRnYWdlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRHU0VPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRHU0VPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hpY2ggdHlwZXMgb2YgcmVwb3J0cyBzaG91bGQgYmUgbWFkZSBhdmFpbGFibGUgdG8gR1NFcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8R1NFUmVwb3J0VHlwZT59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0R1NFT3B0aW9uc1xuICAgICAqL1xuICAgIHJlcG9ydF90eXBlczogQXJyYXk8R1NFUmVwb3J0VHlwZT47XG59XG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIEhvbWUgTGVuZGluZyBSZXBvcnQgKFZlcmlmaWNhdGlvbiBSZXBvcnQpIGdlbmVyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRIb21lTGVuZGluZ1JlcG9ydE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCB0eXBlcyBvZiBob21lIGxlbmRpbmcgcmVwb3J0cyB0byBnZW5lcmF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXBvcnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRIb21lTGVuZGluZ1JlcG9ydE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXBvcnRzX3JlcXVlc3RlZDogQXJyYXk8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXBvcnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zXG4gICAgICovXG4gICAgZW1wbG95bWVudF9yZWZyZXNoX29wdGlvbnM/OiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldEVtcGxveW1lbnRSZWZyZXNoT3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIGdlbmVyYXRlIEluY29tZSBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZUluc2lnaHRzRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY29tZV9pbnNpZ2h0c19maWx0ZXI/OiBJbmNvbWVJbnNpZ2h0c0ZpbHRlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZUluc2lnaHRzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNvbWVfaW5zaWdodHNfdmVyc2lvbjogSW5jb21lSW5zaWdodHNWZXJzaW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9pbmNvbWVfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9pbmNvbWVfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhSW5jb21lSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydD86IENyYUluY29tZUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEluY29tZSBJbnNpZ2h0cyBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBhIHN1YnNldCBvZiBkYXRhIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PENoZWNrUmVwb3J0V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPjtcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIExlbmRTY29yZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZExlbmRTY29yZVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGxlbmRfc2NvcmVfdmVyc2lvbj86IFBsYWlkTGVuZFNjb3JlVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2xlbmRfc2NvcmUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2xlbmRfc2NvcmUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMZW5kU2NvcmVSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IENyYUxlbmRTY29yZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgTGVuZFNjb3JlIGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGEgc3Vic2V0IG9mIGRhdGEgY291bGQgbm90IGJlIHJldHJpZXZlZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPjtcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgTmV0d29yayBJbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrSW5zaWdodHNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBuZXR3b3JrX2luc2lnaHRzX3ZlcnNpb24/OiBOZXR3b3JrSW5zaWdodHNWZXJzaW9uIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBOZXR3b3JrIEluc2lnaHRzIGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGEgc3Vic2V0IG9mIGRhdGEgY291bGQgbm90IGJlIHJldHJpZXZlZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPjtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIGluY2x1ZGUgb3RoZXIgcmVwb3J0cyBpbiB0aGUgUERGLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQREZBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8Q3JhUERGQWRkT25zPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQsIHNwZWNpZnkgYHBhcnRuZXJfaW5zaWdodHMucHJpc21fdmVyc2lvbnNgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnNEZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWQgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gdG8gZ2VuZXJhdGUgUGFydG5lciBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRQYXJ0bmVySW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFBhcnRuZXJJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc21fdmVyc2lvbnM/OiBQcmlzbVZlcnNpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzRmljb0lucHV0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGZpY28/OiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvSW5wdXQgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVXNlclRpZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdGllcj86IENyYVVzZXJUaWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRQYXJ0bmVySW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBhcnRuZXJfaW5zaWdodHM/OiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFBhcnRuZXJJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ/OiBDcmFQYXJ0bmVySW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIFBhcnRuZXIgSW5zaWdodHMgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgYSBzdWJzZXQgb2YgZGF0YSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBDaGVjayBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIHRoZSByZXBvcnQgd2lsbCBiZSBhdmFpbGFibGUgdG8gcmV0cmlldmUgZm9yIDI0IGhvdXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ0hFQ0tfUkVQT1JUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIHN1Y2Nlc3NmdWxseSBiZWVuIGdlbmVyYXRlZCBmb3IgdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHN1Y2Nlc3NmdWxfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGZhaWxlZCB0byBnZW5lcmF0ZSBmb3IgdGhlIHJlcG9ydC4gQWRkaXRpb25hbCBkZXRhaWwgb24gd2hhdCBjYXVzZWQgdGhlIGZhaWx1cmUgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcgdGhlIHByb2R1Y3QgL2dldCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGZhaWxlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBpdGVtX2lkc2AgaW5jbHVkZWQgaW4gdGhlIENoZWNrIFJlcG9ydC4gQWNjZXNzIHRvIHRoaXMgZmllbGQgaXMgaW4gY2xvc2VkIGJldGEuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlZmluZXMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRW1wbG95bWVudCBSZWZyZXNoIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldEVtcGxveW1lbnRSZWZyZXNoT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBhbiBFbXBsb3ltZW50IFJlZnJlc2ggUmVwb3J0IGlzIHJlcXVlc3RlZC4gTWF4aW11bSBpcyA3MzEuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBUeXBlIG9mIGhvbWUgbGVuZGluZyByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcG9ydFR5cGUge1xuICAgIFZvYSA9ICdWT0EnLFxuICAgIEVtcGxveW1lbnRSZWZyZXNoID0gJ0VNUExPWU1FTlRfUkVGUkVTSCcsXG4gICAgSW5jb21lID0gJ0lOQ09NRSdcbn1cblxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIHR5cGVzIG9mIGhvbWUgbGVuZGluZyByZXBvcnRzIGFyZSBleHBlY3RlZCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXBvcnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0c19yZXF1ZXN0ZWQ6IEFycmF5PENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVwb3J0VHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0RW1wbG95bWVudFJlZnJlc2hPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X3JlZnJlc2hfb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0RW1wbG95bWVudFJlZnJlc2hPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBDcmFWZXJpZmljYXRpb25SZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGhvbWUgbGVuZGluZyByZXBvcnQgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgYSBzdWJzZXQgb2YgZGF0YSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+O1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vcGRmL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZlJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmVwb3J0X3JlcXVlc3RlZD86IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hpY2ggdHlwZXMgb2YgdmVyaWZpY2F0aW9uIHJlcG9ydHMgdG8gaW5jbHVkZSBpbiB0aGUgcmV0dXJuZWQgUERGLiBTdXBwb3J0ZWQgY29tYmluYXRpb25zIGFyZTogYFt2b2FdYCwgYFtlbXBsb3ltZW50X3JlZnJlc2hdYCwgYFtpbmNvbWVdYCwgb3IgYFt2b2EsIGluY29tZV1gLiBPdGhlciBjb21iaW5hdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuIFxuICAgICAqIEB0eXBlIHtTZXQ8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZSZXBvcnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0c19yZXF1ZXN0ZWQ/OiBTZXQ8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZSZXBvcnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIHZlcmlmaWNhdGlvbiBQREYgcmVwb3J0IHRvIGZldGNoLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZSZXBvcnRUeXBlIHtcbiAgICBWb2EgPSAndm9hJyxcbiAgICBFbXBsb3ltZW50UmVmcmVzaCA9ICdlbXBsb3ltZW50X3JlZnJlc2gnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnXG59XG5cbi8qKlxuICogVGhlIGlucXVpcnkgdHlwZSBvZiBjcmVkaXQgcHJvZmlsZSByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFDcmVkaXRQcm9maWxlSW5xdWlyeVR5cGUge1xuICAgIFNvZnRJbnF1aXJ5ID0gJ1NPRlRfSU5RVUlSWScsXG4gICAgU3RhbmRhcmRJbnF1aXJ5ID0gJ1NUQU5EQVJEX0lOUVVJUlknXG59XG5cbi8qKlxuICogQW4gaW5kaXZpZHVhbCBMZW5kU2NvcmUgcmVzdWx0IHdpdGhpbiBhIGNyZWRpdCBwcm9maWxlIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ3JlZGl0UHJvZmlsZUxlbmRTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVMZW5kU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSB0aGUgTGVuZFNjb3JlIG1vZGVsLiBXaWxsIGJlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDEgdG8gOTkuIEhpZ2hlciBzY29yZXMgaW5kaWNhdGUgbG93ZXIgY3JlZGl0IHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZUxlbmRTY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgTGVuZFNjb3JlLiBGb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgcmVhc29uIGNvZGVzIGFuZCBhIG1hcHBpbmcgb2YgcmVhc29uIGNvZGVzIHRvIGh1bWFuLXJlYWRhYmxlIHJlYXNvbnMsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuIERpZmZlcmVudCBMZW5kU2NvcmUgdmVyc2lvbnMgd2lsbCB1c2UgZGlmZmVyZW50IHNldHMgb2YgcmVhc29uIGNvZGVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlTGVuZFNjb3JlXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB2YXJpYW50IGlkZW50aWZpZXIgZm9yIHRoaXMgTGVuZFNjb3JlIHJlc3VsdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlTGVuZFNjb3JlXG4gICAgICovXG4gICAgdmFyaWFudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgTGVuZFNjb3JlIGNvdWxkIG5vdCBiZSBjb21wdXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlTGVuZFNjb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIENyZWRpdCBQcm9maWxlIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIHJlcG9ydCB3YXMgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX3JldHJpZXZlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDcmVkaXRQcm9maWxlSW5xdWlyeVR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRcbiAgICAgKi9cbiAgICBpbnF1aXJ5X3R5cGU6IENyYUNyZWRpdFByb2ZpbGVJbnF1aXJ5VHlwZTtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGVuZFNjb3JlIHJlc3VsdHMgZm9yIHRoZSBjcmVkaXQgcHJvZmlsZSByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyYUNyZWRpdFByb2ZpbGVMZW5kU2NvcmU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0XG4gICAgICovXG4gICAgbGVuZF9zY29yZXM6IEFycmF5PENyYUNyZWRpdFByb2ZpbGVMZW5kU2NvcmU+O1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIGNhc2ggZmxvdyBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi4gVGhlIHNwZWNpZmljIGxpc3Qgb2YgYXR0cmlidXRlcyB3aWxsIGRlcGVuZCBvbiB0aGUgY2FzaCBmbG93IGF0dHJpYnV0ZXMgdmVyc2lvbiB1c2VkLiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXR0cmlidXRlcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRcbiAgICAgKi9cbiAgICBjYXNoZmxvd19pbnNpZ2h0c19hdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgbmV0d29yayBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi4gRm9yIGEgZnVsbCBsaXN0IG9mIGF0dHJpYnV0ZXMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0XG4gICAgICovXG4gICAgbmV0d29ya19pbnNpZ2h0c19hdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY3JlZGl0X3Byb2ZpbGUvcmVwb3J0L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZTogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDcmVkaXRQcm9maWxlUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNyZWRpdFByb2ZpbGVJbnF1aXJ5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnF1aXJ5X3R5cGU6IENyYUNyZWRpdFByb2ZpbGVJbnF1aXJ5VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdmVyc2lvbjogQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFZlcnNpb247XG59XG4vKipcbiAqIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NyZWRpdF9wcm9maWxlL3JlcG9ydC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDcmVkaXRQcm9maWxlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IENyYUNyZWRpdFByb2ZpbGVSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSByZXBvcnQgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgYSBzdWJzZXQgb2YgZGF0YSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPjtcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIENSQSBDcmVkaXQgUHJvZmlsZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBpdGVtcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGl0ZW1fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHByaW1hcnkgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcmltYXJ5X2FjY291bnRfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlcG9zaXRvcnkgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRfdHlwZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY3JlZGl0IGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydE1ldGFkYXRhXG4gICAgICovXG4gICAgY3JlZGl0X2FjY291bnRfdHlwZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb3RoZXIgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBvdGhlcl9hY2NvdW50X3R5cGVfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGFjY291bnRzIHdpdGggbXVsdGlwbGUgb3duZXJzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydE1ldGFkYXRhXG4gICAgICovXG4gICAgbXVsdGlwbGVfb3duZXJfYWNjb3VudF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RyYW5zYWN0aW9uX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHByb2R1Y3QgdHlwZSBmb3IgdGhlIGNyZWRpdCBwcm9maWxlIHJlcG9ydCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFR5cGUge1xuICAgIFF1YWxpZnkgPSAnUVVBTElGWSdcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IHRvIHJldHJpZXZlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFZlcnNpb24ge1xuICAgIFYxID0gJ3YxJ1xufVxuXG4vKipcbiAqIE1vZGVsZWQgZXN0aW1hdGUgb2YgY3VycmVudCBpbmNvbWUgYmFzZWQgb24gcmVjZW50bHkgb2JzZXJ2ZWQgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ3VycmVudE1vZGVsZWRJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDdXJyZW50TW9kZWxlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYU1vbnRobHlJbmNvbWVWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUN1cnJlbnRNb2RlbGVkSW5jb21lXG4gICAgICovXG4gICAgbW9udGhseTogQ3JhTW9udGhseUluY29tZVZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQW5udWFsSW5jb21lVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDdXJyZW50TW9kZWxlZEluY29tZVxuICAgICAqL1xuICAgIGFubnVhbDogQ3JhQW5udWFsSW5jb21lVmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQgd2FzIGNyZWF0ZWQsIGluIElTTyA4NjAxIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCB0aGUgRW1wbG95bWVudCBSZWZyZXNoIFJlcG9ydCBjb3ZlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0SXRlbT47XG59XG4vKipcbiAqIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBmb3IgdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuIE5vdGUgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGRpZmZlcnMgZnJvbSBhIEJhc2UgUmVwb3J0IHRyYW5zYWN0aW9uIGluIHRoYXQgaXQgd2lsbCBvbmx5IGJlIGRlcG9zaXRzLCBhbmQgdGhlIGFtb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBJdGVtIHdpdGhpbiBhbiBFbXBsb3ltZW50IFJlZnJlc2ggUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgZWFjaCBvZiB0aGUgYWNjb3VudHMgb3BlbiBvbiB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZV90aW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuIE5vdGUgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGRpZmZlcnMgZnJvbSBhIEJhc2UgUmVwb3J0IHRyYW5zYWN0aW9uIGluIHRoYXQgaXQgd2lsbCBvbmx5IGJlIGRlcG9zaXRzLCBhbmQgdGhlIGFtb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkgZm9yIGEgZ2l2ZW4gc3RyZWFtLiBUaGUgc3RyZWFtcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGVzZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgaW5jb21lIGNhdGVnb3JpZXMuICBTZWUgdGhlIFtJbmNvbWUgVjIgQ2F0ZWdvcnkgVGF4b25vbXldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9pbmNvbWUtdjItY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgaW5jb21lIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lQ2F0ZWdvcnkge1xuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgc3RyZWFtXFwncyBpbnRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIENoZWNrIEluY29tZSBJbnNpZ2h0cyBSZXBvcnQgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFJbmNvbWVJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUluY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIENoZWNrIEluY29tZSBJbnNpZ2h0cyBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgQ2hlY2sgSW5jb21lIEluc2lnaHRzIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHVzZXJfc3VtbWFyeT86IENyYUluY29tZUluc2lnaHRzVXNlclN1bW1hcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGluY29tZSBzdHJlYW1zIGZvciB0aGlzIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyYUluY29tZVN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX3N0cmVhbXM6IEFycmF5PENyYUluY29tZVN0cmVhbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmFCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIG9iamVjdCB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogQWdncmVnYXRlZCBzdW1tYXJ5IG9mIGFsbCBpbmNvbWUgc3RyZWFtcyBmb3IgdGhpcyB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lSW5zaWdodHNVc2VyU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhIHVzZXJcXCdzIGFnZ3JlZ2F0ZWQgaW5jb21lIG1ldHJpY3MgZm9yIGVhY2ggY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyYUluY29tZU1ldHJpY3M+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX21ldHJpY3M6IEFycmF5PENyYUluY29tZU1ldHJpY3M+O1xufVxuLyoqXG4gKiBNb2RlbGVkIGluY29tZSBtZXRyaWNzIGZvciBhIGdpdmVuIGluY29tZSBzdHJlYW0gb3IgdXNlciBzdW1tYXJ5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFJbmNvbWVNZXRyaWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lTWV0cmljcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUN1cnJlbnRNb2RlbGVkSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVNZXRyaWNzXG4gICAgICovXG4gICAgY3VycmVudDogQ3JhQ3VycmVudE1vZGVsZWRJbmNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQcm9qZWN0ZWRNb2RlbGVkSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVNZXRyaWNzXG4gICAgICovXG4gICAgcHJvamVjdGVkOiBDcmFQcm9qZWN0ZWRNb2RlbGVkSW5jb21lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lTWV0cmljc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZU1ldHJpY3NcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE1ldGFkYXRhIG9mIHRoZSBpbmNvbWUgc3RyZWFtXFwncyBuZXh0IHBheW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZU5leHRQYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lTmV4dFBheW1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCBkYXRlIG9mIHRoZSBpbmNvbWUgc3RyZWFtXFwncyBuZXh0IHBheW1lbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVOZXh0UGF5bWVudFxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gaW5jb21lIHN0cmVhbSBkZXRlY3RlZCBmb3IgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZVN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUluY29tZVN0cmVhbSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHN0cmVhbS4gSWYgdGhlIHJlcG9ydCBpcyByZWdlbmVyYXRlZCBhbmQgYSBuZXcgYHJlcG9ydF9pZGAgaXMgY3JlYXRlZCwgdGhlIG5ldyByZXBvcnQgd2lsbCBoYXZlIGEgbmV3IHNldCBvZiBgaW5jb21lX3N0cmVhbV9pZGBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIGluY29tZV9zdHJlYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzdHJlYW0gZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc3RyZWFtIGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgaW5zaWdodHM6IENyYUluY29tZVN0cmVhbUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVNZXRyaWNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBpbmNvbWVfbWV0cmljczogQ3JhSW5jb21lTWV0cmljcztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBpbmNvbWUgc3RyZWFtIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUluY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDcmFJbmNvbWVUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIE1vZGVsZWQgaW5zaWdodHMgZm9yIGEgZ2l2ZW4gaW5jb21lIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhSW5jb21lU3RyZWFtSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUluY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeTogQ3JhSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVN0cmVhbUluc2lnaHRzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9wcm92aWRlcjogQ3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtSW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyYUJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUluY29tZU5leHRQYXltZW50fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5leHRfcGF5bWVudDogQ3JhSW5jb21lTmV4dFBheW1lbnQgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYW4gaW5jb21lIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVUcmFuc2FjdGlvbk91dGxpZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3V0bGllcjogQ3JhSW5jb21lVHJhbnNhY3Rpb25PdXRsaWVyO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBvbiB3aGV0aGVyIHRoaXMgaW5jb21lIHRyYW5zYWN0aW9uIGlzIGFuIG91dGxpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZVRyYW5zYWN0aW9uT3V0bGllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUluY29tZVRyYW5zYWN0aW9uT3V0bGllciB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gaW5jb21lIHRyYW5zYWN0aW9uIGFtb3VudCBpcyB1bnVzdWFsbHkgaGlnaCBjb21wYXJlZCB0byB0aGUgYW1vdW50cyBmb3IgdGhhdCBzdHJlYW0uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uT3V0bGllclxuICAgICAqL1xuICAgIGlzX291dGxpZXI6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB0cmFuc2FjdGlvbiBkaWZmZXJzIGZyb20gdGhlIHN0cmVhbSBhdmVyYWdlIHRyYW5zYWN0aW9uIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVUcmFuc2FjdGlvbk91dGxpZXJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIExlbmRTY29yZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxlbmRTY29yZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxlbmRTY29yZVJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMZW5kU2NvcmVSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMZW5kU2NvcmVSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMZW5kU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYUxlbmRTY29yZVJlcG9ydFxuICAgICAqL1xuICAgIGxlbmRfc2NvcmU/OiBMZW5kU2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4gYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBhcHBsaWNhdGlvbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHR5cGU6IENyYUxvYW5UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuQXBwbGljYXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb246IENyYUxvYW5BcHBsaWNhdGlvbkRlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB1c2VyIGFwcGxpZWQgZm9yIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIGxvYW4gYXBwbGljYXRpb25cXCdzIGRlY2lzaW9uIHdhcyBtYWRlLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbl9kYXRlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGVjaXNpb24gb2YgdGhlIGxvYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuQXBwbGljYXRpb25EZWNpc2lvbiB7XG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIERlY2xpbmVkID0gJ0RFQ0xJTkVEJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgc3RhdHVzIGFuZCBkYXRlIGluZm9ybWF0aW9uIG9mIHRoZSBsb2FuIHdoZW4gdW5yZWdpc3RlcmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbkNsb3NlZFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5DbG9zZWRTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQ2xvc2VkU3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkNsb3NlZFN0YXR1c1xuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXR1cyBhbmQgZGF0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgbG9hbiB3aGVuIHJlZ2lzdGVyaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuT3BlbmVkU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hbk9wZW5lZFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5PcGVuZWRTdGF0dXNcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyYUxvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGVmZmVjdGl2ZSBkYXRlIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuT3BlbmVkU3RhdHVzXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyB0aGUgcGF5bWVudCBpbmZvcm1hdGlvbiBmb3IgYSBsb2FuIHBheW1lbnQgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuUGF5bWVudEhpc3Rvcnkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCB0byBpZGVudGlmeSB0aGUgbG9hblxcJ3MgcGF5bWVudCBwZXJpb2QsIHN0YXJ0aW5nIGZyb20gMS4gRm9yIGV4YW1wbGU6ICAgMSBtZWFucyB0aGUgcGVyaW9kIGJldHdlZW4gdGhlIGxvYW5cXCdzIG9wZW5pbmcgZGF0ZSBhbmQgdGhlIDFzdCBwYXltZW50IGR1ZSBkYXRlLiAgIDIgbWVhbnMgdGhlIHBlcmlvZCBiZXR3ZWVuIHRoZSBsb2FuXFwncyAxc3QgcGF5bWVudCBkdWUgZGF0ZSBhbmQgMm5kIHBheW1lbnQgZHVlIGRhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gICAgICovXG4gICAgcGVyaW9kOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgZHVlIGRhdGUgb3IgZW5kIGRhdGUgb2YgdGhlIHBheW1lbnQgcGVyaW9kLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBkdWVfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB0aGUgbG9hbiB3YXMgZGVsaW5xdWVudCBhdCB0aGUgZW5kIG9mIHRoZSBwYXkgcGVyaW9kLiBJZiBzcGVjaWZpZWQsIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBkYXlzX3Bhc3RfZHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBwYXN0IGR1ZSBvciB0aGUgY2hhcmdlLW9mZiBhbW91bnQgb2YgdGhlIGxvYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGF5bWVudCBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gICAgICovXG4gICAgYW1vdW50X3Bhc3RfZHVlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYWxhbmNlIHJlbWFpbmluZyBvbiB0aGUgbG9hbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXltZW50IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBiYWxhbmNlX3JlbWFpbmluZz86IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiBhIGxvYW5cXCdzIHBheW1lbnQgc2NoZWR1bGUuIGBCSVdFRUtMWWAgcmVwcmVzZW50cyBvbmUgcGF5bWVudCBldmVyeSB0d28gd2Vla3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuUGF5bWVudFNjaGVkdWxlIHtcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgUXVhcnRlcmx5ID0gJ1FVQVJURVJMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGxvYW4gZGF0YSB0byByZWdpc3Rlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBmb3IgdGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2FuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9hbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGxvYW5faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIHR5cGU6IENyYUxvYW5UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuUGF5bWVudFNjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3NjaGVkdWxlOiBDcmFMb2FuUGF5bWVudFNjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSBsb2FuIGFjY291bnQgd2FzIG9wZW5lZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbk9wZW5lZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX3dpdGhfc3RhdHVzOiBDcmFMb2FuT3BlbmVkU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgdGhlIGFwcHJvdmVkIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgbG9hbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbj86IENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEgdG8gcmVnaXN0ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgYXBwbGljYXRpb25faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhlIHVzZXIgYXBwbGllZCBmb3IgdGhlIGxvYW4uIFRoZSBkYXRlIHNob3VsZCBiZSBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fZGF0ZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUxvYW5TdGF0dXMge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCcsXG4gICAgQm9va2VkID0gJ0JPT0tFRCcsXG4gICAgQ3VycmVudCA9ICdDVVJSRU5UJyxcbiAgICBEZWxpbnF1ZW50ID0gJ0RFTElOUVVFTlQnLFxuICAgIERlZmF1bHQgPSAnREVGQVVMVCcsXG4gICAgQ2hhcmdlZE9mZiA9ICdDSEFSR0VEX09GRicsXG4gICAgVHJhbnNmZXJyZWQgPSAnVFJBTlNGRVJSRUQnLFxuICAgIFBhaWRPZmYgPSAnUEFJRF9PRkYnLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0dXMgYW5kIGRhdGUgb2YgYW4gdXBkYXRlIHRvIHRoZSBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5TdGF0dXNIaXN0b3J5VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyYUxvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGVmZmVjdGl2ZSBkYXRlIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgbG9hbiB0aGUgdXNlciBhcHBsaWVkIGZvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUxvYW5UeXBlIHtcbiAgICBQZXJzb25hbCA9ICdQRVJTT05BTCcsXG4gICAgQ3JlZGl0Q2FyZCA9ICdDUkVESVRfQ0FSRCcsXG4gICAgQnVzaW5lc3MgPSAnQlVTSU5FU1MnLFxuICAgIE1vcnRnYWdlID0gJ01PUlRHQUdFJyxcbiAgICBBdXRvID0gJ0FVVE8nLFxuICAgIFBheWRheSA9ICdQQVlEQVknLFxuICAgIFN0dWRlbnQgPSAnU1RVREVOVCcsXG4gICAgSG9tZUVxdWl0eSA9ICdIT01FX0VRVUlUWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgbG9hbiBkYXRhIGZvciB0aGUgbG9hbiBiZWluZyB1bnJlZ2lzdGVyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblVucmVnaXN0ZXIge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgbG9hbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBsb2FuX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5DbG9zZWRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5VbnJlZ2lzdGVyXG4gICAgICovXG4gICAgY2xvc2VkX3dpdGhfc3RhdHVzOiBDcmFMb2FuQ2xvc2VkU3RhdHVzO1xufVxuLyoqXG4gKiBDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVucmVnaXN0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgbG9hbiBkYXRhIHRvIHVwZGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VcGRhdGUge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgbG9hbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVwZGF0ZVxuICAgICAqL1xuICAgIGxvYW5faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0YXR1cyB1cGRhdGUgaGlzdG9yeSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzX2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIHVwZGF0ZXMgdG8gdGhlIHBheW1lbnQgaGlzdG9yeSBmb3IgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge0FycmF5PENyYUxvYW5QYXltZW50SGlzdG9yeT59XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5VcGRhdGVcbiAgICAgKi9cbiAgICBwYXltZW50X2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuUGF5bWVudEhpc3Rvcnk+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGxvYW4gYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q3JhTG9hbkFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy9yZWdpc3RlcmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdW5yZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblVucmVnaXN0ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VbnJlZ2lzdGVyPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdXBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuVXBkYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VcGRhdGU+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U6IE1vbml0b3JpbmdDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhIFVzZXIgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9pbnNpZ2h0c19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIE1vbml0b3JpbmcgSW5zaWdodHMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBNb25pdG9yaW5nIEluc2lnaHRzIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHNwZWNpZmljIGluc2lnaHRzIHdlcmUgZ2VuZXJhdGVkIChwZXItaXRlbSksIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgZGF0ZV9nZW5lcmF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zaWdodHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zaWdodHM6IE1vbml0b3JpbmdJbnNpZ2h0cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEJhc2VSZXBvcnRBY2NvdW50Pjtcbn1cbi8qKlxuICogQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW0gSUQgdG8gc3Vic2NyaWJlIGZvciBDYXNoIEZsb3cgVXBkYXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIENhc2ggRmxvdyBVcGRhdGVzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQ2FzaCBGbG93IFVwZGF0ZXMgcmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5jb21lIGNhdGVnb3JpZXMgdG8gaW5jbHVkZSBpbiBDYXNoIEZsb3cgVXBkYXRlcy4gSWYgZW1wdHkgb3IgYG51bGxgLCB0aGlzIGZpZWxkIHdpbGwgZGVmYXVsdCB0byBpbmNsdWRpbmcgYWxsIHBvc3NpYmxlIGNhdGVnb3JpZXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeT59XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllcz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYGNyYS9tb25pdG9yaW5nX2luc2lnaHRzL3N1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdWJzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdWJzY3JpcHRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL3Vuc3Vic2NyaWJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdWJzY3JpcHRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNb2RlbGVkIGVzdGltYXRlIG9mIHRoZSBtb250aGx5IGluY29tZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9udGhseUluY29tZVZhbHVlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbnRobHlJbmNvbWVWYWx1ZXMge1xuICAgIC8qKlxuICAgICAqIEdyb3NzIEluY29tZSBtb2RlbGVkIGZyb20gdHJlbmRzIG9mIG9ic2VydmVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb250aGx5SW5jb21lVmFsdWVzXG4gICAgICovXG4gICAgZ3Jvc3NfaW5jb21lOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTmV0IEluY29tZSBlc3RpbWF0ZWQgZnJvbSBvYnNlcnZlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9udGhseUluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIG5ldF9pbmNvbWU6IG51bWJlcjtcbn1cbi8qKlxuICogQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFOZXR3b3JrSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGUgdXNlciBsaW5rZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIG5ldHdvcmsgYXR0cmlidXRlcywgd2hlcmUgdGhlIGtleSBpcyBhIHN0cmluZywgYW5kIHRoZSB2YWx1ZSBpcyBhIGZsb2F0LCBpbnQsIG9yIGJvb2xlYW4uIEZvciBhIGZ1bGwgbGlzdCBvZiBhdHRyaWJ1dGVzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIG5ldHdvcmtfYXR0cmlidXRlczogb2JqZWN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtcyB0aGUgZW5kIHVzZXIgY29ubmVjdGVkIGluIExpbmsuXG4gICAgICogQHR5cGUge0FycmF5PENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JhTmV0d29ya0luc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIEEgbGlzdCBvZiBhZGQtb25zIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBQREYuICBgY3JhX2luY29tZV9pbnNpZ2h0c2A6IEluY2x1ZGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBpbiB0aGUgUERGLiBgY3JhX3BhcnRuZXJfaW5zaWdodHNgOiBJbmNsdWRlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGluIHRoZSBQREYuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFQREZBZGRPbnMge1xuICAgIEluY29tZUluc2lnaHRzID0gJ2NyYV9pbmNvbWVfaW5zaWdodHMnLFxuICAgIFBhcnRuZXJJbnNpZ2h0cyA9ICdjcmFfcGFydG5lcl9pbnNpZ2h0cydcbn1cblxuLyoqXG4gKiBUaGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgb2YgdGhlIGJhbmsgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIFBhcnRuZXIgSW5zaWdodHMgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzRmljb1Jlc3VsdHN9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGZpY28/OiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVzdWx0cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmlzbT86IENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyB1c2VkIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGJhc2UgRklDTyBzY29yZSBhc3NvY2lhdGVkIHdpdGggYW4gVWx0cmFGSUNPwq4gc2NvcmluZyByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c0J1cmVhdX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZVxuICAgICAqL1xuICAgIGJ1cmVhdTogQ3JhUGFydG5lckluc2lnaHRzQnVyZWF1O1xuICAgIC8qKlxuICAgICAqIE51bWVyaWMgdmFsdWUgb2YgdGhlIGJhc2UgRklDTyBzY29yZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBSZWFzb24gY29kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZSwgaW4gcHJpb3JpdHkgb3JkZXIuIE1heSBjb250YWluIHVwIHRvIDQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgZmlyc3QgcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByZWFzb25fY29kZV8xPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHJlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIHNlY29uZCByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgdGhpcmQgcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByZWFzb25fY29kZV8zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHJlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIGZvdXJ0aCByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgaW5xdWlyaWVzIGFkdmVyc2VseSBhZmZlY3RlZCB0aGUgc2NvcmUgYnV0IHdlcmUgbm90IHJlcHJlc2VudGVkIGluIG9uZSBvZiB0aGUgZm91ciByZWFzb24gY29kZXMuIFNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgRkFDVEEgRmxhZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZVxuICAgICAqL1xuICAgIGRpZF9pbnF1aXJpZXNfYWR2ZXJzZWx5X2FmZmVjdF9zY29yZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZVxuICAgICAqL1xuICAgIGJhc2VfZmljb19zY29yZV92ZXJzaW9uOiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlVmVyc2lvbjtcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgRklDTyBzY29yZSBtb2RlbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVWZXJzaW9uIHtcbiAgICBfOCA9ICc4JyxcbiAgICBfOSA9ICc5JyxcbiAgICBfMTAgPSAnMTAnLFxuICAgIF8xMFQgPSAnMTBUJ1xufVxuXG4vKipcbiAqIFRoZSBjcmVkaXQgYnVyZWF1IHRoYXQgcHJvdmlkZWQgdGhlIGJhc2UgRklDTyBzY29yZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBhcnRuZXJJbnNpZ2h0c0J1cmVhdSB7XG4gICAgRXF1aWZheCA9ICdFUVVJRkFYJyxcbiAgICBFeHBlcmlhbiA9ICdFWFBFUklBTicsXG4gICAgVHJhbnN1bmlvbiA9ICdUUkFOU1VOSU9OJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwYXJ0bmVyIGluc2lnaHRzIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENSQV9JTlNJR0hUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUl9JTlNJR0hUU19DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHBhcnRuZXIgaW5zaWdodHMgcmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOU0lHSFRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSX0lOU0lHSFRTX0VSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgRklDTyBwcm9kdWN0cyB1c2VkIGluIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dCB7XG4gICAgLyoqXG4gICAgICogSUQgcHJvdmlkZWQgYnkgRklDTyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGxlbmRlci4gUmVxdWlyZWQgZm9yIFVsdHJhRklDT8KuIHNjb3JlIGdlbmVyYXRpb24uIFNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBMZW5kZXIgT3JnIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dFxuICAgICAqL1xuICAgIGZpY29fbGVuZGVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRklDTyBBcHBsaWNhdGlvbiBhY3Jvc3MgRklDTyBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dFxuICAgICAqL1xuICAgIGxlbmRlcl9hcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBVbHRyYUZJQ0/CriBzY29yaW5nIHJlcXVlc3RzLiBFYWNoIHJlcXVlc3QgY29udGFpbnMgYWxsIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYW4gVWx0cmFGSUNPIHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlcXVlc3Q+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvSW5wdXRcbiAgICAgKi9cbiAgICB1bHRyYWZpY29fc2NvcmVfcmVxdWVzdHM6IEFycmF5PENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdD47XG59XG4vKipcbiAqIFJlcG9ydCBjaGFyYWN0ZXJpc3RpY3MgcmV0dXJuZWQgYnkgRklDTyBkZXNjcmliaW5nIHRoZSBiYW5raW5nIGRhdGEgdXNlZCB0byBnZW5lcmF0ZSB0aGUgVWx0cmFGSUNPwq4gc2NvcmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgYWNjb3VudHMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gTGltaXRlZCB0byBjaGVja2luZywgc2F2aW5ncywgYW5kIG1vbmV5IG1hcmtldCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgbnVtX2FjY291bnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGRhaWx5IGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAxIG1vbnRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBhdmdfZGFpbHlfYmFsYW5jZV9vdmVyXzFfbW9udGg/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgZGFpbHkgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBhdmdfZGFpbHlfYmFsYW5jZV9vdmVyXzNfbW9udGhzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGRhaWx5IGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgYXZnX2RhaWx5X2JhbGFuY2Vfb3Zlcl82X21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBkYWlseSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBhdmdfZGFpbHlfYmFsYW5jZV9vdmVyXzEyX21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZWFybGllc3RfdHg/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBtb3N0IHJlY2VudCBkYXkgd2l0aCBhIG5lZ2F0aXZlIGVuZGluZyBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX21vc3RfcmVjZW50X25lZ2F0aXZlX2VuZGluZ19iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbW9zdCByZWNlbnQgaW5zdWZmaWNpZW50IGZ1bmRzIGZlZSBkZWJpdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9tb3N0X3JlY2VudF9pbnN1ZmZpY2llbnRfZnVuZHNfZmVlX2RlYml0X3R4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgZGF5cyB3aXRoIGEgbmVnYXRpdmUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDEgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIHRvdF9udW1iZXJfZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2Vfb3Zlcl8xX21vbnRoPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgZGF5cyB3aXRoIGEgbmVnYXRpdmUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICB0b3RfbnVtYmVyX2RheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX292ZXJfM19tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBkYXlzIHdpdGggYSBuZWdhdGl2ZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIHRvdF9udW1iZXJfZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2Vfb3Zlcl82X21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGRheXMgd2l0aCBhIG5lZ2F0aXZlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIHRvdF9udW1iZXJfZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2Vfb3Zlcl8xMl9tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9tb3N0X3JlY2VudF90eD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBhdCBsZWFzdCBvbmUgdHJhbnNhY3Rpb24gb3ZlciB0aGUgcGFzdCAxIG1vbnRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfdHhfb3Zlcl8xX21vbnRoPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyB3aXRoIGF0IGxlYXN0IG9uZSB0cmFuc2FjdGlvbiBvdmVyIHRoZSBwYXN0IDMgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfdHhfb3Zlcl8zX21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBhdCBsZWFzdCBvbmUgdHJhbnNhY3Rpb24gb3ZlciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgZGF5c193aXRoX3R4X292ZXJfNl9tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHdpdGggYXQgbGVhc3Qgb25lIHRyYW5zYWN0aW9uIG92ZXIgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfdHhfb3Zlcl8xMl9tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBjdXJyZW50IGJhbGFuY2VzIGFjcm9zcyBhbGwgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgdG90X2N1cnJlbnRfYmFsYW5jZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjaGVja2luZyBhY2NvdW50cyBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBudW1fY2hlY2tpbmdfYWNjb3VudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBtb25leSBtYXJrZXQgYWNjb3VudHMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgbnVtX21vbmV5X21hcmtldF9hY2NvdW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHNhdmluZ3MgYWNjb3VudHMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgbnVtX3NhdmluZ3NfYWNjb3VudHM/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY2FsY3VsYXRlZCBVbHRyYUZJQ0/CriBzY29yZXMgcmV0dXJuZWQgYXMgcGFydCBvZiB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXN1bHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRmljb1Jlc3VsdHMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZJQ08gQXBwbGljYXRpb24gYWNyb3NzIEZJQ08gc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVzdWx0c1xuICAgICAqL1xuICAgIGxlbmRlcl9hcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVsdHJhRklDT8KuIHNjb3JpbmcgcmVzdWx0cywgb25lIHBlciBwcm92aWRlZCBVbHRyYUZJQ08gc2NvcmluZyByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXN1bHRzXG4gICAgICovXG4gICAgdWx0cmFmaWNvX3Njb3JlX3Jlc3VsdHM6IEFycmF5PENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1Jlc3VsdHNcbiAgICAgKi9cbiAgICByZXBvcnRfY2hhcmFjdGVyaXN0aWNzPzogQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljcyB8IG51bGw7XG59XG4vKipcbiAqIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVVzZXJUaWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90aWVyPzogQ3JhVXNlclRpZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGF0IHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGluIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50Pjtcbn1cbi8qKlxuICogQWNjb3VudCBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW0gZnJvbSB3aGljaCBQYXJ0bmVyIEluc2lnaHRzIHdlcmUgZ2VuZXJhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBleHRyYWN0ZWQgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBQcmlzbSBEYXRhIGluc2lnaHRzIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgY2FzaF9zY29yZT86IFByaXNtQ2FzaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21FeHRlbmR9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgZXh0ZW5kPzogUHJpc21FeHRlbmQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUZpcnN0RGV0ZWN0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbVxuICAgICAqL1xuICAgIGZpcnN0X2RldGVjdD86IFByaXNtRmlyc3REZXRlY3QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbURldGVjdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAgICAgKi9cbiAgICBkZXRlY3Q/OiBQcmlzbURldGVjdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvbiB3aGV0aGVyIHRoZSBQcmlzbSBEYXRhIGF0dHJpYnV0ZXMgc3VjY2VlZGVkIG9yIGZhaWxlZCB0byBiZSBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNhbGN1bGF0ZWQgVWx0cmFGSUNPwq4gc2NvcmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICovXG4gICAgdWx0cmFmaWNvX3Njb3JlX3ZlcnNpb246IENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlVmVyc2lvbjtcbiAgICAvKipcbiAgICAgKiBOdW1lcmljIHZhbHVlIG9mIHRoZSBVbHRyYUZJQ0/CriBzY29yZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTmVnYXRpdmUgcmVhc29uIGNvZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUgKHJlYXNvbnMgdGhlIHNjb3JlIG1vdmVkIGRvd253YXJkKSwgaW4gcHJpb3JpdHkgb3JkZXIuIE1heSBjb250YWluIHVwIHRvIDQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICovXG4gICAgbmVnYXRpdmVfcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBQb3NpdGl2ZSByZWFzb24gY29kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZSAocmVhc29ucyB0aGUgc2NvcmUgbW92ZWQgdXB3YXJkKSwgaW4gcHJpb3JpdHkgb3JkZXIuIE1heSBjb250YWluIHVwIHRvIDQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICovXG4gICAgcG9zaXRpdmVfcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYG5lZ2F0aXZlX3JlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIGZpcnN0IHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgbmVnYXRpdmVfcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgc2Vjb25kIHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgbmVnYXRpdmVfcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgdGhpcmQgcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVfMz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZC4gVXNlIGBuZWdhdGl2ZV9yZWFzb25fY29kZXNgIGluc3RlYWQuIFRoZSBmb3VydGggcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVfND86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZC4gVXNlIGBwb3NpdGl2ZV9yZWFzb25fY29kZXNgIGluc3RlYWQuIFRoZSBmaXJzdCBwb3NpdGl2ZSByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwb3NpdGl2ZV9yZWFzb25fY29kZV8xPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHBvc2l0aXZlX3JlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIHNlY29uZCBwb3NpdGl2ZSByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwb3NpdGl2ZV9yZWFzb25fY29kZV8yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHBvc2l0aXZlX3JlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIHRoaXJkIHBvc2l0aXZlIHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBvc2l0aXZlX3JlYXNvbl9jb2RlXzM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgcG9zaXRpdmVfcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgZm91cnRoIHBvc2l0aXZlIHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBvc2l0aXZlX3JlYXNvbl9jb2RlXzQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgaW5xdWlyaWVzIGFkdmVyc2VseSBhZmZlY3RlZCB0aGUgc2NvcmUgYnV0IHdlcmUgbm90IHJlcHJlc2VudGVkIGluIG9uZSBvZiB0aGUgZm91ciByZWFzb24gY29kZXMuIFNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgRkFDVEEgRmxhZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKi9cbiAgICBkaWRfaW5xdWlyaWVzX2FkdmVyc2VseV9hZmZlY3Rfc2NvcmU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiByZXF1aXJlZCB0byBnZW5lcmF0ZSBhIHNpbmdsZSBVbHRyYUZJQ0/CriBzY29yZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1bHRyYWZpY29fc2NvcmVfdmVyc2lvbjogQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVWZXJzaW9uO1xuICAgIC8qKlxuICAgICAqIEZJQ08gaWRlbnRpZmllciBmb3IgYSBwYXJ0aWN1bGFyIHNjb3JpbmcgcmVxdWVzdC4gU2hvdWxkIG9ubHkgYmUgcHJvdmlkZWQgYnkgRklDTyBhcyBwYXJ0IG9mIHRoZSBGSUNPLWxlZCBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdFxuICAgICAqL1xuICAgIGZpY29fc2NvcmluZ19yZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBzY29yaW5nIHJlcXVlc3RzIHdpdGggdGhlaXIgc2NvcmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVlc3RfY29ycmVsYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhc2VfZmljb19zY29yZTogQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZTtcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBhIHNpbmdsZSBVbHRyYUZJQ0/CriBzY29yZSBnZW5lcmF0aW9uIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBzY29yaW5nIHJlcXVlc3RzIHdpdGggdGhlaXIgc2NvcmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0XG4gICAgICovXG4gICAgcmVxdWVzdF9jb3JyZWxhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGSUNPLXByb3ZpZGVkIGlkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgc2NvcmUgZ2VuZXJhdGlvbiByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0XG4gICAgICovXG4gICAgZmljb19zY29yaW5nX3JlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlc3VsdFxuICAgICAqL1xuICAgIHVsdHJhZmljb19zY29yZT86IENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIFVsdHJhRklDT8KuIHNjb3JlIGNvdWxkIG5vdCBiZSBjb21wdXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlc3VsdFxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIFVsdHJhRklDT8KuIHNjb3JlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVWZXJzaW9uIHtcbiAgICBfMTAgPSAnMS4wJ1xufVxuXG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBwcmVkaWN0aW9uIGludGVydmFsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVByZWRpY3Rpb25JbnRlcnZhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVByZWRpY3Rpb25JbnRlcnZhbCB7XG4gICAgLyoqXG4gICAgICogVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBwcmVkaWN0ZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gcHJvYmFiaWxpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUHJlZGljdGlvbkludGVydmFsXG4gICAgICovXG4gICAgbG93ZXJfYm91bmQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgcHJlZGljdGVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHByb2JhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVByZWRpY3Rpb25JbnRlcnZhbFxuICAgICAqL1xuICAgIHVwcGVyX2JvdW5kPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvYmFiaWxpdHkgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGZhbGxpbmcgd2l0aGluIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmQuIFRoaXMgaXMgYSBwZXJjZW50YWdlIHJlcHJlc2VudGVkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVByZWRpY3Rpb25JbnRlcnZhbFxuICAgICAqL1xuICAgIHByb2JhYmlsaXR5PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRm9yd2FyZC1sb29raW5nIG1vZGVsZWQgZXN0aW1hdGUgb2YgaW5jb21lIGJhc2VkIG9uIHJlY2VudCBpbmNvbWUgdHJhbnNhY3Rpb25zIGFuZCB0cmVuZHMgaW4gYWN0aXZlIHN0cmVhbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVByb2plY3RlZE1vZGVsZWRJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQcm9qZWN0ZWRNb2RlbGVkSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTW9udGhseUluY29tZVZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUHJvamVjdGVkTW9kZWxlZEluY29tZVxuICAgICAqL1xuICAgIG1vbnRobHk6IENyYU1vbnRobHlJbmNvbWVWYWx1ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUFubnVhbEluY29tZVZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUHJvamVjdGVkTW9kZWxlZEluY29tZVxuICAgICAqL1xuICAgIGFubnVhbDogQ3JhQW5udWFsSW5jb21lVmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQ2hlY2sgUmVwb3J0IHVwZ3JhZGUgYXR0ZW1wdCBoYXMgZmFpbGVkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVVwZ3JhZGVGYWlsZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVBHUkFERV9GQUlMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGZvciBpdGVtcyB0aGF0IGZhaWxlZCB0byBiZSB1cGdyYWRlZCBieSBhIENoZWNrIFJlcG9ydCB1cGdyYWRlIGF0dGVtcHQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVVwZ3JhZGVGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQ2hlY2sgUmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGUuIFRvIGdldCBtb3JlIGRldGFpbHMsIGNhbGwgYC91c2VyL2l0ZW1zL2dldGAgYW5kIGNoZWNrIGZvciBub24tbnVsbCBgZXJyb3JgIG9iamVjdHMgb24gdGhlIGFzc29jaWF0ZWQgSXRlbXMgaW4gdGhlIHJlc3BvbnNlLiBUaGVzZSBgZXJyb3JgIG9iamVjdHMgd2lsbCBjb250YWluIG1vcmUgZGV0YWlscyBvbiB3aHkgdGhlIEl0ZW0gaXMgaW4gYW4gZXJyb3Igc3RhdGUgYW5kIGhvdyB0byByZXNvbHZlIGl0LiBBZnRlciByZXNvbHZpbmcgdGhlIGVycm9ycywgeW91IGNhbiB0cnkgdG8gcmUtZ2VuZXJhdGUgdGhlIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVVzZXJDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX0NIRUNLX1JFUE9SVF9GQUlMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHdob3NlIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGlzIHJlY2VpdmVkIGJ5IGNhbGxpbmcgYC91c2VyL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGl0ZW1faWRzYCBpbmNsdWRlZCBpbiB0aGUgQ2hlY2sgUmVwb3J0LiBBY2Nlc3MgdG8gdGhpcyBmaWVsZCBpcyBpbiBjbG9zZWQgYmV0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIENoZWNrIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgdGhlIHJlcG9ydCB3aWxsIGJlIGF2YWlsYWJsZSB0byByZXRyaWV2ZSBmb3IgMjQgaG91cnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVVzZXJDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVVzZXJDaGVja1JlcG9ydFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgd2hvc2UgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgaXMgcmVjZWl2ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgc3VjY2Vzc2Z1bGx5IGJlZW4gZ2VuZXJhdGVkIGZvciB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVVzZXJDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHN1Y2Nlc3NmdWxfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgZmFpbGVkIHRvIGdlbmVyYXRlIGZvciB0aGUgcmVwb3J0LiBBZGRpdGlvbmFsIGRldGFpbCBvbiB3aGF0IGNhdXNlZCB0aGUgZmFpbHVyZSBjYW4gYmUgZm91bmQgYnkgY2FsbGluZyB0aGUgcHJvZHVjdCAvZ2V0IGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVVzZXJDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGZhaWxlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGl0ZW1faWRzYCBpbmNsdWRlZCBpbiB0aGUgQ2hlY2sgUmVwb3J0LiBBY2Nlc3MgdG8gdGhpcyBmaWVsZCBpcyBpbiBjbG9zZWQgYmV0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgdGllciBvZiB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVVzZXJUaWVyIHtcbiAgICBGcmVlID0gJ2ZyZWUnLFxuICAgIFBhaWQgPSAncGFpZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEFjY291bnQgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBIb21lIExlbmRpbmcgSW5jb21lIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogQ3JhQmFua0luY29tZUFjY291bnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG59XG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkgZm9yIGEgZ2l2ZW4gc3RyZWFtLiBUaGUgc3RyZWFtcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGVzZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgaW5jb21lIGNhdGVnb3JpZXMuICBTZWUgdGhlIFtJbmNvbWUgVjIgQ2F0ZWdvcnkgVGF4b25vbXldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9pbmNvbWUtdjItY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgaW5jb21lIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQ2F0ZWdvcnkge1xuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgc3RyZWFtXFwncyBpbnRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbSB3aXRoaW4gdGhlIEhvbWUgTGVuZGluZyBJbmNvbWUgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW1cXCdzIGFjY291bnRzIHRoYXQgaGF2ZSBiYW5rIGluY29tZSBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogTW9kZWxlZCBpbmNvbWUgbWV0cmljcyBmb3IgYSBnaXZlbiBpbmNvbWUgc3RyZWFtIG9yIHVzZXIgc3VtbWFyeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lTWV0cmljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZU1ldHJpY3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25Nb2RlbGVkSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVNZXRyaWNzXG4gICAgICovXG4gICAgY3VycmVudDogQ3JhVmVyaWZpY2F0aW9uTW9kZWxlZEluY29tZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZU1ldHJpY3NcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVNZXRyaWNzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBvZiB0aGUgaW5jb21lIHN0cmVhbVxcJ3MgbmV4dCBwYXltZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVOZXh0UGF5bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZU5leHRQYXltZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgZGF0ZSBvZiB0aGUgaW5jb21lIHN0cmVhbVxcJ3MgbmV4dCBwYXltZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lTmV4dFBheW1lbnRcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpbmNvbWUgcGF5IGZyZXF1ZW5jeS4gYFdFRUtMWWA6IFdlZWtseSBwYXkgZnJlcXVlbmN5LiBgQklXRUVLTFlgOiBCaXdlZWtseSBwYXkgZnJlcXVlbmN5LiBgU0VNSV9NT05USExZYDogU2VtaS1tb250aGx5IHBheSBmcmVxdWVuY3kuIGBNT05USExZYDogTW9udGhseSBwYXkgZnJlcXVlbmN5LiBgREFJTFlgOiBEYWlseSBwYXkgZnJlcXVlbmN5LiBgVU5LTk9XTmA6IFBheSBmcmVxdWVuY3kgaXMgdW5rbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVZlcmlmaWNhdGlvbkluY29tZVBheUZyZXF1ZW5jeSB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBkYXRhIGFib3V0IHRoZSBpbmNvbWUgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVByb3ZpZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUHJvdmlkZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluY29tZSBwcm92aWRlciBuYW1lIGlzIG5vcm1hbGl6ZWQgYnkgY29tcGFyaW5nIGl0IGFnYWluc3QgYSBjYW5vbmljYWwgc2V0IG9mIGtub3duIHByb3ZpZGVycy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUHJvdmlkZXJcbiAgICAgKi9cbiAgICBpc19ub3JtYWxpemVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEluY29tZSBSZXBvcnQgd2l0aGluIHRoZSBIb21lIExlbmRpbmcgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIEhvbWUgTGVuZGluZyBJbmNvbWUgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIEhvbWUgTGVuZGluZyBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZlcmlmaWNhdGlvbkluY29tZVVzZXJTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyX3N1bW1hcnk6IENyYVZlcmlmaWNhdGlvbkluY29tZVVzZXJTdW1tYXJ5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBpbmNvbWUgc3RyZWFtcyBmb3IgdGhpcyB1c2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnRcbiAgICAgKi9cbiAgICBpbmNvbWVfc3RyZWFtczogQXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lSXRlbT47XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGluY29tZSBzb3VyY2UuIGBBQ1RJVkVgOiBUaGUgaW5jb21lIHNvdXJjZSBpcyBhY3RpdmUuIGBJTkFDVElWRWA6IFRoZSBpbmNvbWUgc291cmNlIGlzIGluYWN0aXZlLiBgVU5LTk9XTmA6IFRoZSBpbmNvbWUgc291cmNlIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBJbmFjdGl2ZSA9ICdJTkFDVElWRScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFuIGluY29tZSBzdHJlYW0gZGV0ZWN0ZWQgZm9yIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW0ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzdHJlYW0uIElmIHRoZSByZXBvcnQgaXMgcmVnZW5lcmF0ZWQgYW5kIGEgbmV3IGByZXBvcnRfaWRgIGlzIGNyZWF0ZWQsIHRoZSBuZXcgcmVwb3J0IHdpbGwgaGF2ZSBhIG5ldyBzZXQgb2YgYGluY29tZV9zdHJlYW1faWRgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBpbmNvbWVfc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc3RyZWFtIGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHN0cmVhbSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIG5hbWUgb3Igb3JpZ2luYWwgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGluY29tZSB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIGluc2lnaHRzOiBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lTWV0cmljc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgaW5jb21lX21ldHJpY3M6IENyYVZlcmlmaWNhdGlvbkluY29tZU1ldHJpY3M7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgaW5jb21lIHN0cmVhbSBvcmRlcmVkIGJ5IGFzY2VuZGluZyBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBNb2RlbGVkIGluc2lnaHRzIGZvciBhIGdpdmVuIGluY29tZSBzdHJlYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25JbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcnk6IENyYVZlcmlmaWNhdGlvbkluY29tZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25JbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbUluc2lnaHRzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogQ3JhVmVyaWZpY2F0aW9uSW5jb21lUGF5RnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25JbmNvbWVQcm92aWRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfcHJvdmlkZXI6IENyYVZlcmlmaWNhdGlvbkluY29tZVByb3ZpZGVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXR1czogQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25JbmNvbWVOZXh0UGF5bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtSW5zaWdodHNcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnQ6IENyYVZlcmlmaWNhdGlvbkluY29tZU5leHRQYXltZW50IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGFuIGluY29tZSBzdHJlYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25PdXRsaWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG91dGxpZXI6IENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uT3V0bGllcjtcbn1cbi8qKlxuICogTWV0YWRhdGEgb24gd2hldGhlciB0aGlzIGluY29tZSB0cmFuc2FjdGlvbiBpcyBhbiBvdXRsaWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvbk91dGxpZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvbk91dGxpZXIge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIGluY29tZSB0cmFuc2FjdGlvbiBhbW91bnQgaXMgdW51c3VhbGx5IGhpZ2ggY29tcGFyZWQgdG8gdGhlIGFtb3VudHMgZm9yIHRoYXQgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvbk91dGxpZXJcbiAgICAgKi9cbiAgICBpc19vdXRsaWVyOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdHJhbnNhY3Rpb24gZGlmZmVycyBmcm9tIHRoZSBzdHJlYW0gYXZlcmFnZSB0cmFuc2FjdGlvbiBhbW91bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25PdXRsaWVyXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQWdncmVnYXRlZCBzdW1tYXJ5IG9mIGFsbCBpbmNvbWUgc3RyZWFtcyBmb3IgdGhpcyB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVVc2VyU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVVzZXJTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGEgdXNlclxcJ3MgYWdncmVnYXRlZCBpbmNvbWUgbWV0cmljcyBmb3IgZWFjaCBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lTWV0cmljcz59XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVVzZXJTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX21ldHJpY3M6IEFycmF5PENyYVZlcmlmaWNhdGlvbkluY29tZU1ldHJpY3M+O1xufVxuLyoqXG4gKiBNb2RlbGVkIGluY29tZSB2YWx1ZXMgZm9yIGEgZ2l2ZW4gdGltZSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVZhbHVlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVZhbHVlcyB7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgSW5jb21lIG1vZGVsZWQgZnJvbSB0cmVuZHMgb2Ygb2JzZXJ2ZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIGdyb3NzX2luY29tZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE5ldCBJbmNvbWUgZXN0aW1hdGVkIGZyb20gb2JzZXJ2ZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIG5ldF9pbmNvbWU6IG51bWJlcjtcbn1cbi8qKlxuICogTW9kZWxlZCBlc3RpbWF0ZSBvZiBjdXJyZW50IGluY29tZSBiYXNlZCBvbiByZWNlbnRseSBvYnNlcnZlZCBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25Nb2RlbGVkSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uTW9kZWxlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZlcmlmaWNhdGlvbkluY29tZVZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uTW9kZWxlZEluY29tZVxuICAgICAqL1xuICAgIG1vbnRobHk6IENyYVZlcmlmaWNhdGlvbkluY29tZVZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25Nb2RlbGVkSW5jb21lXG4gICAgICovXG4gICAgYW5udWFsOiBDcmFWZXJpZmljYXRpb25JbmNvbWVWYWx1ZXM7XG59XG4vKipcbiAqIENvbnRhaW5zIGRhdGEgZm9yIHRoZSBDUkEgSG9tZSBMZW5kaW5nIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb21lIExlbmRpbmcgUmVwb3J0IG9iamVjdC4gVGhpcyBJRCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBCYXNlIFJlcG9ydCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25SZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBHU0VzIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlbSBhY2Nlc3MgdG8gdGhlIHJlcG9ydC4gVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZHVyaW5nIHJlcG9ydCBnZW5lcmF0aW9uIHdoZW4gR1NFIG9wdGlvbnMgYXJlIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25SZXBvcnRcbiAgICAgKi9cbiAgICBnc2VfcmVmZXJlbmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25SZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVm9hUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25SZXBvcnRcbiAgICAgKi9cbiAgICB2b2E/OiBDcmFWb2FSZXBvcnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uUmVwb3J0XG4gICAgICovXG4gICAgZW1wbG95bWVudF9yZWZyZXNoPzogQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvblJlcG9ydFxuICAgICAqL1xuICAgIGluY29tZT86IENyYVZlcmlmaWNhdGlvbkluY29tZVJlcG9ydCB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBWT0EgcmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWb2FSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWb2FSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIFZPQSBSZXBvcnQgd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRoYXQgdGhlIFZPQSByZXBvcnQgY292ZXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQmFzZSBSZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyYVZvYVJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JhVm9hUmVwb3J0SXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZvYVJlcG9ydEF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydFxuICAgICAqL1xuICAgIGF0dHJpYnV0ZXM6IENyYVZvYVJlcG9ydEF0dHJpYnV0ZXM7XG59XG4vKipcbiAqIFZPQSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZvYVJlcG9ydEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYmFsYW5jZXM6IENyYVZvYVJlcG9ydEFjY291bnRCYWxhbmNlcztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5mb3JtYXRpb24gYWJvdXQgcHJldmlvdXNseSBzdWJtaXR0ZWQgdmFsaWQgZGlzcHV0ZSBzdGF0ZW1lbnRzIGJ5IHRoZSBjb25zdW1lclxuICAgICAqIEB0eXBlIHtBcnJheTxDb25zdW1lckRpc3B1dGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZXM6IEFycmF5PENvbnN1bWVyRGlzcHV0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcmVwb3J0IGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZvYVJlcG9ydFRyYW5zYWN0aW9uc0luc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2luc2lnaHRzOiBDcmFWb2FSZXBvcnRUcmFuc2FjdGlvbnNJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlOiBPd25lcnNoaXBUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBCYXNlUmVwb3J0SW52ZXN0bWVudHMgfCBudWxsO1xufVxuLyoqXG4gKiBWT0EgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbC10aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC4gIEF2YWlsYWJsZSBmb3IgYGNyZWRpdGAgYW5kIGBkZXBvc2l0b3J5YCB0eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFWb2FSZXBvcnRBY2NvdW50SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxDcmFWb2FSZXBvcnRBY2NvdW50SGlzdG9yaWNhbEJhbGFuY2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQgb3ZlciB0aGUgbGFzdCAzMCBkYXlzLiBDYWxjdWxhdGVkIHVzaW5nIHRoZSBkZXJpdmVkIGhpc3RvcmljYWwgYmFsYW5jZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZlcmFnZV9iYWxhbmNlXzMwX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCBvdmVyIHRoZSBsYXN0IDYwIGRheXMuIENhbGN1bGF0ZWQgdXNpbmcgdGhlIGRlcml2ZWQgaGlzdG9yaWNhbCBiYWxhbmNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2VfNjBfZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldCBOU0YgZmVlIHRyYW5zYWN0aW9ucyBpbiB0aGUgdGltZSByYW5nZSBmb3IgdGhlIHJlcG9ydCBpbiB0aGUgZ2l2ZW4gYWNjb3VudCAobm90IGNvdW50aW5nIGFueSBmZWVzIHRoYXQgd2VyZSByZXZlcnNlZCB3aXRoaW4gdGhlIHRpbWUgcmFuZ2UpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0QWNjb3VudEhpc3RvcmljYWxCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0QWNjb3VudEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50SGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGNhbGN1bGF0ZWQgaGlzdG9yaWNhbCBiYWxhbmNlLCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciB0aGUgVk9BIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0QXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZvYVJlcG9ydEF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbFJlcG9ydEluZmxvd0Ftb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnQ6IFRvdGFsUmVwb3J0SW5mbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxSZXBvcnRPdXRmbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnQ6IFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudCB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYSBWT0EgcmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWb2FSZXBvcnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0SXRlbSB7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFWb2FSZXBvcnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxDcmFWb2FSZXBvcnRBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZV90aW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWb2FSZXBvcnRUcmFuc2FjdGlvbnNJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZvYVJlcG9ydFRyYW5zYWN0aW9uc0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0VHJhbnNhY3Rpb25zSW5zaWdodHNcbiAgICAgKi9cbiAgICBhbGxfdHJhbnNhY3Rpb25zOiBBcnJheTxCYXNlUmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgdGltZWZyYW1lIHByb3ZpZGVkIGJ5IHRoZSBGSSwgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRUcmFuc2FjdGlvbnNJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCB0aW1lZnJhbWUgcHJvdmlkZWQgYnkgdGhlIEZJLCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydFRyYW5zYWN0aW9uc0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbmQgdXNlclxcJ3MgMTA5OSB0YXggZm9ybVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE/OiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGb3JtMTA5OVR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmb3JtXzEwOTlfdHlwZT86IEZvcm0xMDk5VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OVJlY2lwaWVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlY2lwaWVudD86IENyZWRpdDEwOTlSZWNpcGllbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlQYXllcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyPzogQ3JlZGl0MTA5OVBheWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5RmlsZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmaWxlcj86IENyZWRpdDEwOTlGaWxlcjtcbiAgICAvKipcbiAgICAgKiBUYXggeWVhciBvZiB0aGUgdGF4IGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRheF95ZWFyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcmVudCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcmVudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiByb3lhbHRpZXMgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJveWFsdGllcz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIG90aGVyIGluY29tZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb3RoZXJfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZpc2hpbmcgYm9hdCBwcm9jZWVkcyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmaXNoaW5nX2JvYXRfcHJvY2VlZHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtZWRpY2FsIGFuZCBoZWFsdGhjYXJlIHBheW1lbnRzIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lZGljYWxfYW5kX2hlYWx0aGNhcmVfcGF5bWVudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBub25lbXBsb3llZSBjb21wZW5zYXRpb24gZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbm9uZW1wbG95ZWVfY29tcGVuc2F0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygc3Vic3RpdHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdWJzdGl0dXRlX3BheW1lbnRzX2luX2xpZXVfb2ZfZGl2aWRlbmRzX29yX2ludGVyZXN0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBwYXllciBtYWRlIGRpcmVjdCBzYWxlcyBvdmVyICQ1MDAwIG9mIGNvbnN1bWVyIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9tYWRlX2RpcmVjdF9zYWxlc19vZl81MDAwX29yX21vcmVfb2ZfY29uc3VtZXJfcHJvZHVjdHNfdG9fYnV5ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBjcm9wIGluc3VyYW5jZSBwcm9jZWVkcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY3JvcF9pbnN1cmFuY2VfcHJvY2VlZHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBnb2xkZW4gcGFyYWNodXRlIHBheW1lbnRzIG1hZGUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGV4Y2Vzc19nb2xkZW5fcGFyYWNodXRlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ3Jvc3MgcHJvY2VlZHMgcGFpZCB0byBhbiBhdHRvcm5leSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZ3Jvc3NfcHJvY2VlZHNfcGFpZF90b19hbl9hdHRvcm5leT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIDQwOUEgZGVmZXJyYWxzIGVhcm5lZCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VjdGlvbl80MDlhX2RlZmVycmFscz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIDQwOUEgaW5jb21lIGVhcm5lZCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VjdGlvbl80MDlhX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfdGF4X3dpdGhoZWxkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygc3RhdGUgdGF4IHdpdGhoZWxkIG9mIHBheWVyIGZvciBzZWNvbmRhcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZF9sb3dlcj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfc3RhdGVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcl9sb3dlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHJlcG9ydGVkIGZvciBwcmltYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgdmFsdWVzIHdpbGwgYmUgcHJvdmlkZWQgUGF5bWVudCBjYXJkIFRoaXJkIHBhcnR5IG5ldHdvcmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3JlcG9ydGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIChYWFgpIFhYWC1YWFhYLiBQaG9uZSBudW1iZXIgb2YgdGhlIFBTRSAoUGF5bWVudCBTZXR0bGVtZW50IEVudGl0eSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBzZV90ZWxlcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBHcm9zcyBhbW91bnQgcmVwb3J0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIGNhcmQgbm90IHByZXNlbnQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBjYXJkX25vdF9wcmVzZW50X3RyYW5zYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWVyY2hhbnRfY2F0ZWdvcnlfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHBheW1lbnQgdHJhbnNhY3Rpb25zIG1hZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG51bWJlcl9vZl9wYXltZW50X3RyYW5zYWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBKYW51YXJ5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBqYW51YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBGZWJydWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmVicnVhcnlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIE1hcmNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXJjaF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgQXByaWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGFwcmlsX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1heV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSnVuZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAganVuZV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSnVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAganVseV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgQXVndXN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhdWd1c3RfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIFNlcHRlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VwdGVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBPY3RvYmVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBvY3RvYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBOb3ZlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbm92ZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIERlY2VtYmVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkZWNlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlY29uZGFyeSBzdGF0ZSBvZiBidXNpbmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2Vjb25kYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pbmNvbWVfdGF4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgdGF4IHJlcG9ydGVkIGZvciBzZWNvbmRhcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZV9pbmNvbWVfdGF4PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGVyIHVzZWQgYnkgMTA5OS1LIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlGaWxlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTlGaWxlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUYXggaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIGZpbGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlGaWxlclxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgcHJvdmlkZWQ6IFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkgKFBTRSksIEVsZWN0cm9uaWMgUGF5bWVudCBGYWNpbGl0YXRvciAoRVBGKSwgT3RoZXIgVGhpcmQgUGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHBheWVyIHVzZWQgYnkgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlQYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTlQYXllciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUYXggaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlQYXllclxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVsZXBob25lIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0ZWxlcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHJlY2lwaWVudCB1c2VkIGluIGJvdGggMTA5OS1LIGFuZCAxMDk5LU1JU0MgdGF4IGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgb2YgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2hlY2tlZCBpZiBGQVRDQSBpcyBhIGZpbGluZyByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgZmFjdGFfZmlsaW5nX3JlcXVpcmVtZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaGVja2VkIGlmIDJuZCBUSU4gZXhpc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBzZWNvbmRfdGluX2V4aXN0cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHRyYW5zZmVyLiBSZXF1aXJlZCBmb3IgdHJhbnNmZXJzIG9uIGFuIEFDSCBuZXR3b3JrLiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gVGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lci4gQXV0aG9yaXphdGlvbiB3YXMgb2J0YWluZWQgaW4gd3JpdGluZyBlaXRoZXIgaW4gcGVyc29uIG9yIHZpYSBhbiBlbGVjdHJvbmljIGRvY3VtZW50IHNpZ25pbmcsIGUuZy4gRG9jdXNpZ24sIGJ5IHRoZSBjb25zdW1lci4gQ2FuIGJlIHVzZWQgZm9yIGNyZWRpdHMgb3IgZGViaXRzLiAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeS4gVGhlIHRyYW5zZmVyIGRlYml0cyBhIGNvbnN1bWVyXFwncyBiYW5rIGFjY291bnQuIEF1dGhvcml6YXRpb24gZnJvbSB0aGUgY29uc3VtZXIgaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXQgKGUuZy4gYSB3ZWIgb3IgbW9iaWxlIGFwcGxpY2F0aW9uKS4gQ2FuIGJlIHVzZWQgZm9yIHNpbmdsZSBkZWJpdHMgb3IgcmVjdXJyaW5nIGRlYml0cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGNyZWRpdCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWNyZWRpdCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRBY2NvdW50U3VidHlwZSB7XG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBUaGlzIGNvbnRhaW5zIGFuIGFtb3VudCwgZGVub21pbmF0ZWQgaW4gdGhlIGN1cnJlbmN5IHNwZWNpZmllZCBieSBlaXRoZXIgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3kge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuczsgY2FuIGluY2x1ZGUgYXQgbW9zdCBvbmUgVk9BL3N0YW5kYXJkIEFzc2V0IFJlcG9ydCB0b2tlbnMgYW5kIG9uZSBWT0UgQXNzZXQgUmVwb3J0IFRva2VuLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciwgd2hpY2ggYWxsb3dzIHRoZW0gdG8gZmV0Y2ggdGhlIEFzc2V0IFJlcG9ydHMgYXR0YWNoZWQgdG8gdGhlIHRva2VuLiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRva2VucyB3aGljaCB0aGUgc3BlY2lmaWVkIEF1ZGl0IENvcHkgVG9rZW4gd2lsbCBiZSB1cGRhdGVkIHdpdGguIFRoZSB0eXBlcyBvZiB0b2tlbiBzdXBwb3J0ZWQgYXJlIGFzc2V0IHJlcG9ydCB0b2tlbiBhbmQgZW1wbG95bWVudCByZXBvcnQgdG9rZW4uIFRoZXJlIGNhbiBiZSBhdCBtb3N0IDEgb2YgZWFjaCB0b2tlbiB0eXBlIGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSBUb2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEJhbmtFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBsYXRlc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGRlcG9zaXQgZnJvbSB0aGlzIGVtcGxveWVyIGZyb20gd2l0aGluIHRoZSBwZXJpb2Qgb2YgdGhlIGRheXMgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZWFybGllc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEJhbmsgRW1wbG95bWVudCBkYXRhLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSB3aWxsIGJlIGEgZGlzdGluY3QgYmFuayBlbXBsb3ltZW50IHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3JlcG9ydHM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBkaWZmZXJlbnQgZW1wbG95ZXIgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBFbXBsb3ltZW50IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X2FjY291bnRzOiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD47XG59XG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0IHdhcyBnZW5lcmF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEVtcGxveW1lbnQgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgdHlwZSB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFOS19FTVBMT1lNRU5UX1dBUk5JTkdgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZSB7XG4gICAgQmFua0VtcGxveW1lbnRXYXJuaW5nID0gJ0JBTktfRU1QTE9ZTUVOVF9XQVJOSU5HJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgaXRlbXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBUaGUgYWNjb3VudCB0eXBlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGBkZXBvc2l0b3J5YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZSB7XG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5J1xufVxuXG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkuIGBCQU5LX0lOVEVSRVNUYDogSW50ZXJlc3QgZWFybmVkIGZyb20gYSBiYW5rIGFjY291bnQuIGBCRU5FRklUX09USEVSYDogR292ZXJubWVudCBiZW5lZml0cyBvdGhlciB0aGFuIHJldGlyZW1lbnQsIHVuZW1wbG95bWVudCwgY2hpbGQgc3VwcG9ydCwgb3IgZGlzYWJpbGl0eS4gQ3VycmVudGx5IHVzZWQgb25seSBpbiB0aGUgVUssIHRvIHJlcHJlc2VudCBiZW5lZml0cyBzdWNoIGFzIENvc3Qgb2YgTGl2aW5nIFBheW1lbnRzLiBgQ0FTSGA6IERlcHJlY2F0ZWQgYW5kIHVzZWQgb25seSBmb3IgZXhpc3RpbmcgbGVnYWN5IGltcGxlbWVudGF0aW9ucy4gSGFzIGJlZW4gcmVwbGFjZWQgYnkgYENBU0hfREVQT1NJVGAgYW5kIGBUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OYC4gYENBU0hfREVQT1NJVGA6IEEgY2FzaCBvciBjaGVjayBkZXBvc2l0LiBgQ0hJTERfU1VQUE9SVGA6IENoaWxkIHN1cHBvcnQgcGF5bWVudHMgcmVjZWl2ZWQuIGBHSUdfRUNPTk9NWWA6IEluY29tZSBlYXJuZWQgYXMgYSBnaWcgZWNvbm9teSB3b3JrZXIsIGUuZy4gZHJpdmluZyBmb3IgVWJlciwgTHlmdCwgUG9zdG1hdGVzLCBEb29yRGFzaCwgZXRjLiBgTE9OR19URVJNX0RJU0FCSUxJVFlgOiBEaXNhYmlsaXR5IHBheW1lbnRzLCBpbmNsdWRpbmcgU29jaWFsIFNlY3VyaXR5IGRpc2FiaWxpdHkgYmVuZWZpdHMuIGBPVEhFUmA6IEluY29tZSB0aGF0IGNvdWxkIG5vdCBiZSBjYXRlZ29yaXplZCBhcyBhbnkgb3RoZXIgaW5jb21lIGNhdGVnb3J5LiBgTUlMSVRBUllgOiBWZXRlcmFucyBiZW5lZml0cy4gSW5jb21lIGVhcm5lZCBhcyBzYWxhcnkgZm9yIHNlcnZpbmcgaW4gdGhlIG1pbGl0YXJ5IChlLmcuIHRocm91Z2ggREZBUykgd2lsbCBiZSBjbGFzc2lmaWVkIGFzIGBTQUxBUllgIHJhdGhlciB0aGFuIGBNSUxJVEFSWWAuIGBSRU5UQUxgOiBJbmNvbWUgZWFybmVkIGZyb20gYSByZW50YWwgcHJvcGVydHkuIEluY29tZSBtYXkgYmUgaWRlbnRpZmllZCBhcyByZW50YWwgd2hlbiB0aGUgcGF5bWVudCBpcyByZWNlaXZlZCB0aHJvdWdoIGEgcmVudGFsIHBsYXRmb3JtLCBlLmcuIEFpcmJuYjsgcmVudCBwYWlkIGRpcmVjdGx5IGJ5IHRoZSB0ZW5hbnQgdG8gdGhlIHByb3BlcnR5IG93bmVyIChlLmcuIHZpYSBjYXNoLCBjaGVjaywgb3IgQUNIKSB3aWxsIHR5cGljYWxseSBub3QgYmUgY2xhc3NpZmllZCBhcyByZW50YWwgaW5jb21lLiBgUkVUSVJFTUVOVGA6IFBheW1lbnRzIGZyb20gcHJpdmF0ZSByZXRpcmVtZW50IHN5c3RlbXMsIHBlbnNpb25zLCBhbmQgZ292ZXJubWVudCByZXRpcmVtZW50IHByb2dyYW1zLCBpbmNsdWRpbmcgU29jaWFsIFNlY3VyaXR5IHJldGlyZW1lbnQgYmVuZWZpdHMuIGBTQUxBUllgOiBQYXltZW50IGZyb20gYW4gZW1wbG95ZXIgdG8gYW4gZWFybmVyIG9yIG90aGVyIGZvcm0gb2YgcGVybWFuZW50IGVtcGxveW1lbnQuIGBUQVhfUkVGVU5EYDogQSB0YXggcmVmdW5kLiBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmA6IERlcG9zaXRzIGZyb20gYSBtb25leSB0cmFuc2ZlciBhcHAsIHN1Y2ggYXMgVmVubW8sIENhc2ggQXBwLCBvciBaZWxsZS4gYFVORU1QTE9ZTUVOVGA6IFVuZW1wbG95bWVudCBiZW5lZml0cy4gSW4gdGhlIFVLLCBpbmNsdWRlcyBjZXJ0YWluIGxvdy1pbmNvbWUgYmVuZWZpdHMgc3VjaCBhcyB0aGUgVW5pdmVyc2FsIENyZWRpdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCcsXG4gICAgQ2FzaERlcG9zaXQgPSAnQ0FTSF9ERVBPU0lUJyxcbiAgICBUcmFuc2ZlckZyb21BcHBsaWNhdGlvbiA9ICdUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OJyxcbiAgICBUYXhSZWZ1bmQgPSAnVEFYX1JFRlVORCcsXG4gICAgQmVuZWZpdE90aGVyID0gJ0JFTkVGSVRfT1RIRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3YXJuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlIHtcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gICAgSW5zdWZmaWNpZW50Q3JlZGVudGlhbHMgPSAnSU5TVUZGSUNJRU5UX0NSRURFTlRJQUxTJyxcbiAgICBJdGVtTG9ja2VkID0gJ0lURU1fTE9DS0VEJyxcbiAgICBVc2VyU2V0dXBSZXF1aXJlZCA9ICdVU0VSX1NFVFVQX1JFUVVJUkVEJyxcbiAgICBDb3VudHJ5Tm90U3VwcG9ydGVkID0gJ0NPVU5UUllfTk9UX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Eb3duID0gJ0lOU1RJVFVUSU9OX0RPV04nLFxuICAgIEluc3RpdHV0aW9uTm9Mb25nZXJTdXBwb3J0ZWQgPSAnSU5TVElUVVRJT05fTk9fTE9OR0VSX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Ob3RSZXNwb25kaW5nID0gJ0lOU1RJVFVUSU9OX05PVF9SRVNQT05ESU5HJyxcbiAgICBJbnZhbGlkQ3JlZGVudGlhbHMgPSAnSU5WQUxJRF9DUkVERU5USUFMUycsXG4gICAgSW52YWxpZE1mYSA9ICdJTlZBTElEX01GQScsXG4gICAgSW52YWxpZFNlbmRNZXRob2QgPSAnSU5WQUxJRF9TRU5EX01FVEhPRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgTWZhTm90U3VwcG9ydGVkID0gJ01GQV9OT1RfU1VQUE9SVEVEJyxcbiAgICBOb0FjY291bnRzID0gJ05PX0FDQ09VTlRTJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgQWNjZXNzTm90R3JhbnRlZCA9ICdBQ0NFU1NfTk9UX0dSQU5URUQnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXF1ZXN0IG9wdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgQmFuayBJbmNvbWUgUmVwb3J0cyBzaG91bGQgYmUgZmV0Y2hlZC4gTXVsdGlwbGUgcmVwb3J0cyBtYXkgYmUgYXZhaWxhYmxlIGlmIHRoZSByZXBvcnQgaGFzIGJlZW4gcmUtY3JlYXRlZCBvciByZWZyZXNoZWQuIElmIG1vcmUgdGhhbiBvbmUgcmVwb3J0IGlzIGF2YWlsYWJsZSwgdGhlIG1vc3QgcmVjZW50IHJlcG9ydHMgd2lsbCBiZSByZXR1cm5lZCBmaXJzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW5kIHVzZXJcXCdzIG1vbnRobHkgc3VtbWFyeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKSBvZiB0aGUgdXNlciBmb3IgdGhlIG1vbnRoIGluIHRoZSBzdW1tYXJ5LiBUaGlzIG1heSByZXR1cm4gYW4gaW5jb3JyZWN0IHZhbHVlIGlmIHRoZSBzdW1tYXJ5IGluY2x1ZGVzIGluY29tZSBzb3VyY2VzIGluIG11bHRpcGxlIGN1cnJlbmNpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1pdGVtcy1iYW5rLWluY29tZS1zb3VyY2VzLWhpc3RvcmljYWwtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1pdGVtcy1iYW5rLWluY29tZS1zb3VyY2VzLWhpc3RvcmljYWwtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBwZXJpb2QgaW5jbHVkZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW1cXCdzIGFjY291bnRzIHRoYXQgaGF2ZSBCYW5rIEluY29tZSBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfYWNjb3VudHM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIGluY29tZSBzb3VyY2VzIGZvciB0aGlzIEl0ZW0uIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgc2luZ2xlIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3NvdXJjZXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIHBheSBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5IHtcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIERhaWx5ID0gJ0RBSUxZJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IGRheXMgb2YgZGF0YSB0byBpbmNsdWRlIGluIHRoZSByZWZyZXNoLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGF5cyByZXF1ZXN0ZWQgaW4gdGhlIG1vc3QgcmVjZW50bHkgZ2VuZXJhdGVkIGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcnk/OiBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBTdW1tYXJ5IGZvciBiYW5rIGluY29tZSBhY3Jvc3MgYWxsIGluY29tZSBzb3VyY2VzIGFuZCBpdGVtcyAobWF4IGhpc3Rvcnkgb2YgNzMwIGRheXMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgYWNyb3NzIGFsbCB0aGUgaW5jb21lIHNvdXJjZXMgaW4gdGhlIGVuZCB1c2VyXFwncyBJdGVtcyBmb3IgdGhlIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBlbmQgdXNlclxcJ3MgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U/OiBDcmVkaXRCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYElERU5USVRZX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgaWRlbnRpdHkgZm9yIHRoZSBJdGVtIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCB0cmFuc2FjdGlvbnMgZm9yIHRoZSBJdGVtIGBJVEVNX1VOQVBQUk9WRURgOiBVc2VyIGV4aXRlZCBmbG93IGJlZm9yZSBnaXZpbmcgcGVybWlzc2lvbiB0byBzaGFyZSBkYXRhIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIEl0ZW1VbmFwcHJvdmVkID0gJ0lURU1fVU5BUFBST1ZFRCcsXG4gICAgUmVwb3J0RGVsZXRlZCA9ICdSRVBPUlRfREVMRVRFRCcsXG4gICAgRGF0YVVuYXZhaWxhYmxlID0gJ0RBVEFfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogVGhlIHdhcm5pbmcgdHlwZSB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFOS19JTkNPTUVfV0FSTklOR2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGUge1xuICAgIEJhbmtJbmNvbWVXYXJuaW5nID0gJ0JBTktfSU5DT01FX1dBUk5JTkcnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2FjdGl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVpciBpbmNvbWUgY2hhbmdlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmFibGVfd2ViaG9va3M6IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgb3duZXIgb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB1c2VyXFwncyBiYW5rIGFjY291bnQgcmVsYXRlZCB0byBhbiB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBlcmlvZCBvYmplY3RzLCBjb250YWluaW5nIG1vcmUgZGF0YSBvbiB0aGUgb3ZlcmFsbCBwZXJpb2Qgb2YgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcGVyaW9kczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBiYW5rIGFjY291bnQgZm9yIHRoZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kaW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHN0YXRlbWVudCB1cGxvYWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdCB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoYXQgbW9uZXkgbW92ZWQgaW50byB0aGUgYWNjb3VudCAoc3VjaCBhcyBhIHBheWNoZWNrIGJlaW5nIGRlcG9zaXRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBtYWRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gYXMgaXQgYXBwZWFycyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgYmFuayBhY2NvdW50IHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnMgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB3aG9zZSBiYW5rIHN0YXRlbWVudHMgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjcmVkaXQgY2FyZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFyaW91cyBpbnRlcmVzdCByYXRlcyB0aGF0IGFwcGx5IHRvIHRoZSBhY2NvdW50LiBBUFIgaW5mb3JtYXRpb24gaXMgbm90IHByb3ZpZGVkIGJ5IGFsbCBjYXJkIGlzc3VlcnM7IGlmIEFQUiBkYXRhIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QVBSPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFwcnM6IEFycmF5PEFQUj47XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiBhIHBheW1lbnQgaXMgY3VycmVudGx5IG92ZXJkdWUuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG93ZWQgYXMgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IGlzc3VlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBjcmVkaXQgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgY3N2IGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIGNyZWRpdCBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBQQVlTVFVCYDogQSBwYXlzdHViLiAgYEJBTktfU1RBVEVNRU5UYDogQSBiYW5rIHN0YXRlbWVudC4gIGBVU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYFVTX01JTElUQVJZX0VSQVNgOiBBbiBlbGVjdHJvbmljIFJldGlyZW1lbnQgQWNjb3VudCBTdGF0ZW1lbnQgKGVSQVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfTEVTYDogQSBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdGVtZW50IChMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBHSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBQTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREZgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIFBERiBmb3IgdGhlIHBheXN0dWIgd2FzIGdlbmVyYXRlZCBieSBQbGFpZC4gIGBOT05FYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgZm9yIHRoZSBkYXRhLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBVUkwgdG8gcmV0cmlldmUgdGhlIGRvY3VtZW50KHMpLiBUaGUgcGF5bG9hZCB3aWxsIGJlIGEgLnppcCBmaWxlIGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50KHMpLiAgRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgZmlsZSB0eXBlIG9mIHRoZSBkb2N1bWVudHMgd2lsbCBhbHdheXMgYmUgUERGLCBhbmQgdGhlIGRvY3VtZW50cyBtYXkgbm90IGJlIGF2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgZmllbGQgd2lsbCBiZSBgbnVsbGAuIElmIHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGdlbmVyYXRlIGEgUERGIGlmIHRoZSBvcmlnaW5hbCBpcyBub3QgYXZhaWxhYmxlLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBbRXhhbXBsZSBnZW5lcmF0ZWQgcGF5IHN0dWJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wbGFpZC1nZW5lcmF0ZWQtbW9jay1wYXlzdHViLnBkZikuICBGb3IgRG9jdW1lbnQgSW5jb21lLCB0aGlzIGZpZWxkIHdpbGwgbm90IGJlIGBudWxsYCwgYW5kIHRoZSBmaWxlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQocykgd2lsbCBiZSB0aGUgb3JpZ2luYWwgZmlsZSB0eXBlIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLiBGb3IgbW9yZSBkZXRhaWxzIG9uIGF2YWlsYWJsZSBmaWxlIHR5cGVzLCBzZWUgdGhlIFtEb2N1bWVudCBJbmNvbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaW5jb21lL3BheXJvbGwtaW5jb21lKSBkb2N1bWVudGF0aW9uLiAgVGhpcyBkb3dubG9hZCBVUkwgY2FuIG9ubHkgYmUgdXNlZCBvbmNlIGFuZCBleHBpcmVzIGFmdGVyIHR3byBtaW51dGVzLiBUbyBnZW5lcmF0ZSBhIG5ldyBkb3dubG9hZCBVUkwsIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBhZ2Fpbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZG93bmxvYWRfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBvZiB0aGUgZG9jdW1lbnQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBkb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC4gIGBET0NVTUVOVF9FUlJPUmA6IFRoZSBkb2N1bWVudCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkLiBQb3NzaWJsZSBjYXVzZXMgaW5jbHVkZTogVGhlIGRvY3VtZW50IHdhcyBhbiB1bmFjY2VwdGFibGUgZG9jdW1lbnQgdHlwZSBzdWNoIGFzIGFuIG9mZmVyIGxldHRlciBvciBiYW5rIHN0YXRlbWVudCwgdGhlIGRvY3VtZW50IGltYWdlIHdhcyBjcm9wcGVkIG9yIGJsdXJyeSwgb3IgdGhlIGRvY3VtZW50IHdhcyBjb3JydXB0ZWQuICBgVU5LTk9XTmAgb3IgYG51bGxgOiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gSWYgdGhpcyBoYXBwZW5zIHJlcGVhdGVkbHksIGNvbnRhY3Qgc3VwcG9ydCBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIHVwbG9hZGVkIGRvY3VtZW50IChpZiBhdmFpbGFibGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBwYWdlX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHdoeSBhIGZhaWx1cmUgb2NjdXJyZWQgZHVyaW5nIGRvY3VtZW50IHByb2Nlc3NpbmcgKGlmIGF2YWlsYWJsZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGVtcGxveW1lbnQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95bWVudCBpdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBlbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogVG9rZW4gdG8gcmVwcmVzZW50IHRoZSB1bmRlcmx5aW5nIEVtcGxveW1lbnQgZGF0YVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgZW1wbG95bWVudCBzdGF0dXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGFydCBvZiBlbXBsb3ltZW50IGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGVtcGxveW1lbnQsIGlmIGFwcGxpY2FibGUuIFByb3ZpZGVkIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdGl0bGUgb2YgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQbGF0Zm9ybUlkc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBsYXRmb3JtX2lkczogQ3JlZGl0UGxhdGZvcm1JZHM7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1wbG95bWVudCBmb3IgdGhlIGluZGl2aWR1YWwuIGBcXFwiRlVMTF9USU1FXFxcImA6IEEgZnVsbC10aW1lIGVtcGxveWVlLiBgXFxcIlBBUlRfVElNRVxcXCJgOiBBIHBhcnQtdGltZSBlbXBsb3llZS4gYFxcXCJDT05UUkFDVE9SXFxcImA6IEFuIGVtcGxveWVlIHR5cGljYWxseSBoaXJlZCBleHRlcm5hbGx5IHRocm91Z2ggYSBjb250cmFjdGluZyBncm91cC4gYFxcXCJURU1QT1JBUllcXFwiYDogQSB0ZW1wb3JhcnkgZW1wbG95ZWUuIGBcXFwiT1RIRVJcXFwiYDogVGhlIGVtcGxveWVlIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUgYWJvdmUgZGVmaW5lZCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZWVfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZW1wbG95ZWVcXCdzIG1vc3QgcmVjZW50IHBheXN0dWIgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9wYXlzdHViX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXREZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0RFVEFJTDogQXNzZXREZXRhaWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0T3duZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfSE9MREVSOiBBc3NldEhvbGRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfSE9MRElOR1M/OiBBc3NldEhvbGRpbmdzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OUzogQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgVkFMSURBVElPTl9TT1VSQ0VTOiBWYWxpZGF0aW9uU291cmNlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZy4uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRUcmFuc2FjdGlvbkRldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVRBSUw6IEFzc2V0VHJhbnNhY3Rpb25EZXRhaWw7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFU0NSSVBUSU9OOiBBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT046IEFycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0cyB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRzXG4gICAgICovXG4gICAgQVNTRVQ6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldD47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBGaXJzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIExhc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1pZGRsZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIE1pZGRsZU5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBtb3J0Z2FnZSBsb2FuIGFncmVlbWVudCBiZXR3ZWVuIG9uZSBvciBtb3JlIGJvcnJvd2VycyBhbmQgYSBtb3J0Z2FnZSBsZW5kZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW4ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hblxuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUlM6IENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnM7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBsb2FuLiBUaGUgdmFsdWUgY2FuIG9ubHkgYmUgXFxcIlN1YmplY3RMb2FuXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hblxuICAgICAqL1xuICAgIExvYW5Sb2xlVHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGN1cnJlbnQgYW5kIHByZXZpb3VzIGlkZW50aWZpZXJzIGZvciB0aGlzIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbklkZW50aWZpZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSOiBBcnJheTxMb2FuSWRlbnRpZmllcj47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsb2FucyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2luZ2xlIGRlYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2Fuc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAgICAgKi9cbiAgICBMT0FOOiBDcmVkaXRGcmVkZGllTWFjTG9hbjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgcGFydGllcyB0byBhIGRlYWwuIFRoaXMgaW5jbHVkZXMgdGhlIGRpcmVjdCBwYXJ0aWNpcGF0aW5nIHBhcnRpZXMsIHN1Y2ggYXMgYm9ycm93ZXIgYW5kIHNlbGxlciBhbmQgdGhlIGluZGlyZWN0IHBhcnRpZXMgc3VjaCBhcyB0aGUgY3JlZGl0IHJlcG9ydCBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydGllcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBwYXJ0eSB0byBhIHRyYW5zYWN0aW9uLiBJbmNsdWRlZCBkaXJlY3QgcGFydGljaXBhbnRzIGxpa2UgdGhlIGJvcnJvd2VyIGFuZCBzZWxsZXIgYXMgd2VsbCBhcyBpbmRpcmVjdCBwYXJ0aWNpcGFudHMgc3VjaCBhcyB0aGUgZmxvb2QgY2VydGlmaWNhdGUgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIElORElWSURVQUw6IENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBST0xFUzogUm9sZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVJTOiBUYXhwYXllcklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJlcG9ydCBpZGVudGlmaWVyIGFuZCBhIHJlcG9ydCBuYW1lLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb24ge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnREYXRlVGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBcXFwiUmVwb3J0SURcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydElkZW50aWZpZXJUeXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvblBhcmVudElkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uSWRlbnRpZmllcjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgREVBTDogQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyAoVk9BKSBzY2hlbWEgdmVyc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgU2NoZW1hVmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZm9yIHNlcnZpY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2U7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlQ6IFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgVkVSSUZJQ0FUSU9OX09GX0FTU0VUX1JFU1BPTlNFOiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBzY2hlbWEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0xvYW5zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgTE9BTlM6IENyZWRpdEZyZWRkaWVNYWNMb2FucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1BhcnRpZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBDcmVkaXRGcmVkZGllTWFjUGFydGllcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgU0VSVklDRVM6IENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbmQgdXNlclxcJ3MgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkRlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVhcm5pbmdzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZWFybmluZ3M6IENyZWRpdFBheVN0dWJFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IENyZWRpdFBheVN0dWJFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1Yk5ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IENyZWRpdFBheVN0dWJOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlTdHViUGF5UGVyaW9kRGV0YWlscztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw6IFBheVN0dWJEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCBhIGJyZWFrZG93biBvZiBlYXJuaW5ncyBvbiBhIHBheSBzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFYXJuaW5ncyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8UGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YkVhcm5pbmdzVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsOiBQYXlTdHViRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYFNJTkdMRWAgb3IgYE1BUlJJRURgIG9yIGBOT1QgTElTVEVEYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YlRheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkOiBQYXlTdHViVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBvbiB0aGUgcGF5IHN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1Yk5ldFBheSB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgbmV0IHBheSBmb3IgdGhlIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBuZXQgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBleHBsaWNpdCBwYXkgYmFzaXMgb24gdGhlIHBheXN0dWIgKGlmIHByZXNlbnQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgSG91cmx5ID0gJ0hPVVJMWScsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJ1xufVxuXG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgd2hvc2UgcGF5cm9sbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZC4gRWFjaCBgaXRlbV9pZGAgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGF5cm9sbCBpbmNvbWUgaXRlbS4gSWYgdGhpcyBmaWVsZCBpcyBub3QgcHJvdmlkZWQsIGFsbCBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIHdpbGwgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIGJvZHkgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcGF5cm9sbCBpdGVtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8UGF5cm9sbEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGFuYWx5c2lzIHRvIGVuYWJsZSBmb3IgdGhlIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWc6IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm99XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c19taWxpdGFyeV9pbmZvPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHBheXJvbGxfaW5zdGl0dXRpb24/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgdG8gYmUgcmVmcmVzaGVkLiBFYWNoIGBpdGVtX2lkYCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCBiZSByZWZyZXNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB3aGVyZSBQbGFpZCB3aWxsIHNlbmQgdGhlIHBheXJvbGwgaW5jb21lIHJlZnJlc2ggd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVVNFUl9QUkVTRU5DRV9SRVFVSVJFRFxcXCJgIFVzZXIgcHJlc2VuY2UgaXMgcmVxdWlyZWQgdG8gcmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uLiBgXFxcIlNVQ0NFU1NGVUxcXFwiYCBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoIHdhcyBzdWNjZXNzZnVsLiBgXFxcIk5PVF9GT1VORFxcXCJgIE5vIG5ldyBkYXRhIHdhcyBmb3VuZCBhZnRlciB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fcmVmcmVzaF9zdGF0dXM6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcGF5cm9sbCBpdGVtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbFJpc2tTaWduYWxzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgYSBzZXQgb2YgaWRzIHJlbGF0ZWQgdG8gYW4gZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBsYXRmb3JtSWRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGxhdGZvcm1JZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhbiBlbXBsb3llZSBhcyBnaXZlbiBieSB0aGVpciBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIGVtcGxveWVlX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhbiBlbXBsb3llZSBhcyBnaXZlbiBieSB0aGVpciBwYXlyb2xsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBvc2l0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuIHN0cmluZ3MsIHdpdGggYXQgbW9zdCBvbmUgdG9rZW4gb2YgZWFjaCByZXBvcnQgdHlwZS4gQ3VycmVudGx5IG9ubHkgQXNzZXQgUmVwb3J0IHRva2VuIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY29uZGFyeV9jbGllbnRfaWRgIGlzIHRoZSBjbGllbnQgaWQgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgcmVsYXkgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2Vjb25kYXJ5X2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgd2ViaG9va3Mgd2hlbiB0aGUgU2Vjb25kYXJ5IENsaWVudCBzdWNjZXNzZnVsbHkgcmV0cmlldmVzIGFuIEFzc2V0IFJlcG9ydCBieSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgdG8gYWxsb3cgdGhlbSB0byBhY2Nlc3MgdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBgZmFsc2VgIG90aGVyd2lzZS4gVGhpcyBmaWVsZCBkZWZhdWx0cyB0byBgZmFsc2VgIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW5zaWdodHM/OiBib29sZWFuO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSByZXBvcnQgeW91IHdvdWxkIGxpa2UgdG8gcmVmcmVzaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBSZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIHdoZW4gdGhlIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuIGhhcyBiZWVuIHJlZnJlc2hlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSByZWxheSB0b2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhbmQgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIExpbmsgc2Vzc2lvbi4gVGhpcyBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIGBsaW5rX3Nlc3Npb25faWRgIHJldHVybmVkIGluIHRoZSBvblN1Y2Nlc3Mvb25FeGl0IGNhbGxiYWNrcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIExpbmsgc2Vzc2lvbiBzdGFydGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHNlc3Npb25fc3RhcnRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvblJlc3VsdHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICByZXN1bHRzPzogQ3JlZGl0U2Vzc2lvblJlc3VsdHM7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBlcnJvcnMgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIGVycm9ycz86IEFycmF5PENyZWRpdFNlc3Npb25FcnJvcj47XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgYmFuayBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbiBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIHN0YXR1cz86IENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogU3RhdHVzIG9mIHRoZSBCYW5rIEVtcGxveW1lbnQgTGluayBzZXNzaW9uLiAgYEFQUFJPVkVEYDogVXNlciBoYXMgYXBwcm92ZWQgYW5kIHZlcmlmaWVkIHRoZWlyIGVtcGxveW1lbnQuICBgTk9fRU1QTE9ZRVJTX0ZPVU5EYDogV2UgYXR0ZW1wdGVkLCBidXQgd2VyZSB1bmFibGUgdG8gZmluZCBhbnkgZW1wbG95bWVudCBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgRU1QTE9ZRVJfTk9UX0xJU1RFRGA6IFRoZSB1c2VyIGV4cGxpY2l0bHkgaW5kaWNhdGVkIHRoYXQgdGhleSBkaWQgbm90IHNlZSB0aGVpciBjdXJyZW50IG9yIHByZXZpb3VzIGVtcGxveWVyIGluIHRoZSBsaXN0IG9mIGVtcGxveWVyIG5hbWVzIGZvdW5kLiAgYFNUQVJURURgOiBUaGUgdXNlciBiZWdhbiB0aGUgYmFuayBlbXBsb3ltZW50IHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9FbXBsb3llcnNGb3VuZCA9ICdOT19FTVBMT1lFUlNfRk9VTkQnLFxuICAgIEVtcGxveWVyTm90TGlzdGVkID0gJ0VNUExPWUVSX05PVF9MSVNURUQnLFxuICAgIFN0YXJ0ZWQgPSAnU1RBUlRFRCcsXG4gICAgSW50ZXJuYWxFcnJvciA9ICdJTlRFUk5BTF9FUlJPUidcbn1cblxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgQmFuayBJbmNvbWUgTGluayBzZXNzaW9uLiAgYEFQUFJPVkVEYDogVXNlciBoYXMgYXBwcm92ZWQgYW5kIHZlcmlmaWVkIHRoZWlyIGluY29tZSAgYE5PX0RFUE9TSVRTX0ZPVU5EYDogV2UgYXR0ZW1wdGVkLCBidXQgd2VyZSB1bmFibGUgdG8gZmluZCBhbnkgaW5jb21lIGluIHRoZSBjb25uZWN0ZWQgYWNjb3VudC4gIGBVU0VSX1JFUE9SVEVEX05PX0lOQ09NRWA6IFRoZSB1c2VyIGV4cGxpY2l0bHkgaW5kaWNhdGVkIHRoYXQgdGhleSBkb25cXCd0IHJlY2VpdmUgaW5jb21lIGluIHRoZSBjb25uZWN0ZWQgYWNjb3VudC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgaW5jb21lIHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXMge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBOb0RlcG9zaXRzRm91bmQgPSAnTk9fREVQT1NJVFNfRk9VTkQnLFxuICAgIFVzZXJSZXBvcnRlZE5vSW5jb21lID0gJ1VTRVJfUkVQT1JURURfTk9fSU5DT01FJyxcbiAgICBTdGFydGVkID0gJ1NUQVJURUQnLFxuICAgIEludGVybmFsRXJyb3IgPSAnSU5URVJOQUxfRVJST1InXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBheXN0dWJzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9wYXlzdHVic191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdzJzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV93MnNfdXBsb2FkZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fYmFua19zdGF0ZW1lbnRzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiAxMDk5cyB1cGxvYWRlZCBieSB0aGUgdXNlclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV8xMDk5c191cGxvYWRlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIExpbmsgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25FcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25FcnJvciB7XG4gICAgLyoqXG4gICAgICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYW4gSXRlbSBhZGQgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBheXN0dWJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9wYXlzdHVic19yZXRyaWV2ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB3MnMgcmV0cmlldmVkIGZyb20gYSBwYXlyb2xsIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3cyc19yZXRyaWV2ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnN0aXR1dGlvbiBOYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblJlc3VsdHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgSXRlbSBhZGRzIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgaXRlbV9hZGRfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pbmNvbWVfcmVzdWx0cz86IENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdCB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9zZXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgTGluayBzZXNzaW9ucyBmb3IgdGhlIHVzZXIuIFNlc3Npb25zIHdpbGwgYmUgc29ydGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZXNzaW9ucz86IEFycmF5PENyZWRpdFNlc3Npb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXMiBpcyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGluY29tZSBkYXRhIHRha2VuIGZyb20gYSBXMiB0YXggZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFcyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0VzIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhOiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRQYXlTdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogQ3JlZGl0UGF5U3R1YkVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggeWVhciBvZiB0aGUgVzIgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB0YXhfeWVhcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBlbXBsb3llZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb3IgRUlOLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gU29jaWFsIFNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBTZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSBtZWRpY2FyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1lZGljYXJlIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBTb2NpYWwgU2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvY2F0ZWQgdGlwcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENvbnRlbnRzIGZyb20gYm94IDkgb24gdGhlIFcyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYm94Xzk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOb25xdWFsaWZpZWQgcGxhbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyQm94MTI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGJveF8xMjogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJldGlyZW1lbnQgcGxhbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHJldGlyZW1lbnRfcGxhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlyZCBwYXJ0eSBzaWNrIHBheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3NpY2tfcGF5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgb3RoZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM6IEFycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPjtcbn1cbi8qKlxuICogRGF0YSB0byBwb3B1bGF0ZSBhcyB0ZXN0IHRyYW5zYWN0aW9uIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEN1c3RvbVNhbmRib3hUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVNhbmRib3hUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBUcmFuc2FjdGlvbiBkYXRlIG11c3QgYmUgdGhlIHByZXNlbnQgZGF0ZSBvciBhIGRhdGUgdXAgdG8gMTQgZGF5cyBpbiB0aGUgcGFzdC4gRnV0dXJlIGRhdGVzIGFyZSBub3QgYWxsb3dlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21TYW5kYm94VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBQb3N0ZWQgZGF0ZSBtdXN0IGJlIHRoZSBwcmVzZW50IGRhdGUgb3IgYSBkYXRlIHVwIHRvIDE0IGRheXMgaW4gdGhlIHBhc3QuIEZ1dHVyZSBkYXRlcyBhcmUgbm90IGFsbG93ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tU2FuZGJveFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV9wb3N0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LiBDYW4gYmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tU2FuZGJveFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEN1c3RvbVNhbmRib3hUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGZvcm1hdCBjdXJyZW5jeSBjb2RlIGZvciB0aGUgdHJhbnNhY3Rpb24uIERlZmF1bHRzIHRvIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21TYW5kYm94VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIG9mIGFuIHVuYXV0aG9yaXplZCBkZWJpdC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDVcXFwiLCBcXFwiUjA3XFxcIiwgXFxcIlIxMFxcXCIsIFxcXCJSMTFcXFwiLCBcXFwiUjI5XFxcIi4gVGhlc2UgcmV0dXJucyB0eXBpY2FsbHkgaGF2ZSBhIHJldHVybiB0aW1lIGZyYW1lIG9mIHVwIHRvIDYwIGNhbGVuZGFyIGRheXMuIER1cmluZyB0aGlzIHBlcmlvZCwgdGhlIGN1c3RvbWVyIG9mIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY2FuIGRpc3B1dGUgYSB0cmFuc2FjdGlvbiBhcyB1bmF1dGhvcml6ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza1xuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRC4gVXNlIFNpZ25hbCBSdWxlcyBpbnN0ZWFkIHRvIHRyYW5zZm9ybSB0aGUgYHNjb3JlYCBpbnRvIGEgdXNlZnVsIGFjdGlvbi4gIEEgdGllciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9qZWN0ZWQgbGlrZWxpaG9vZCB0aGF0IHRoZSB0cmFuc2FjdGlvbiwgaWYgaW5pdGlhdGVkLCB3aWxsIGJlIHN1YmplY3QgdG8gYSByZXR1cm4uICBJbiB0aGUgYGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlza2Agb2JqZWN0LCB0aGVyZSBhcmUgZml2ZSByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDAlIC0gMC4wMiUgICAyOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDIlIC0gMC4wNSUgICAzOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDUlIC0gMC4xJSAgIDQ6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4xJSAtIDAuNSUgICA1OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gMC41JSBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJpc2tfdGllcjogbnVtYmVyO1xufVxuLyoqXG4gKiBBY2NvdW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHRlYW0gbWVtYmVyIHdpdGggYWNjZXNzIHRvIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Rhc2hib2FyZFVzZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IERhc2hib2FyZFVzZXJTdGF0dXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGEgZGFzaGJvYXJkIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgdGVhbSBtZW1iZXIgd2l0aCBhY2Nlc3MgdG8gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Rhc2hib2FyZFVzZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGRhc2hib2FyZCB1c2Vyc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGRhc2hib2FyZCB1c2Vyc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBkYXNoYm9hcmQgdXNlcnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGFzaGJvYXJkVXNlcj59XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcnM6IEFycmF5PERhc2hib2FyZFVzZXI+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERhc2hib2FyZFVzZXJTdGF0dXMge1xuICAgIEludml0ZWQgPSAnaW52aXRlZCcsXG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgRGVhY3RpdmF0ZWQgPSAnZGVhY3RpdmF0ZWQnXG59XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgc291cmNlIG9mIGRhdGEgZm9yIGEgZ2l2ZW4gcHJvZHVjdC9kYXRhIHR5cGUuICBgSU5TVElUVVRJT05gOiBUaGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgdGhpcyBwcm9kdWN0LCBhbmQgdGhlIGRhdGEgd2FzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gYElOU1RJVFVUSU9OX01BU0tgOiBUaGUgdXNlciBtYW51YWxseSBwcm92aWRlZCB0aGUgZnVsbCBhY2NvdW50IG51bWJlciwgd2hpY2ggd2FzIG1hdGNoZWQgdG8gdGhlIGFjY291bnQgbWFzayBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIE9ubHkgYXBwbGljYWJsZSB0byB0aGUgYG51bWJlcnNgIGRhdGEgdHlwZS4gYFVTRVJgOiBUaGUgaW5zdGl0dXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHByb2R1Y3QsIGFuZCB0aGUgZGF0YSB3YXMgbWFudWFsbHkgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEYXRhU291cmNlcyB7XG4gICAgSW5zdGl0dXRpb24gPSAnSU5TVElUVVRJT04nLFxuICAgIEluc3RpdHV0aW9uTWFzayA9ICdJTlNUSVRVVElPTl9NQVNLJyxcbiAgICBVc2VyID0gJ1VTRVInXG59XG5cbi8qKlxuICogQSBkYXRlIHJhbmdlIHdpdGggYSBzdGFydCBhbmQgZW5kIGRhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGF0ZVJhbmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlIHtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGF0ZVJhbmdlXG4gICAgICovXG4gICAgYmVnaW5uaW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhdGVSYW5nZVxuICAgICAqL1xuICAgIGVuZGluZzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PFRvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IEFycmF5PERlZHVjdGlvbnNCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PFRvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVkdWN0aW9uc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw6IERlZHVjdGlvbnNUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdG90YWwgZGVkdWN0aW9ucyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9uc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgYW4gSXRlbS4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gdGhlIHdlYmhvb2sgcmVsYXRlcyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1kZXBvc2l0b3J5KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRvcnlBY2NvdW50U3VidHlwZSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgQ2QgPSAnY2QnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIExpbWl0ZWRQdXJwb3NlQ2hlY2tpbmcgPSAnbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nJyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0b3J5RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdG9yeUZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgbGltaXRlZCBwdXJwb3NlIHR5cGVzLiBSZXN0cmljdHMgd2hpY2gga2luZHMgb2YgbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nIGFjY291bnRzIG1heSBiZSBjb25uZWN0ZWQgaW4gTGluayB0byBwcmV2ZW50IHVzZXJzIGZyb20gY29ubmVjdGluZyB0aGVtIGZvciB1bnN1cHBvcnRlZCB1c2UgY2FzZXMuIFJlcXVpcmVkIHdoZW4gXFwnbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nXFwnIGlzIGluIHRoZSBzdWJ0eXBlcyBmaWx0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PExpbWl0ZWRQdXJwb3NlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRvcnlGaWx0ZXJcbiAgICAgKi9cbiAgICBsaW1pdGVkX3B1cnBvc2VfdHlwZXM/OiBBcnJheTxMaW1pdGVkUHVycG9zZVR5cGU+O1xufVxuLyoqXG4gKiBPcmlnaW5hdG9yIGFuZCB0aGVpciBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvciB7XG4gICAgLyoqXG4gICAgICogT3JpZ2luYXRvclxcJ3MgY2xpZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRpbGlnZW5jZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGV0YWlsZWRPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2Ygb3V0c3RhbmRpbmcgcmVxdWlyZW1lbnRzIHRoYXQgbXVzdCBiZSBzdWJtaXR0ZWQgYmVmb3JlIFBsYWlkIGNhbiBhcHByb3ZlIHRoZSBvcmlnaW5hdG9yLiBPbmx5IHBvcHVsYXRlZCB3aGVuIGB0cmFuc2Zlcl9kaWxpZ2VuY2Vfc3RhdHVzYCBpcyBgbW9yZV9pbmZvcm1hdGlvbl9yZXF1aXJlZGAuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD59XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX3JlcXVpcmVtZW50cz86IEFycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD47XG59XG4vKipcbiAqIEEgcG9zc2libGUgYWNjb3VudCBkZXRlY3RlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRlY3RlZEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRlY3RlZEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRlY3RlZCBhY2NvdW50IHR5cGUgKGRlcG9zaXRvcnksIGNyZWRpdCwgbG9hbiwgaW52ZXN0bWVudCBldGMuKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbnMgdG8vZnJvbSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogRGV2aWNlIElkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBsaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGV2aWNlSWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VJZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV2aWNlSWRcbiAgICAgKi9cbiAgICB0eXBlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBkZXZpY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXZpY2VJZFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBET0NVTUVOVF9UWVBFX1BBWVNUVUJgOiBBIHBheXN0dWIuICBgRE9DVU1FTlRfVFlQRV9CQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgRE9DVU1FTlRfVFlQRV9VU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBU2A6IEFuIGVsZWN0cm9uaWMgUmV0aXJlbWVudCBBY2NvdW50IFN0YXRlbWVudCAoZVJBUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX0dJR2A6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5jb21lIGlzIHJlbGF0ZWQgdG8gZ2lnIHdvcmsuIERvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYyBkb2N1bWVudCB0eXBlLiAgYERPQ1VNRU5UX1RZUEVfTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERmA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUERGIGZvciB0aGUgcGF5c3R1YiB3YXMgZ2VuZXJhdGVkIGJ5IFBsYWlkLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jVHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBEb2N1bWVudFR5cGVQYXlzdHViID0gJ0RPQ1VNRU5UX1RZUEVfUEFZU1RVQicsXG4gICAgRG9jdW1lbnRUeXBlQmFua1N0YXRlbWVudCA9ICdET0NVTUVOVF9UWVBFX0JBTktfU1RBVEVNRU5UJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheFcyID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5RXJhcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlMZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlDbGVzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFUycsXG4gICAgRG9jdW1lbnRUeXBlR2lnID0gJ0RPQ1VNRU5UX1RZUEVfR0lHJyxcbiAgICBEb2N1bWVudFR5cGVOb25lID0gJ0RPQ1VNRU5UX1RZUEVfTk9ORScsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5TWlzYyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X01JU0MnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4MTA5OUsgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9LJyxcbiAgICBEb2N1bWVudFR5cGVQbGFpZEdlbmVyYXRlZFBheXN0dWJQZGYgPSAnRE9DVU1FTlRfVFlQRV9QTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREYnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBwcm9jZXNzZWQuIElmIGEgZG9jdW1lbnQgZmFpbHMgdmVyaWZpY2F0aW9uLCB0aGUgZGV0YWlscyBpbiB0aGUgYGFuYWx5c2lzYCBvYmplY3Qgc2hvdWxkIGhlbHAgY2xhcmlmeSB3aHkgdGhlIGRvY3VtZW50IHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGF1dGhlbnRpY2l0eTogRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGltYWdlX3F1YWxpdHk6IEltYWdlUXVhbGl0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbmFseXNpc0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBmcmF1ZF9hbmFseXNpc19kZXRhaWxzOiBGcmF1ZEFuYWx5c2lzRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpbWFnZV9xdWFsaXR5X2RldGFpbHM6IEltYWdlUXVhbGl0eURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIdW1hblJldmlld31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGh1bWFuX3Jldmlldz86IEh1bWFuUmV2aWV3IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGFhbXZhX3ZlcmlmaWNhdGlvbjogQUFNVkFBbmFseXNpcyB8IG51bGw7XG59XG4vKipcbiAqIEhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB3aGV0aGVyIHRoZSBkb2N1bWVudCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UgbWF0Y2hlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBhbmQgc2VjdXJpdHkgY2hlY2tzIGZvciB0aGUgYXNzb2NpYXRlZCBqdXJpc2RpY3Rpb24uICBGb3IgZXhhbXBsZSwgbW9zdCBpZGVudGl0eSBkb2N1bWVudHMgaGF2ZSBmb3JtYXR0aW5nIHJ1bGVzIGxpa2UgdGhlIGZvbGxvd2luZzogICBUaGUgaW1hZ2Ugb2YgdGhlIHBlcnNvblxcJ3MgZmFjZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGNvbnRyYXN0IGluIG9yZGVyIHRvIGhpZ2hsaWdodCBza2luIHRvbmUgICBUaGUgc3ViamVjdCBpbiB0aGUgZG9jdW1lbnRcXCdzIGltYWdlIG11c3QgcmVtb3ZlIGV5ZSBnbGFzc2VzIGFuZCBwb3NlIGluIGEgY2VydGFpbiB3YXkgICBUaGUgaW5mb3JtYXRpb25hbCBmaWVsZHMgKG5hbWUsIGRhdGUgb2YgYmlydGgsIElEIG51bWJlciwgZXRjLikgbXVzdCBiZSBjb2xvcmVkIGFuZCBhbGlnbmVkIGFjY29yZGluZyB0byBzcGVjaWZpYyBydWxlcyAgIFNlY3VyaXR5IGZlYXR1cmVzIGxpa2Ugd2F0ZXJtYXJrcyBhbmQgYmFja2dyb3VuZCBwYXR0ZXJucyBtdXN0IGJlIHByZXNlbnQgIFNvIGEgYG1hdGNoYCBzdGF0dXMgZm9yIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBzZWVtcyB0byBjb25mb3JtIHRvIHRoZSB2YXJpb3VzIGZvcm1hdHRpbmcgYW5kIHNlY3VyaXR5IHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIG1hdGNoIHN1bW1hcnkgZGVzY3JpYmluZyB0aGUgY3Jvc3MgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzdWJqZWN0XFwncyBkYXRlIG9mIGJpcnRoLCBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UsIGFuZCB0aGUgZGF0ZSBvZiBiaXJ0aCB0aGV5IHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gdGhlIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIGZyb20gdGhlIGVuZCB1c2VyXFwncyB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgdGhhdCBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHBheXN0dWIgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY190eXBlPzogRG9jVHlwZTtcbn1cbi8qKlxuICogQSBtYXRjaCBzdW1tYXJ5IGRlc2NyaWJpbmcgdGhlIGNyb3NzIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3ViamVjdFxcJ3MgbmFtZSwgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLCBhbmQgdGhlIG5hbWUgdGhleSBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIHRoZSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50TmFtZU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGEgY2VydGFpbiByZWFzb24gYXMgdG8gd2h5IGEgZG9jdW1lbnQgY291bGQgcG90ZW50aWFsbHkgYmUgZnJhdWR1bGVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByaXNrIGZvdW5kIGluIHRoZSByaXNrIHNpZ25hbCBjaGVjay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCB3aGljaCB0aGUgcmlzayBzaWduYWwgd2FzIGNvbXB1dGVkIGZvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGZpZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyB1c2VkIHRvIHF1aWNrbHkgaWRlbnRpZnkgaWYgdGhlIHNpZ25hbCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZpZWxkIGlzIGF1dGhlbnRpYyBvciBmcmF1ZHVsZW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGhhc19mcmF1ZF9yaXNrOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbWV0YWRhdGE6IERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCB2YWx1ZSBvZiB0aGUgZmllbGQsIGFzIHNlZW4gb24gdGhlIGRvY3VtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZXhwZWN0ZWRfdmFsdWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlcml2ZWQgdmFsdWUgb2J0YWluZWQgaW4gdGhlIHJpc2sgc2lnbmFsIGNhbGN1bGF0aW9uIHByb2Nlc3MgZm9yIHRoaXMgZmllbGRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBhY3R1YWxfdmFsdWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBwcm92aWRpbmcgbW9yZSBkZXRhaWwgaW50byB0aGUgcGFydGljdWxhciByaXNrIHNpZ25hbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHNpZ25hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZXZhbnQgcGFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJpc2sgc2lnbmFsLiBJZiB0aGUgcmlzayBzaWduYWwgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHBhZ2UsIHRoZSB2YWx1ZSB3aWxsIGJlIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcGFnZV9udW1iZXI6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aGljaCBjb250YWlucyBhZGRpdGlvbmFsIG1ldGFkYXRhIGFib3V0IHRoZSBpbnN0aXR1dGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIHZlcmlmaWNhdGlvbiBhdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmcmF1ZCByaXNrIGRhdGEgZm9yIGEgc2V0IG9mIGluY29tZSBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGRvY3VtZW50IG1ldGFkYXRhIGFuZCBhc3NvY2lhdGVkIHJpc2sgc2lnbmFscyBwZXIgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIHNpbmdsZV9kb2N1bWVudF9yaXNrX3NpZ25hbHM6IEFycmF5PFNpbmdsZURvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmlzayBzaWduYWxzIGNvbXB1dGVkIGZyb20gYSBzZXQgb2YgdXBsb2FkZWQgZG9jdW1lbnRzIGFuZCB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudHNcXCcgbWV0YWRhdGFcbiAgICAgKiBAdHlwZSB7QXJyYXk8TXVsdGlEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgbXVsdGlfZG9jdW1lbnRfcmlza19zaWduYWxzOiBBcnJheTxNdWx0aURvY3VtZW50Umlza1NpZ25hbD47XG59XG4vKipcbiAqIEEgc3VtbWFyeSBhY3Jvc3MgYWxsIHJpc2sgc2lnbmFscyBhc3NvY2lhdGVkIHdpdGggYSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZSwgd2hlcmUgYSBzY29yZSBjbG9zZXIgdG8gMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgdHJ1c3R3b3J0aHkgYW5kIGEgc2NvcmUgY2xvc2VyIHRvIDEwMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgZnJhdWR1bGVudC4gWW91IGNhbiBhdXRvbWF0aWNhbGx5IHJlamVjdCBkb2N1bWVudHMgd2l0aCBhIGhpZ2ggcmlzayBzY29yZSwgYXV0b21hdGljYWxseSBhY2NlcHQgZG9jdW1lbnRzIHdpdGggYSBsb3cgcmlzayBzY29yZSwgYW5kIG1hbnVhbGx5IHJldmlldyBkb2N1bWVudHMgaW4gYmV0d2Vlbi4gV2Ugc3VnZ2VzdCBzdGFydGluZyB3aXRoIGEgdGhyZXNob2xkIG9mIDgwIGZvciBhdXRvLXJlamVjdGlvbiBhbmQgMjAgZm9yIGF1dG8tYWNjZXB0YW5jZS4gQXMgeW91IGdhdGhlciBtb3JlIGRhdGEgcG9pbnRzIG9uIHR5cGljYWwgcmlzayBzY29yZXMgZm9yIHlvdXIgdXNlIGNhc2UsIHlvdSBjYW4gdHVuZSB0aGVzZSBwYXJhbWV0ZXJzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyB1bmRlcmdvaW5nIG1hbnVhbCByZXZpZXcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfc2NvcmU6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG91dGNvbWUgc3RhdHVzIGZvciB0aGlzIHNwZWNpZmljIGRvY3VtZW50IHN1Ym1pc3Npb24uIERpc3RpbmN0IGZyb20gdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbi5zdGF0dXNgIHRoYXQgc3VtbWFyaXplcyB0aGUgdmVyaWZpY2F0aW9uIG91dGNvbWUgZnJvbSBvbmUgb3IgbW9yZSBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBNYW51YWxseUFwcHJvdmVkID0gJ21hbnVhbGx5X2FwcHJvdmVkJ1xufVxuXG4vKipcbiAqIERhdGEsIGltYWdlcywgYW5hbHlzaXMsIGFuZCByZXN1bHRzIGZyb20gdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5kb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5kb2N1bWVudGFyeV92ZXJpZmljYXRpb25gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZG9jdW1lbnRzIHN1Ym1pdHRlZCB0byB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gRWFjaCBlbnRyeSByZXByZXNlbnRzIG9uZSB1c2VyIHN1Ym1pc3Npb24sIHdoZXJlIGVhY2ggc3VibWlzc2lvbiB3aWxsIGNvbnRhaW4gYm90aCBhIGZyb250IGFuZCBiYWNrIGltYWdlLCBvciBqdXN0IGEgZnJvbnQgaW1hZ2UsIGRlcGVuZGluZyBvbiB0aGUgZG9jdW1lbnQgdHlwZS4gIE5vdGU6IFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBsZXQgYSB1c2VyIHN1Ym1pdCBhIG5ldyBzZXQgb2YgZG9jdW1lbnQgaW1hZ2VzIHVwIHRvIHRocmVlIHRpbWVzIGlmIHdlIGRldGVjdCB0aGF0IGEgcHJldmlvdXMgYXR0ZW1wdCBtaWdodCBoYXZlIGZhaWxlZCBkdWUgdG8gdXNlciBlcnJvci4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmaXJzdCBzZXQgb2YgZG9jdW1lbnQgaW1hZ2VzIGFyZSBibHVycnkgb3Igb2JzY3VyZWQgYnkgZ2xhcmUsIHRoZSB1c2VyIHdpbGwgYmUgYXNrZWQgdG8gY2FwdHVyZSB0aGVpciBkb2N1bWVudHMgYWdhaW4sIHJlc3VsdGluZyBpbiBhdCBsZWFzdCB0d28gc2VwYXJhdGUgZW50cmllcyB3aXRoaW4gYGRvY3VtZW50c2AuIElmIHRoZSBvdmVyYWxsIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGlzIGBmYWlsZWRgLCB0aGUgdXNlciBoYXMgZXhoYXVzdGVkIHRoZWlyIHJldHJ5IGF0dGVtcHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudHM6IEFycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+O1xufVxuLyoqXG4gKiBJbWFnZXMsIGV4dHJhY3RlZCBkYXRhLCBhbmQgYW5hbHlzaXMgZnJvbSBhIHVzZXJcXCdzIGlkZW50aXR5IGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IERvY3VtZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXR0ZW1wdGAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCBkb2N1bWVudCB1cGxvYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEltYWdlc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGltYWdlczogUGh5c2ljYWxEb2N1bWVudEltYWdlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGF9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBleHRyYWN0ZWRfZGF0YTogUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYW5hbHlzaXM6IERvY3VtZW50QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5c3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdWJ0b3RhbHM/OiBBcnJheTxFYXJuaW5nc1RvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxFYXJuaW5nc1RvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bj86IEFycmF5PEVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbD86IEVhcm5pbmdzVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVhcm5pbmdzIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb24/OiBFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENvbW1vbmx5IHVzZWQgdGVybSB0byBkZXNjcmliZSB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEJhc2ljQWxsb3dhbmNlSG91c2luZyA9ICdCQVNJQyBBTExPV0FOQ0UgSE9VU0lORycsXG4gICAgQmFzaWNBbGxvd2FuY2VTdWJzaXN0ZW5jZSA9ICdCQVNJQyBBTExPV0FOQ0UgU1VCU0lTVEVOQ0UnLFxuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGFuIGVhcm5pbmcgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5nc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgdGhlIGVhcm5pbmdzIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHl0ZF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGhvdXJzIHdvcmtlZCBmb3IgdGhpcyBwYXkgcGVyaW9kXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW1haWwgYWRkcmVzc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbWFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgZW1haWwgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBlbWFpbCBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1haWwgYWNjb3VudCBhcyBkZXNjcmliZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHR5cGU6IEVtYWlsVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRW1haWxUeXBlRW51bSB7XG4gICAgUHJpbWFyeSA9ICdwcmltYXJ5JyxcbiAgICBTZWNvbmRhcnkgPSAnc2Vjb25kYXJ5JyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBlbWFpbCBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIGVtYWlsIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2ggYW5kIDAgaXMgYSBubyBtYXRjaC4gSWYgdGhlIGFjY291bnQgY29udGFpbnMgbXVsdGlwbGUgb3duZXJzLCB0aGUgbWF4aW11bSBtYXRjaCBzY29yZSBpcyBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsQWRkcmVzc01hdGNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3Igbm9ybWFsaXplZCBlbWFpbC4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktNzAgaXMgYSBwYXJ0aWFsIG1hdGNoIChtYXRjaGluZyB0aGUgc2FtZSBlbWFpbCB3aXRoIGRpZmZlcmVudCBcXCcrXFwnIGV4dGVuc2lvbnMpLCBhbnl0aGluZyBiZWxvdyA3MCBpcyBjb25zaWRlcmVkIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgZW1haWwgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzczogUGF5c3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYHNpbmdsZWAgb3IgYG1hcnJpZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkPzogVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGVtcGxveWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzczogQWRkcmVzc0RhdGFOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgZnJvbSAwIHRvIDEgaW5kaWNhdGluZyBQbGFpZFxcJ3MgbGV2ZWwgb2YgY29uZmlkZW5jZSBpbiB0aGUgcGFpcmluZyBiZXR3ZWVuIHRoZSBlbXBsb3llciBhbmQgdGhlIGluc3RpdHV0aW9uIChub3QgeWV0IGltcGxlbWVudGVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGNvbmZpZGVuY2Vfc2NvcmU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3llcnMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgbmFtZSB0byBiZSBzZWFyY2hlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIHByb2R1Y3RzIHRoZSByZXR1cm5lZCBlbXBsb3llcnMgc2hvdWxkIHN1cHBvcnQuIEN1cnJlbnRseSwgdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBgXFxcImRlcG9zaXRfc3dpdGNoXFxcImAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveWVycy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1wbG95ZXJzIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWEuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3llcnM6IEFycmF5PEVtcGxveWVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZW1wbG95bWVudCBkZXRhaWxzIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudERldGFpbHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFubnVhbF9zYWxhcnk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvbiB3aGljaCB0aGUgZW1wbG95ZWUgd2FzIGhpcmVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBoaXJlX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZXMgb2Ygc291cmNlIGVtcGxveW1lbnQgZGF0YSB0aGF0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNoYXJlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbXBsb3ltZW50U291cmNlVHlwZSB7XG4gICAgQmFuayA9ICdiYW5rJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvb2Ygb2YgZW1wbG95bWVudCBkYXRhIGZvciBhbiBpbmRpdmlkdWFsXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1cz86IEVtcGxveW1lbnRWZXJpZmljYXRpb25TdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXJ0IG9mIGVtcGxveW1lbnQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGVtcGxveW1lbnQsIGlmIGFwcGxpY2FibGUuIFByb3ZpZGVkIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llclZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVyPzogRW1wbG95ZXJWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0aXRsZSBvZiBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGl0bGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGF0Zm9ybUlkc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBsYXRmb3JtX2lkcz86IFBsYXRmb3JtSWRzO1xufVxuLyoqXG4gKiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbiBzdW1tYXJpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveW1lbnRWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50czogQXJyYXk8RW1wbG95bWVudFZlcmlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VycmVudCBlbXBsb3ltZW50IHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVtcGxveW1lbnRWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEVtcGxveW1lbnRTdGF0dXNBY3RpdmUgPSAnRU1QTE9ZTUVOVF9TVEFUVVNfQUNUSVZFJyxcbiAgICBFbXBsb3ltZW50U3RhdHVzSW5hY3RpdmUgPSAnRU1QTE9ZTUVOVF9TVEFUVVNfSU5BQ1RJVkUnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBIGdyb3VwaW5nIG9mIHRoZSBQbGFpZCBwcm9kdWNlZCB0cmFuc2FjdGlvbiBlbmhhbmNlbWVudCBmaWVsZHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVuaGFuY2VtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VtZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgd2Vic2l0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENoYW5uZWx9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogUGF5bWVudENoYW5uZWw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGFuIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkuIFRoZSBpY29uIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8Q291bnRlcnBhcnR5Pjtcbn1cbi8qKlxuICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFjY291bnQgaG9sZGVyOiAgYE9VVEZMT1dgIC0gSW5jbHVkZXMgb3V0Z29pbmcgdHJhbnNmZXJzLCBwdXJjaGFzZXMsIGFuZCBmZWVzLiAoVHlwaWNhbGx5IHJlcHJlc2VudGVkIGFzIGEgbmVnYXRpdmUgdmFsdWUgb24gY2hlY2tpbmcgYWNjb3VudHMgYW5kIGRlYml0IGNhcmRzIGFuZCBhIHBvc2l0aXZlIHZhbHVlIG9uIGNyZWRpdCBjYXJkcy4pICBgSU5GTE9XYCAtIEluY2x1ZGVzIGluY29taW5nIHRyYW5zZmVycywgcmVmdW5kcywgYW5kIGluY29tZS4gKFR5cGljYWxseSByZXByZXNlbnRlZCBhcyBhIHBvc2l0aXZlIHZhbHVlIG9uIGNoZWNraW5nIGFjY291bnRzIGFuZCBkZWJpdCBjYXJkcyBhbmQgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBjcmVkaXQgY2FyZHMuKVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb24ge1xuICAgIEluZmxvdyA9ICdJTkZMT1cnLFxuICAgIE91dGZsb3cgPSAnT1VURkxPVydcbn1cblxuLyoqXG4gKiBBIGdyb3VwaW5nIG9mIHRoZSBQbGFpZCBwcm9kdWNlZCB0cmFuc2FjdGlvbiBlbnJpY2htZW50IGZpZWxkcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW5yaWNobWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnJpY2htZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM6IEFycmF5PENvdW50ZXJwYXJ0eT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgcHJpbWFyeSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgbGVnYWN5IGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGxlZ2FjeSBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgZm9yIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHRvIG9idGFpbiB0aGUgYmVzdCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhY3lfY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBsZWdhY3kgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGZvciB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiB0byBvYnRhaW4gdGhlIGJlc3QgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxlZ2FjeV9jYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkgaW4gRS4xNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeTogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eURvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogRW50aXR5RG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlrYCAtIFJ1c3NpYW4gYmFuayBjb2RlICBgYnVzaW5lc3NfbnVtYmVyYCAtIEEgbnVtYmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgYnVzaW5lc3Mgd2l0aGluIGEgY2F0ZWdvcnkgb2YgYnVzaW5lc3NlcyAgYGltb2AgLSBOdW1iZXIgYXNzaWduZWQgdG8gdGhlIGVudGl0eSBieSB0aGUgSW50ZXJuYXRpb25hbCBNYXJpdGltZSBPcmdhbml6YXRpb24gIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHN3aWZ0YCAtIE51bWJlciBpZGVudGlmeWluZyBhIGJhbmsgYW5kIGJyYW5jaC4gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlEb2N1bWVudFR5cGUge1xuICAgIEJpayA9ICdiaWsnLFxuICAgIEJ1c2luZXNzTnVtYmVyID0gJ2J1c2luZXNzX251bWJlcicsXG4gICAgSW1vID0gJ2ltbycsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFN3aWZ0ID0gJ3N3aWZ0JyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnXG59XG5cbi8qKlxuICogQW5hbHlzaXMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB3aHkgYSBzY3JlZW5pbmcgaGl0IG1hdGNoZWQgdGhlIHByb3ZpZGVkIGVudGl0eSBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVycz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgdXJscz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIEVudGl0eSBzY3JlZW5pbmcgaGl0cyBhcmUgaW1tdXRhYmxlIG9uY2UgdGhleSBoYXZlIGJlZW4gcmV2aWV3ZWQuIElmIGNoYW5nZXMgYXJlIGRldGVjdGVkIGR1ZSB0byB1cGRhdGVzIHRvIHRoZSBlbnRpdHkgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aG9zZSBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zX3ZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogRW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBQaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICB1cmxzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnRzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eURvY3VtZW50O1xufVxuLyoqXG4gKiBFbWFpbCBhZGRyZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHMge1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgZW1haWxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RW1haWxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHM7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBlbnRpdHkuIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHR5cGU6IFBob25lVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJscyB7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgVVJMcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFVybHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzO1xufVxuLyoqXG4gKiBBbmFseXplZCBwaG9uZSBudW1iZXJzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW50aXR5IHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgRU5USVRZX1NDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW50aXR5X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGVudGl0aWVzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX1NPRWA6IFN0YXRlIE93bmVkIEVudGVycHJpc2UgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVU19DQVBgOiBVUyBPRkFDIENvcnJlc3BvbmRlbnQgQWNjb3VudCBvciBQYXlhYmxlLVRocm91Z2ggQWNjb3VudCBTYW5jdGlvbnMgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19NQlNgOiBVUyBOb24tU0ROIE1lbnUtQmFzZWQgU2FuY3Rpb25zICBgVVNfU0ROYDogVVMgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmF0aW9uYWxzIExpc3QgIGBVU19TU0lgOiBVUyBPRkFDIFNlY3RvcmFsIFNhbmN0aW9ucyBJZGVudGlmaWNhdGlvbnMgIGBVU19DTUNgOiBVUyBPRkFDIE5vbi1TRE4gQ2hpbmVzZSBNaWxpdGFyeS1JbmR1c3RyaWFsIENvbXBsZXggTGlzdCAgYFVTX1VWTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgVW52ZXJpZmllZCBMaXN0ICBgVVNfU0FNYDogVVMgU3lzdGVtIGZvciBBd2FyZCBNYW5hZ2VtZW50IEV4Y2x1c2lvbiBMaXN0ICBgVVNfVEVMYDogVVMgVGVycm9yaXN0IEV4Y2x1c2lvbiBMaXN0ICBgVUtfSE1DYDogRm9yZWlnbiwgQ29tbW9ud2VhbHRoICYgRGV2ZWxvcG1lbnQgT2ZmaWNlIFVLIFNhbmN0aW9ucyBMaXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlXYXRjaGxpc3RDb2RlIHtcbiAgICBDYUNvbiA9ICdDQV9DT04nLFxuICAgIEV1Q29uID0gJ0VVX0NPTicsXG4gICAgSXpTb2UgPSAnSVpfU09FJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVXNDYXAgPSAnVVNfQ0FQJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzTWJzID0gJ1VTX01CUycsXG4gICAgVXNTZG4gPSAnVVNfU0ROJyxcbiAgICBVc1NzaSA9ICdVU19TU0knLFxuICAgIFVzQ21jID0gJ1VTX0NNQycsXG4gICAgVXNVdmwgPSAnVVNfVVZMJyxcbiAgICBVc1NhbSA9ICdVU19TQU0nLFxuICAgIFVzVGVsID0gJ1VTX1RFTCcsXG4gICAgQXVDb24gPSAnQVVfQ09OJyxcbiAgICBVa0htYyA9ICdVS19ITUMnXG59XG5cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBlbnRpdGllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpc19yZXNjYW5uaW5nX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2F0Y2hsaXN0cyBlbmFibGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtXG4gICAgICogQHR5cGUge1NldDxFbnRpdHlXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxFbnRpdHlXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBlbnRpdHkgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIE9yZ2FuaXphdGlvbnNcXFwiIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbmFtZV9zZW5zaXRpdml0eTogUHJvZ3JhbU5hbWVTZW5zaXRpdml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogRGF0YSBmcm9tIGEgZ292ZXJubWVudCB3YXRjaGxpc3QgdGhhdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgc2NyZWVuaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdENvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGxpc3RfY29kZTogRW50aXR5V2F0Y2hsaXN0Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXZlcnNhbCBpZGVudGlmaWVyIGZvciBhIHdhdGNobGlzdCBpbmRpdmlkdWFsIHRoYXQgaXMgc3RhYmxlIGFjcm9zcyBzZWFyY2hlcyBhbmQgdXBkYXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBwbGFpZF91aWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc291cmNlIHNhbmN0aW9uIG9yIHdhdGNobGlzdC4gV2hlbiBvbmUgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHNvdXJjZV91aWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3ViLXByb2dyYW0gZGVzaWduYXRpb25zIHRoYXQgbWF5IGJlIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3QgZW50cnkgYnkgdGhlIGlzc3VpbmcgYXV0aG9yaXR5LiBGb3IgT0ZBQyBTRE4gZW50cmllcyB0aGVzZSBhcmUgdGhlIHByb2dyYW0gY29kZXMgcHVibGlzaGVkIGluIHRoZSBTRE4gbGlzdCAoZm9yIGV4YW1wbGUgYFNER1RgIGZvciBTcGVjaWFsbHkgRGVzaWduYXRlZCBHbG9iYWwgVGVycm9yaXN0cywgYFNETlRLYCBmb3IgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmFyY290aWNzIFRyYWZmaWNraW5nIEtpbmdwaW5zLCBgSVJBTmAsIGBSVVNTSUEtRU8xNDAyNGApLiBOZXcgY29kZXMgYXJlIGFkZGVkIGJ5IHNhbmN0aW9uaW5nIGF1dGhvcml0aWVzIHdpdGhvdXQgcHJpb3Igbm90aWNlLCBzbyBjYWxsZXJzIHNob3VsZCB0cmVhdCB1bmtub3duIHZhbHVlcyBhcyBvcGFxdWUgc3RyaW5ncyByYXRoZXIgdGhhbiBlbnVtIG1lbWJlcnMuIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzdWJfcHJvZ3JhbXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXREYXRhfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0RGF0YTtcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBjb25maXJtZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgdXNlZCBmb3Igc2VhcmNoaW5nIGFnYWluc3Qgd2F0Y2hsaXN0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb24gYmVpbmcgc2NyZWVuZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWxwaGFiZXRpY2FsIGNoYXJhY3RlciwgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLCBhbmQgbm90IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gTXVzdCBiZSBiZXR3ZWVuIDQgYW5kIDMyIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNhbm5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEV3YVNjb3JlIHJlcHJlc2VudHMgYW4gZWFybmVkIHdhZ2UgYWNjZXNzIHNjb3JlIGZvciBhIHNwZWNpZmljIGFkdmFuY2UgYW1vdW50IHJhbmdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFd2FTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV3YVNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBGbG9hdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxvd2VyIGJvdW5kIChpbmNsdXNpdmUpIG9mIHRoZSBhZHZhbmNlIGFtb3VudCByYW5nZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBFV0Egc2NvcmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXdhU2NvcmVcbiAgICAgKi9cbiAgICBsb3dlc3RfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZsb2F0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgdXBwZXIgYm91bmQgKGV4Y2x1c2l2ZSkgb2YgdGhlIGFkdmFuY2UgYW1vdW50IHJhbmdlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIEVXQSBzY29yZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFd2FTY29yZVxuICAgICAqL1xuICAgIGhpZ2hlc3RfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEVXQSBzY29yZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYW1vdW50IGJ1Y2tldC4gU2NvcmVzIHJhbmdlIGZyb20gMS05OSwgd2hlcmUgYSBoaWdoZXIgc2NvcmUgaW5kaWNhdGVzIGEgaGlnaGVyIGxpa2VsaWhvb2Qgb2YgcmVwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV3YVNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXI7XG59XG4vKipcbiAqIENvbXByZWhlbnNpdmUgYW5hbHlzaXMgb2Ygc3BlbmRpbmcgcGF0dGVybnMsIGNhdGVnb3JpemluZyBleHBlbnNlcyBpbnRvIGVzc2VudGlhbCwgbm9uLWVzc2VudGlhbCwgYW5kIG90aGVyIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4cGVuZGl0dXJlSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBlbmRpdHVyZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBOZXQgY2FzaCBmbG93IGZvciB0aGUgcGVyaW9kIChpbmZsb3dzIG1pbnVzIG91dGZsb3dzKSwgaW5jbHVkaW5nIGEgbW9udGhseSBhdmVyYWdlLlxuICAgICAqIEB0eXBlIHtBbW91bnRXaXRoQ3VycmVuY3lXaXRoTW9udGhseUF2ZXJhZ2V9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlSW5zaWdodHNcbiAgICAgKi9cbiAgICBjYXNoX2Zsb3c/OiBBbW91bnRXaXRoQ3VycmVuY3lXaXRoTW9udGhseUF2ZXJhZ2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGVuZGl0dXJlU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX2V4cGVuZGl0dXJlPzogRXhwZW5kaXR1cmVTdW1tYXJ5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXhwZW5kaXR1cmVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZUluc2lnaHRzXG4gICAgICovXG4gICAgZXNzZW50aWFsX2V4cGVuZGl0dXJlPzogRXhwZW5kaXR1cmVTdW1tYXJ5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXhwZW5kaXR1cmVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZUluc2lnaHRzXG4gICAgICovXG4gICAgbm9uX2Vzc2VudGlhbF9leHBlbmRpdHVyZT86IEV4cGVuZGl0dXJlU3VtbWFyeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGVuZGl0dXJlU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVJbnNpZ2h0c1xuICAgICAqL1xuICAgIG90aGVyPzogRXhwZW5kaXR1cmVTdW1tYXJ5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXhwZW5kaXR1cmVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZUluc2lnaHRzXG4gICAgICovXG4gICAgdHJhbnNmZXJzX291dD86IEV4cGVuZGl0dXJlU3VtbWFyeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge091dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVJbnNpZ2h0c1xuICAgICAqL1xuICAgIG91dGxpZXJfdHJhbnNhY3Rpb25zPzogT3V0bGllclRyYW5zYWN0aW9uc0luc2lnaHRzIHwgbnVsbDtcbn1cbi8qKlxuICogU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBhIHNwZWNpZmljIGV4cGVuZGl0dXJlIGNhdGVnb3J5LCBpbmNsdWRpbmcgdG90YWwgYW1vdW50LCBtb250aGx5IGF2ZXJhZ2UsIGFuZCBwZXJjZW50YWdlIG9mIGluY29tZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXhwZW5kaXR1cmVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZW5kaXR1cmVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgdmFsdWUgb2YgYWxsIHRoZSBhZ2dyZWdhdGVkIHRyYW5zYWN0aW9ucyBpbiB0aGlzIGV4cGVuZGl0dXJlIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlU3VtbWFyeVxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlU3VtbWFyeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVTdW1tYXJ5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9udGhseUF2ZXJhZ2V9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlU3VtbWFyeVxuICAgICAqL1xuICAgIG1vbnRobHlfYXZlcmFnZT86IE1vbnRobHlBdmVyYWdlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIG91dGZsb3cgdHJhbnNhY3Rpb25zIGluIHRoaXMgZXhwZW5zZXMgZ3JvdXAsIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBpbmZsb3dzIHRoYXQgd2FzIHNwZW50IGluIHRoaXMgZXhwZW5zZXMgZ3JvdXAsIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAwIHJlcHJlc2VudHMgdGhhdCAxMDAlIG9mIHRoZSBpbmZsb3dzIHdlcmUgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoaXMgZXhwZW5kaXR1cmUgZ3JvdXAuIElmIHRoZXJlXFwncyBubyBhdmFpbGFibGUgaW5jb21lIGZvciB0aGUgZ2l2ZW4gdGltZSBwZXJpb2QsIHRoaXMgZmllbGQgdmFsdWUgd2lsbCBiZSBgLTFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlU3VtbWFyeVxuICAgICAqL1xuICAgIHBlcmNlbnRhZ2Vfb2ZfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjcmVkaXQgY2F0ZWdvcmllcyBvZiB0aGUgZXhwZW5zZXMgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC4gIFRoZSBjYXRlZ29yaWVzIGFyZSBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgdG90YWwgdmFsdWUgc3BlbnQuIFNlZSB0aGUgW2NhdGVnb3J5IHRheG9ub215XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGNhdGVnb3J5IElEcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz59XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlU3VtbWFyeVxuICAgICAqL1xuICAgIHRvcF9jYXRlZ29yaWVzPzogQXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz47XG59XG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2Ygd2hldGhlciB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudCB3YXMgZXhwaXJlZCB3aGVuIHRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZC4gIE5vdGU6IEluIHRoZSBjYXNlIHdoZXJlIGFuIGV4cGlyYXRpb24gZGF0ZSBpcyBub3QgcHJlc2VudCBvbiB0aGUgZG9jdW1lbnQgb3IgZmFpbGVkIHRvIGJlIGV4dHJhY3RlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBub19kYXRhYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEV4cGlyYXRpb25EYXRlIHtcbiAgICBOb3RFeHBpcmVkID0gJ25vdF9leHBpcmVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFBsYWlkIGFuZCBGRFgtZGVmaW5lZCByZWNpcGllbnQgbWV0YWRhdGEgZmllbGRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBuYW1lIGRpc3BsYXllZCBieSB0aGUgRGF0YSBQcm92aWRlciBkdXJpbmcgdGhlIGNvbnNlbnQgZmxvd1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X2xlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggdGhlIHJlY2lwaWVudCBnYWluZWQgcHJvZHVjdGlvbiBhY2Nlc3MgdG8gUGxhaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgam9pbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIERhdGEgUGFydG5lciBjb25zdW1lcnMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSByZWNpcGllbnQgZm9yIHRoZSBzcGVjaWZpYyBEYXRhIFBhcnRuZXJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCB0aGUgcmVjaXBpZW50IGdhaW5lZCBwcm9kdWN0aW9uIGFjY2VzcyB0byBQbGFpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFBbGxPZlxuICAgICAqL1xuICAgIGpvaW5lZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBEYXRhIFBhcnRuZXIgY29uc3VtZXJzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgcmVjaXBpZW50IGZvciB0aGUgc3BlY2lmaWMgRGF0YSBQYXJ0bmVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgQWRkaXRpb25hbCBwYXltZW50IGNvbnNlbnQgb3B0aW9ucy4gUGxlYXNlIHVzZSBgcGF5ZXJfZGV0YWlsc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IHVwIHBheW1lbnQgY29uc2VudCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGV4dGVybmFsIHBheW1lbnQgcmVmdW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGJhY3M6IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbD86IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIEZEWCBjb25zZW50IGdyYW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhDb25zZW50R3JhbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhDb25zZW50R3JhbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJzaXN0ZW50IGlkZW50aWZpZXIgb2YgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhDb25zZW50R3JhbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRHcmFudFxuICAgICAqL1xuICAgIHN0YXR1czogRkRYQ29uc2VudEdyYW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIGNvbnNlbnQgd2FzIGluaXRpYWxseSBncmFudGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50XG4gICAgICovXG4gICAgY3JlYXRlZFRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjb25zZW50IGdyYW50IHdhcyBsYXN0IHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRcbiAgICAgKi9cbiAgICB1cGRhdGVkVGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIGNvbnNlbnQgZ3JhbnQgd2lsbCBleHBpcmUuIE9taXR0ZWQgd2hlbiB0aGUgZ3JhbnQgaGFzIG5vIGV4cGlyYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50XG4gICAgICovXG4gICAgZXhwaXJhdGlvblRpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTm9uLWVuZC11c2VyIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiB0aGUgY29uc2VudCBncmFudCAoRGF0YSBSZWNpcGllbnQsIERhdGEgUHJvdmlkZXIsIERhdGEgQWNjZXNzIFBsYXRmb3JtKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYUGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRcbiAgICAgKi9cbiAgICBwYXJ0aWVzOiBBcnJheTxGRFhQYXJ0eT47XG4gICAgLyoqXG4gICAgICogUGVybWlzc2lvbmVkIHJlc291cmNlIGVudHJpZXMuIE9taXR0ZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVzb3VyY2VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxGRFhDb25zZW50R3JhbnRSZXNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRHcmFudFxuICAgICAqL1xuICAgIHJlc291cmNlcz86IEFycmF5PEZEWENvbnNlbnRHcmFudFJlc291cmNlPjtcbn1cbi8qKlxuICogT25lIHBlcm1pc3Npb25lZCByZXNvdXJjZSBvbiBhIGNvbnNlbnQgZ3JhbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWENvbnNlbnRHcmFudFJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYQ29uc2VudEdyYW50UmVzb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhDb25zZW50UmVzb3VyY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRSZXNvdXJjZVxuICAgICAqL1xuICAgIHJlc291cmNlVHlwZTogRkRYQ29uc2VudFJlc291cmNlVHlwZTtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSBwZXJtaXNzaW9uZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50UmVzb3VyY2VcbiAgICAgKi9cbiAgICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTmFtZXMgb2YgY2x1c3RlcnMgb2YgZGF0YSBlbGVtZW50cyBwZXJtaXNzaW9uZWQuXG4gICAgICogQHR5cGUge0FycmF5PEZEWERhdGFDbHVzdGVyPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50UmVzb3VyY2VcbiAgICAgKi9cbiAgICBkYXRhQ2x1c3RlcnM6IEFycmF5PEZEWERhdGFDbHVzdGVyPjtcbn1cbi8qKlxuICogQ3VycmVudCBzdGF0dXMgb2YgYSBjb25zZW50IGdyYW50LiBPbmUgb2YgYEFDVElWRWAsIGBSRVZPS0VEYCwgYEVYUElSRURgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYQ29uc2VudEdyYW50U3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBSZXZva2VkID0gJ1JFVk9LRUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBUeXBlIG9mIHJlc291cmNlIHBlcm1pc3Npb25lZCBvbiBhIGNvbnNlbnQgZ3JhbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhDb25zZW50UmVzb3VyY2VUeXBlIHtcbiAgICBBY2NvdW50ID0gJ0FDQ09VTlQnLFxuICAgIEN1c3RvbWVyID0gJ0NVU1RPTUVSJyxcbiAgICBEb2N1bWVudCA9ICdET0NVTUVOVCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGJvZHkgZm9yIFBVVCAvZmR4L2NvbnNlbnRzL3tjb25zZW50SWR9L3Jldm9jYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWENvbnNlbnRSZXZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYQ29uc2VudFJldm9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRSZXZvY2F0aW9uXG4gICAgICovXG4gICAgaW5pdGlhdG9yOiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFVwZGF0ZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25cbiAgICAgKi9cbiAgICByZWFzb246IEZEWFVwZGF0ZVJlYXNvbjtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGRlc2NyaXB0aW9uIG9mIGFuIGBPVEhFUmAgcmVhc29uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25cbiAgICAgKi9cbiAgICBvdGhlclJlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSByZXZvY2F0aW9uIHdhcyBlZmZlY3RlZCBvbiB0aGUgaW5pdGlhdG9yXFwncyBzaWRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25cbiAgICAgKi9cbiAgICB1cGRhdGVkVGltZT86IHN0cmluZztcbn1cbi8qKlxuICogT25lIHJldm9jYXRpb24gcmVjb3JkIG9uIGEgY29uc2VudCBncmFudCwgbWlycm9yaW5nIHRoZSBGRFggQ29uc2VudFJldm9jYXRpb24gZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhDb25zZW50UmV2b2NhdGlvblJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWENvbnNlbnRSZXZvY2F0aW9uUmVjb3JkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYQ29uc2VudEdyYW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50UmV2b2NhdGlvblJlY29yZFxuICAgICAqL1xuICAgIHN0YXR1czogRkRYQ29uc2VudEdyYW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhVcGRhdGVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRSZXZvY2F0aW9uUmVjb3JkXG4gICAgICovXG4gICAgcmVhc29uOiBGRFhVcGRhdGVSZWFzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I6IEZEWFBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjb25zZW50IGdyYW50IHdhcyByZXZva2VkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmRcbiAgICAgKi9cbiAgICB1cGRhdGVkVGltZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmV2b2NhdGlvbiBoaXN0b3J5IG9mIGEgY29uc2VudCBncmFudC4gUmVzcG9uc2UgYm9keSBmb3IgR0VUIC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH0vcmV2b2NhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYQ29uc2VudFJldm9jYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYQ29uc2VudFJldm9jYXRpb25zIHtcbiAgICAvKipcbiAgICAgKiBSZXZvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBjb25zZW50IGdyYW50LCBtb3N0IHJlY2VudCBmaXJzdC4gRW1wdHkgd2hlbiB0aGUgZ3JhbnQgaGFzIG5ldmVyIGJlZW4gcmV2b2tlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmQ+fVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50UmV2b2NhdGlvbnNcbiAgICAgKi9cbiAgICByZXZvY2F0aW9uczogQXJyYXk8RkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmQ+O1xufVxuLyoqXG4gKiBUeXBlcyBvZiBkb2N1bWVudCBmb3JtYXRzLiAoU3VnZ2VzdGVkIHZhbHVlcylcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWENvbnRlbnRUeXBlcyB7XG4gICAgQXBwbGljYXRpb25QZGYgPSAnYXBwbGljYXRpb24vcGRmJyxcbiAgICBJbWFnZUdpZiA9ICdpbWFnZS9naWYnLFxuICAgIEltYWdlSnBlZyA9ICdpbWFnZS9qcGVnJyxcbiAgICBJbWFnZVRpZmYgPSAnaW1hZ2UvdGlmZicsXG4gICAgSW1hZ2VQbmcgPSAnaW1hZ2UvcG5nJyxcbiAgICBBcHBsaWNhdGlvbkpzb24gPSAnYXBwbGljYXRpb24vanNvbidcbn1cblxuLyoqXG4gKiBOYW1lIG9mIGEgY2x1c3RlciBvZiBkYXRhIGVsZW1lbnRzIHBlcm1pc3Npb25lZCBieSBhIGNvbnNlbnQgZ3JhbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhEYXRhQ2x1c3RlciB7XG4gICAgQWNjb3VudEJhc2ljID0gJ0FDQ09VTlRfQkFTSUMnLFxuICAgIEFjY291bnREZXRhaWxlZCA9ICdBQ0NPVU5UX0RFVEFJTEVEJyxcbiAgICBBY2NvdW50UGF5bWVudHMgPSAnQUNDT1VOVF9QQVlNRU5UUycsXG4gICAgQmlsbHMgPSAnQklMTFMnLFxuICAgIEN1c3RvbWVyQ29udGFjdCA9ICdDVVNUT01FUl9DT05UQUNUJyxcbiAgICBDdXN0b21lclBlcnNvbmFsID0gJ0NVU1RPTUVSX1BFUlNPTkFMJyxcbiAgICBJbWFnZXMgPSAnSU1BR0VTJyxcbiAgICBJbnZlc3RtZW50cyA9ICdJTlZFU1RNRU5UUycsXG4gICAgTm90aWZpY2F0aW9ucyA9ICdOT1RJRklDQVRJT05TJyxcbiAgICBQYXltZW50U3VwcG9ydCA9ICdQQVlNRU5UX1NVUFBPUlQnLFxuICAgIFJld2FyZHMgPSAnUkVXQVJEUycsXG4gICAgU3RhdGVtZW50cyA9ICdTVEFURU1FTlRTJyxcbiAgICBUYXggPSAnVEFYJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAnVFJBTlNBQ1RJT05TJyxcbiAgICBCYWxhbmNlcyA9ICdCQUxBTkNFUycsXG4gICAgU2NoZWR1bGVkUGF5bWVudHMgPSAnU0NIRURVTEVEX1BBWU1FTlRTJ1xufVxuXG4vKipcbiAqIEN1cnJlbnQgc3RhdHVzIG9mIGluZGljYXRlZCBlbnRpdHkgYWZ0ZXIgcmVwb3J0ZWQgZXZlbnQgY2hhbmdlLiBOb3QgYWxsIHN0YXR1c2VzIHdpbGwgYmUgc3VwcG9ydGVkIG9uIGFsbCBlbnRpdHkgdHlwZXMgYnkgYWxsIGRhdGEgcHJvdmlkZXJzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhFdmVudFN0YXR1cyB7XG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgRXhwaXJlZCA9ICdFWFBJUkVEJyxcbiAgICBSZXZva2VkID0gJ1JFVk9LRUQnLFxuICAgIFN1c3BlbmRlZCA9ICdTVVNQRU5ERUQnXG59XG5cbi8qKlxuICogRmluYW5jaWFsIEluc3RpdHV0aW9uIHByb3ZpZGVyLXNwZWNpZmljIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWEZpQXR0cmlidXRlIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbn1cbi8qKlxuICogUkVTVCBhcHBsaWNhdGlvbiBjb25zdHJhaW50IChIeXBlcm1lZGlhIEFzIFRoZSBFbmdpbmUgT2YgQXBwbGljYXRpb24gU3RhdGUpXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYSGF0ZW9hc0xpbmsge1xuICAgIC8qKlxuICAgICAqIFVSTCB0byBpbnZva2UgdGhlIGFjdGlvbiBvbiB0aGUgcmVzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGhyZWY6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYSGF0ZW9hc0xpbmtBY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgYWN0aW9uPzogRkRYSGF0ZW9hc0xpbmtBY3Rpb247XG4gICAgLyoqXG4gICAgICogUmVsYXRpb24gb2YgdGhpcyBsaW5rIHRvIGl0cyBjb250YWluaW5nIGVudGl0eSwgYXMgZGVmaW5lZCBieSBhbmQgd2l0aCBtYW55IGV4YW1wbGUgcmVsYXRpb24gdmFsdWVzIGF0IFtJRVRGIFJGQzU5ODhdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTk4OClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIHJlbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb250ZW50LXR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYQ29udGVudFR5cGVzPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICB0eXBlcz86IEFycmF5PEZEWENvbnRlbnRUeXBlcz47XG59XG4vKipcbiAqIEhUVFAgTWV0aG9kIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWEhhdGVvYXNMaW5rQWN0aW9uIHtcbiAgICBHZXQgPSAnR0VUJyxcbiAgICBQb3N0ID0gJ1BPU1QnLFxuICAgIFBhdGNoID0gJ1BBVENIJyxcbiAgICBEZWxldGUgPSAnREVMRVRFJyxcbiAgICBQdXQgPSAnUFVUJ1xufVxuXG4vKipcbiAqIEluaXRpYXRvciBGaSBBdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU/OiBGRFhQYXJ0eVR5cGU7XG59XG4vKipcbiAqIERldGFpbHMgb2YgY29uc2VudCBvciBwYXltZW50IG5ldHdvcmsgaWRlbnRpZmllciBvciBvdGhlciBlbnRpdHlcXCdzIHJldm9jYXRpb24gcmVxdWVzdCBvciBvdGhlciBsaWZlY3ljbGUgc3RhdHVzIGNoYW5nZSBldmVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhMaWZlY3ljbGVFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWExpZmVjeWNsZUV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYRXZlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEZEWExpZmVjeWNsZUV2ZW50XG4gICAgICovXG4gICAgc3RhdHVzPzogRkRYRXZlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFVwZGF0ZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTGlmZWN5Y2xlRXZlbnRcbiAgICAgKi9cbiAgICByZWFzb24/OiBGRFhVcGRhdGVSZWFzb247XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBkZXNjcmlwdGlvbiBvZiBhbiBgT1RIRVJgIHJlYXNvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWExpZmVjeWNsZUV2ZW50XG4gICAgICovXG4gICAgb3RoZXJSZWFzb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTGlmZWN5Y2xlRXZlbnRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I/OiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogSVNPIDg2MDEgZGF0ZS10aW1lIGluIGZvcm1hdCBcXCdZWVlZLU1NLUREVGhoOm1tOnNzLm5ubltafFsrfC1daGg6bW1dXFwnIGFjY29yZGluZyB0byBbSUVURiBSRkMzMzM5XShodHRwczovL3htbDJyZmMudG9vbHMuaWV0Zi5vcmcvcHVibGljL3JmYy9odG1sL3JmYzMzMzkuaHRtbCNhbmNob3IxNClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhMaWZlY3ljbGVFdmVudFxuICAgICAqL1xuICAgIHVwZGF0ZWRUaW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgYmFzZSBmaWVsZHMgb2YgYSBub3RpZmljYXRpb24uIENsaWVudHMgd2lsbCByZWFkIHRoZSBgdHlwZWAgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJZCBvZiBub3RpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBub3RpZmljYXRpb25JZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICB0eXBlOiBGRFhOb3RpZmljYXRpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGluaXRpYXRvci1kZWZpbmVkIGV2ZW50IHN1YnR5cGUgY29kZSBvciBkZXNjcmlwdGlvbiBpZiB0aGUgZXZlbnQgdHlwZSBuZWVkcyB0byBiZSBmdXJ0aGVyIGNhdGVnb3JpemVkIG9yIGRlc2NyaWJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTyA4NjAxIGRhdGUtdGltZSBpbiBmb3JtYXQgXFwnWVlZWS1NTS1ERFRoaDptbTpzcy5ubm5bWnxbK3wtXWhoOm1tXVxcJyBhY2NvcmRpbmcgdG8gW0lFVEYgUkZDMzMzOV0oaHR0cHM6Ly94bWwycmZjLnRvb2xzLmlldGYub3JnL3B1YmxpYy9yZmMvaHRtbC9yZmMzMzM5Lmh0bWwjYW5jaG9yMTQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VudE9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvbkNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeTogRkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblNldmVyaXR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZXZlcml0eT86IEZEWE5vdGlmaWNhdGlvblNldmVyaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25Qcmlvcml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgcHJpb3JpdHk/OiBGRFhOb3RpZmljYXRpb25Qcmlvcml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHB1Ymxpc2hlcj86IEZEWFBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc3Vic2NyaWJlcj86IEZEWFBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25QYXlsb2FkfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBub3RpZmljYXRpb25QYXlsb2FkOiBGRFhOb3RpZmljYXRpb25QYXlsb2FkO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhIYXRlb2FzTGlua31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgdXJsPzogRkRYSGF0ZW9hc0xpbms7XG59XG4vKipcbiAqIENhdGVnb3J5IG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnkge1xuICAgIFNlY3VyaXR5ID0gJ1NFQ1VSSVRZJyxcbiAgICBNYWludGVuYW5jZSA9ICdNQUlOVEVOQU5DRScsXG4gICAgRnJhdWQgPSAnRlJBVUQnLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCcsXG4gICAgTmV3RGF0YSA9ICdORVdfREFUQScsXG4gICAgVG9rZW5pemVkQWNjb3VudE51bWJlciA9ICdUT0tFTklaRURfQUNDT1VOVF9OVU1CRVInXG59XG5cbi8qKlxuICogQ3VzdG9tIGtleS12YWx1ZSBwYWlycyBwYXlsb2FkIGZvciBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uUGF5bG9hZCB7XG4gICAgLyoqXG4gICAgICogSUQgZm9yIHRoZSBvcmlnaW5hdGlvbiBlbnRpdHkgcmVsYXRlZCB0byB0aGUgbm90aWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25QYXlsb2FkSWRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gICAgICovXG4gICAgaWRUeXBlPzogRkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTGlmZWN5Y2xlRXZlbnR9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBldmVudD86IEZEWExpZmVjeWNsZUV2ZW50O1xufVxuLyoqXG4gKiBUeXBlIG9mIGVudGl0eSBjYXVzaW5nIG9yaWdpbmF0aW9uIG9mIGEgbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25QYXlsb2FkSWRUeXBlIHtcbiAgICBBY2NvdW50ID0gJ0FDQ09VTlQnLFxuICAgIEN1c3RvbWVyID0gJ0NVU1RPTUVSJyxcbiAgICBQYXJ0eSA9ICdQQVJUWScsXG4gICAgTWFpbnRlbmFuY2UgPSAnTUFJTlRFTkFOQ0UnLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBQcmlvcml0eSBvZiBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblByaW9yaXR5IHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIE1lZGl1bSA9ICdNRURJVU0nLFxuICAgIExvdyA9ICdMT1cnXG59XG5cbi8qKlxuICogU2V2ZXJpdHkgbGV2ZWwgb2Ygbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25TZXZlcml0eSB7XG4gICAgRW1lcmdlbmN5ID0gJ0VNRVJHRU5DWScsXG4gICAgQWxlcnQgPSAnQUxFUlQnLFxuICAgIFdhcm5pbmcgPSAnV0FSTklORycsXG4gICAgTm90aWNlID0gJ05PVElDRScsXG4gICAgSW5mbyA9ICdJTkZPJ1xufVxuXG4vKipcbiAqIFR5cGUgb2YgTm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25UeXBlIHtcbiAgICBBY2NvdW50VGFrZW92ZXIgPSAnQUNDT1VOVF9UQUtFT1ZFUicsXG4gICAgQWRkcmVzc0NoYW5nZWQgPSAnQUREUkVTU19DSEFOR0VEJyxcbiAgICBCYWxhbmNlID0gJ0JBTEFOQ0UnLFxuICAgIENvbnNlbnRFeHBpcmVkID0gJ0NPTlNFTlRfRVhQSVJFRCcsXG4gICAgQ29uc2VudEdyYW50ZWQgPSAnQ09OU0VOVF9HUkFOVEVEJyxcbiAgICBDb25zZW50UmV2b2tlZCA9ICdDT05TRU5UX1JFVk9LRUQnLFxuICAgIENvbnNlbnRVcGRhdGVkID0gJ0NPTlNFTlRfVVBEQVRFRCcsXG4gICAgQ3VzdG9tID0gJ0NVU1RPTScsXG4gICAgTWZhVGFyZ2V0Q2hhbmdlZCA9ICdNRkFfVEFSR0VUX0NIQU5HRUQnLFxuICAgIFBob25lQ2hhbmdlZCA9ICdQSE9ORV9DSEFOR0VEJyxcbiAgICBQbGFubmVkT3V0YWdlID0gJ1BMQU5ORURfT1VUQUdFJyxcbiAgICBSaXNrID0gJ1JJU0snLFxuICAgIFNlcnZpY2UgPSAnU0VSVklDRScsXG4gICAgU3VzcGVjdGVkSW5jaWRlbnQgPSAnU1VTUEVDVEVEX0lOQ0lERU5UJyxcbiAgICBUYW5BY3RpdmF0ZWQgPSAnVEFOX0FDVElWQVRFRCcsXG4gICAgVGFuQ3JlYXRlZCA9ICdUQU5fQ1JFQVRFRCcsXG4gICAgVGFuUmV2b2tlZCA9ICdUQU5fUkVWT0tFRCcsXG4gICAgVGFuU3VzcGVuZGVkID0gJ1RBTl9TVVNQRU5ERUQnXG59XG5cbi8qKlxuICogRkRYIFBhcnRpY2lwYW50IC0gYW4gZW50aXR5IG9yIHBlcnNvbiB0aGF0IGlzIGEgcGFydCBvZiBhIEZEWCBBUEkgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogSHVtYW4gcmVjb2duaXphYmxlIGNvbW1vbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVVJJIGZvciBwYXJ0eSwgd2hlcmUgYW4gZW5kIHVzZXIgY291bGQgbGVhcm4gbW9yZSBhYm91dCB0aGUgY29tcGFueSBvciBhcHBsaWNhdGlvbiBpbnZvbHZlZCBpbiB0aGUgZGF0YSBzaGFyaW5nIGNoYWluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBob21lVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgYSBsb2dvIGFzc2V0IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgZW5kIHVzZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIGxvZ29Vcmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5UmVnaXN0cnl9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0cnk/OiBGRFhQYXJ0eVJlZ2lzdHJ5O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgbmFtZSBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJlZCBpZCBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eUlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cnkgY29udGFpbmluZyB0aGUgcGFydHlcXCdzIHJlZ2lzdHJhdGlvbiB3aXRoIG5hbWUgYW5kIGlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVJlZ2lzdHJ5IHtcbiAgICBGZHggPSAnRkRYJyxcbiAgICBHbGVpZiA9ICdHTEVJRicsXG4gICAgSWNhbm4gPSAnSUNBTk4nLFxuICAgIFByaXZhdGUgPSAnUFJJVkFURSdcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGEgcGFydHlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWFBhcnR5VHlwZSB7XG4gICAgRGF0YUFjY2Vzc1BsYXRmb3JtID0gJ0RBVEFfQUNDRVNTX1BMQVRGT1JNJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgRGF0YVJlY2lwaWVudCA9ICdEQVRBX1JFQ0lQSUVOVCcsXG4gICAgSW5kaXZpZHVhbCA9ICdJTkRJVklEVUFMJyxcbiAgICBNZXJjaGFudCA9ICdNRVJDSEFOVCcsXG4gICAgVmVuZG9yID0gJ1ZFTkRPUidcbn1cblxuLyoqXG4gKiBSZWNpcGllbnQgbWV0YWRhdGEgZmllbGRzIHRoYXQgYXJlIGRlZmluZWQgYnkgRkRYLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWNpcGllbnQgbmFtZSBkaXNwbGF5ZWQgYnkgdGhlIERhdGEgUHJvdmlkZXIgZHVyaW5nIHRoZSBjb25zZW50IGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBSZWNpcGllbnQgTG9nbyBVUkwgbG9jYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9sZWdhbF9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlYXNvbiBmb3IgbGlmZWN5Y2xlIGV2ZW50IHN0YXR1cyBjaGFuZ2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWFVwZGF0ZVJlYXNvbiB7XG4gICAgQnVzaW5lc3NSdWxlID0gJ0JVU0lORVNTX1JVTEUnLFxuICAgIFNlY3VyaXR5RXZlbnQgPSAnU0VDVVJJVFlfRVZFTlQnLFxuICAgIFVzZXJBY3Rpb24gPSAnVVNFUl9BQ1RJT04nLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBpcyBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkIHVzaW5nIG1pY3JvLWRlcG9zaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWljcm8tZGVwb3NpdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBoYXMgYW4gZXhwaXJlZCB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBtaWNyby1kZXBvc2l0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pY3JvLWRlcG9zaXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBzdXJyb3VuZGluZyBleHRlcm5hbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlZCBhY2NvdW50cywgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIG5hdHVyZSBvZiB0cmFuc2ZlcnMgdG8vZnJvbSB0aGlzIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxEZXRlY3RlZEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgZGV0ZWN0ZWRfYWNjb3VudHM6IEFycmF5PERldGVjdGVkQWNjb3VudD47XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRml4ZWRJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXhlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lpZWxkUmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICB5aWVsZF9yYXRlOiBZaWVsZFJhdGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXR1cml0eSBkYXRlIGZvciB0aGlzIGZpeGVkIGluY29tZSBzZWN1cml0eSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpeGVkSW5jb21lXG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaXNzdWUgZGF0ZSBmb3IgdGhpcyBmaXhlZCBpbmNvbWUgc2VjdXJpdHksIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGaXhlZEluY29tZVxuICAgICAqL1xuICAgIGlzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZhY2UgdmFsdWUgdGhhdCBpcyBwYWlkIHVwb24gbWF0dXJpdHkgb2YgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eSwgcGVyIHVuaXQgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICBmYWNlX3ZhbHVlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50LiBUaGlzIGFtb3VudCByZWZsZWN0cyB0aGUgZnVuZHMgZGVwb3NpdGVkIGludG8gdGhlIGFjY291bnQgYW5kIG1heSBub3QgaW5jbHVkZSBhbnkgd2l0aGhlbGQgaW5jb21lIHN1Y2ggYXMgdGF4ZXMgb3Igb3RoZXIgcGF5cm9sbCBkZWR1Y3Rpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWNhc3RlZE1vbnRobHlJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JlY2FzdGVkIG1vbnRobHkgaW5jb21lIGF0IHRoZSB0aW1lIG9mIHN1YnNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBiYXNlbGluZV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGZvcmVjYXN0ZWQgbW9udGhseSBpbmNvbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGb3JlY2FzdGVkTW9udGhseUluY29tZVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEZvcm0gMTA5OSBUeXBlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGb3JtMTA5OVR5cGUge1xuICAgIFVua25vd24gPSAnRk9STV8xMDk5X1RZUEVfVU5LTk9XTicsXG4gICAgTWlzYyA9ICdGT1JNXzEwOTlfVFlQRV9NSVNDJyxcbiAgICBLID0gJ0ZPUk1fMTA5OV9UWVBFX0snXG59XG5cbi8qKlxuICogQW4gYXJiaXRyYXJ5IEpTT04gcGF5bG9hZCBzZW50IHRvIG9yIHJlY2VpdmVkIGZyb20gdGhlIFBsYWlkIHNlcnZlci4gSW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZvcndhcmRlZEpTT05SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcndhcmRlZEpTT05SZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZvcndhcmRlZEpTT05SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgdGhlIGZyYXVkIG9yIGF0dGVtcHRlZCBmcmF1ZC4gYGZyYXVkX2Ftb3VudGAgc2hvdWxkIGJlIG9taXR0ZWQgdG8gaW5kaWNhdGUgYW4gdW5rbm93biBmcmF1ZCBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZyYXVkQW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJhdWRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHZhbHVlLiBUaGlzIHZhbHVlIGNhbiBiZSAwIHRvIGluZGljYXRlIG5vIG1vbmV5IHdhcyBsb3N0LiBNdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiAoZS5nLiwgYDEuMjNgKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGZyYXVkIGFuYWx5c2lzIHBlcmZvcm1lZCBvbiB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJhdWRBbmFseXNpc0RldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHN1Ym1pdHRlZCBkb2N1bWVudCB0eXBlIGlzIHN1cHBvcnRlZCBmb3IgZnJhdWQgYW5hbHlzaXMuICBgc3VjY2Vzc2AgLSBUaGUgZG9jdW1lbnQgdHlwZSBpcyBzdXBwb3J0ZWQuICBgZmFpbGVkYCAtIFRoZSBkb2N1bWVudCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge0ZyYXVkQ2hlY2tPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIHR5cGVfc3VwcG9ydGVkOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgcG9ydHJhaXQgcHJlc2VuY2UgY2hlY2suICBgc3VjY2Vzc2AgLSBBIHBvcnRyYWl0IHdhcyBkZXRlY3RlZC4gIGBmYWlsZWRgIC0gTm8gcG9ydHJhaXQgd2FzIGRldGVjdGVkLlxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBwb3J0cmFpdF9wcmVzZW5jZV9jaGVjazogRnJhdWRDaGVja091dGNvbWU7XG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgb2YgdGhlIHBvcnRyYWl0IGRldGFpbHMgY2hlY2sgaW5jbHVkaW5nIHBob3RvIGVtYmVkZGluZyBhbmQgZmFjZSBsYW5kbWFyayBjaGVja3MuICBgc3VjY2Vzc2AgLSBUaGUgcG9ydHJhaXQgcGFzc2VkIGFsbCB2YWxpZGl0eSBjaGVja3MuICBgZmFpbGVkYCAtIFRoZSBwb3J0cmFpdCBkaWQgbm90IHBhc3Mgb25lIG9yIG1vcmUgdmFsaWRpdHkgY2hlY2tzLlxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBwb3J0cmFpdF9kZXRhaWxzX2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgaW1hZ2UgY29tcG9zaXRpb24gY2hlY2suICBgc3VjY2Vzc2AgLSBUaGUgaW1hZ2UgaXMgYSB2YWxpZCBwaHlzaWNhbCBkb2N1bWVudCBjYXB0dXJlLiAgYGZhaWxlZGAgLSBUaGUgaW1hZ2UgYXBwZWFycyB0byBiZSBhIHBob3RvZ3JhcGggb2YgYSBzY3JlZW4gb3IgYSBkaWdpdGFsIGZvcmdlcnkuXG4gICAgICogQHR5cGUge0ZyYXVkQ2hlY2tPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIGltYWdlX2NvbXBvc2l0aW9uX2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgaW50ZWdyaXR5IGNoZWNrIGZvciBkb2N1bWVudCBzZWN1cml0eSBlbGVtZW50cy4gIGBzdWNjZXNzYCAtIERhdGEgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIGNoZWNrZWQgc2VjdXJpdHkgZWxlbWVudHMuICBgZmFpbGVkYCAtIEluY29uc2lzdGVuY2llcyB3ZXJlIGRldGVjdGVkIGFjcm9zcyBvbmUgb3IgbW9yZSBzZWN1cml0eSBlbGVtZW50cy5cbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaW50ZWdyaXR5X2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgZG9jdW1lbnQgZGV0YWlsIGNoZWNrIGZvciBjb3JyZWN0IHN0eWxpbmcgYW5kIGxheW91dC4gIGBzdWNjZXNzYCAtIFRoZSBkb2N1bWVudCBwYXNzZWQgYWxsIGF1dGhlbnRpY2l0eSBjaGVja3MuICBgZmFpbGVkYCAtIFRoZSBkb2N1bWVudCBkaWQgbm90IHBhc3Mgb25lIG9yIG1vcmUgYXV0aGVudGljaXR5IGNoZWNrcy5cbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgZGV0YWlsX2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgaXNzdWUgZGF0ZSB2YWxpZGl0eSBjaGVjay4gIGBzdWNjZXNzYCAtIFRoZSBpc3N1ZSBkYXRlIGlzIHZhbGlkLiAgYGZhaWxlZGAgLSBUaGUgaXNzdWUgZGF0ZSBpcyBpbnZhbGlkIG9yIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBub19kYXRhYCAtIFRoZSBjaGVjayBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YS5cbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWVXaXRoTm9EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIGlzc3VlX2RhdGVfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lV2l0aE5vRGF0YTtcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgb2YgdGhlIGZyYXVkIGNoZWNrLiAgIGBzdWNjZXNzYCAtIFRoZSBjaGVjayBwYXNzZWQuICBgZmFpbGVkYCAtIFRoZSBjaGVjayBkaWQgbm90IHBhc3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHRoZSBmcmF1ZCBjaGVjay4gICBgc3VjY2Vzc2AgLSBUaGUgY2hlY2sgcGFzc2VkLiAgYGZhaWxlZGAgLSBUaGUgY2hlY2sgZGlkIG5vdCBwYXNzLiAgYG5vX2RhdGFgIC0gVGhlIGNoZWNrIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRnJhdWRDaGVja091dGNvbWVXaXRoTm9EYXRhIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFRoZSB0eXBlcyBvZiBHU0UgUmVwb3J0cyBzdXBwb3J0ZWQgYnkgdGhlIFBsYWlkIEFQSVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gR1NFUmVwb3J0VHlwZSB7XG4gICAgVm9hID0gJ1ZPQScsXG4gICAgRW1wbG95bWVudFJlZnJlc2ggPSAnRU1QTE9ZTUVOVF9SRUZSRVNIJ1xufVxuXG4vKipcbiAqIEluc2lnaHRzIGludG8gZ2FtYmxpbmctcmVsYXRlZCB0cmFuc2FjdGlvbnMsIGluY2x1ZGluZyBmcmVxdWVuY3ksIGFtb3VudHMsIGFuZCB0b3AgbWVyY2hhbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHYW1ibGluZ0luZGljYXRvcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHYW1ibGluZ0luZGljYXRvcnMge1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB2YWx1ZSBvZiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBHQU1CTElOR2AgY3JlZGl0IGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEdhbWJsaW5nSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEdhbWJsaW5nSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9udGhseUF2ZXJhZ2V9XG4gICAgICogQG1lbWJlcm9mIEdhbWJsaW5nSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIG1vbnRobHlfYXZlcmFnZT86IE1vbnRobHlBdmVyYWdlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVcCB0byAzIHRvcCBtZXJjaGFudHMgdGhhdCB0aGUgdXNlciBoYWQgdGhlIG1vc3QgdHJhbnNhY3Rpb25zIGZvciBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdG90YWwgc3BlbmQuICBJZiB0aGUgdXNlciBoYXMgbm90IHNwZW50IG1vbmV5IG9uIGFueSBtZXJjaGFudHMgaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCB0aGlzIGxpc3Qgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdG9wX21lcmNoYW50cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBHQU1CTElOR2AgY3JlZGl0IGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEdhbWJsaW5nSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgc3VtbWFyaWVzIG9mIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBHQU1CTElOR2AgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9udGhseVN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBHYW1ibGluZ0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBtb250aGx5X3N1bW1hcmllcz86IEFycmF5PE1vbnRobHlTdW1tYXJ5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdGhhdCBmYWxscyBpbnRvIHRoZSBgR0FNQkxJTkdgIGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEdhbWJsaW5nSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfbGFzdF9vY2N1cnJlbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdXNlclxcJ3MgbW9udGhseSBpbmZsb3dzIHRoYXQgd2FzIHNwZW50IG9uIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEdBTUJMSU5HYCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMDAgaW5kaWNhdGVzIHRoYXQgMTAwJSBvZiB0aGUgaW5mbG93cyB3ZXJlIHNwZW50IG9uIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEdBTUJMSU5HYCBjcmVkaXQgY2F0ZWdvcnkuIElmIHRoZXJlXFwncyBubyBhdmFpbGFibGUgaW5jb21lIGZvciB0aGUgZ2l2ZW4gdGltZSBwZXJpb2QsIHRoaXMgZmllbGQgdmFsdWUgd2lsbCBiZSBgLTFgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgcGVyY2VudGFnZV9vZl9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbmFseXplZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zO1xufVxuLyoqXG4gKiBHZXRSZWNpcGllbnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZmR4L3JlY2lwaWVudC97cmVjaXBpZW50SWR9YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZXRSZWNpcGllbnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlY2lwaWVudFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBHZXRSZWNpcGllbnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWNpcGllbnQgbmFtZSBkaXNwbGF5ZWQgYnkgdGhlIERhdGEgUHJvdmlkZXIgZHVyaW5nIHRoZSBjb25zZW50IGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBHZXRSZWNpcGllbnRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBSZWNpcGllbnQgTG9nbyBVUkwgbG9jYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBHZXRSZWNpcGllbnRSZXNwb25zZVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9sZWdhbF9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEdldFJlY2lwaWVudHNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZmR4L3JlY2lwaWVudHNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEdldFJlY2lwaWVudHNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlY2lwaWVudHNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBHZXRSZWNpcGllbnRzUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRzOiBBcnJheTxFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhPjtcbn1cbi8qKlxuICogQSBzdGF0dXMgaGVhbHRoIGluY2lkZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhlYWx0aEluY2lkZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoSW5jaWRlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIGluY2lkZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDIwLTEwLTMwVDE1OjI2OjQ4WlxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaW5jaWRlbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBvbiB0aGUgaGVhbHRoIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNpZGVudFVwZGF0ZT59XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgaW5jaWRlbnRfdXBkYXRlczogQXJyYXk8SW5jaWRlbnRVcGRhdGU+O1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIG1hdGNoIHR5cGUgYmV0d2VlbiBkYXRhIHByb3ZpZGVkIGJ5IHVzZXIgYW5kIGRhdGEgY2hlY2tlZCBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlLiAgIGBtYXRjaGAgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgd2FzIGEgc3Ryb25nIG1hdGNoIGFnYWluc3QgZXh0ZXJuYWwgZGF0YS4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIGFnYWluc3QgZXh0ZXJuYWwgZGF0YS4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gcGVyZm9ybSBhIGNoZWNrIGFnYWluc3QgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgYW5kIGl0IGRpZCBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBmaW5kIGV4dGVybmFsIGRhdGEgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2lucHV0YCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgdW5hYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBiZWNhdXNlIG5vIGluZm9ybWF0aW9uIHdhcyBwcm92aWRlZCBmb3IgdGhpcyBmaWVsZCBieSB0aGUgZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJyxcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0J1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGhpc3RvcmljYWwgYW5udWFsIGluY29tZSBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxBbm51YWxJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIaXN0b3JpY2FsQW5udWFsSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaGlzdG9yaWNhbCBhbm51YWwgaW5jb21lIGF0IHRoZSB0aW1lIG9mIHN1YnNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxBbm51YWxJbmNvbWVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGJhc2VsaW5lX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgaGlzdG9yaWNhbCBhbm51YWwgaW5jb21lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEFubnVhbEluY29tZVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi4gIElmIHRoZSBhY2NvdW50IGhhcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMsIGhpc3RvcmljYWwgYmFsYW5jZSBhbW91bnRzIG9uIG9yIGFmdGVyIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRyYW5zYWN0aW9uIG1heSBkaWZmZXIgaWYgcmV0cmlldmVkIGluIHN1YnNlcXVlbnQgQXNzZXQgUmVwb3J0cyBhcyBhIHJlc3VsdCBvZiB0aG9zZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBwb3N0aW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb3N0IGJhc2lzIG9mIHRoZSBob2xkaW5nIChlLmcuLCB0aGUgdG90YWwgYW1vdW50IHNwZW50IHRvIGFjcXVpcmUgYWxsIGFzc2V0cyBjdXJyZW50bHkgaW4gdGhlIGhvbGRpbmcpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB2ZXN0ZWQgYXNzZXRzIGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFZlc3RlZCBhc3NldHMgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIFtlcXVpdGllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzLWhvbGRpbmdzLWdldC1yZXNwb25zZS1zZWN1cml0aWVzLXR5cGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdmVzdGVkIGhvbGRpbmdzIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdmVzdGVkX3ZhbHVlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQZXItbG90IGFjcXVpc2l0aW9uIGRhdGEgZm9yIHRoaXMgaG9sZGluZy4gQW4gZW1wdHkgYXJyYXkgaW5kaWNhdGVzIHRoZSBpbnN0aXR1dGlvbiBkb2VzIG5vdCBwcm92aWRlIGxvdC1sZXZlbCBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nVGF4TG90Pn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHRheF9sb3RzPzogQXJyYXk8SG9sZGluZ1RheExvdD47XG59XG4vKipcbiAqIEEgc2luZ2xlIGFjcXVpc2l0aW9uIGxvdCB3aXRoaW4gYSBob2xkaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nVGF4TG90XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ1RheExvdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxcJ3MgaWRlbnRpZmllciBmb3IgdGhpcyBsb3QuIE51bGwgaWYgdGhlIGluc3RpdHV0aW9uIGRvZXMgbm90IHByb3ZpZGUgYSBsb3QgaWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nVGF4TG90XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbG90X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoaXMgbG90IHdhcyBhY3F1aXJlZCwgaW4gSVNPIDg2MDEgZm9ybWF0LiBOdWxsIGlmIHRoZSBpbnN0aXR1dGlvbiBkb2VzIG5vdCBwcm92aWRlIGFjcXVpc2l0aW9uIGRhdGV0aW1lIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1RheExvdFxuICAgICAqL1xuICAgIG9yaWdpbmFsX3B1cmNoYXNlX2RhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGluIHRoaXMgbG90LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdUYXhMb3RcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2UgcGVyIHVuaXQgb2YgdGhlIHNlY3VyaXR5IGF0IHRoZSB0aW1lIHRoaXMgbG90IHdhcyBhY3F1aXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nVGF4TG90XG4gICAgICovXG4gICAgcHVyY2hhc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNvc3QgYmFzaXMgb2YgdGhpcyBsb3QsIGluY2x1c2l2ZSBvZiBhbnkgZmVlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nVGF4TG90XG4gICAgICovXG4gICAgY29zdF9iYXNpczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBtYXJrZXQgdmFsdWUgb2YgdGhpcyBsb3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1RheExvdFxuICAgICAqL1xuICAgIGN1cnJlbnRfdmFsdWU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvbGRpbmdUYXhMb3RQb3NpdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdUYXhMb3RcbiAgICAgKi9cbiAgICBwb3NpdGlvbl90eXBlOiBIb2xkaW5nVGF4TG90UG9zaXRpb25UeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgYSBob2xkaW5nIGxvdCBwb3NpdGlvbiBpcyBsb25nIG9yIHNob3J0LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBMT05HYCBhbmQgYFNIT1JUYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEhvbGRpbmdUYXhMb3RQb3NpdGlvblR5cGUge1xuICAgIExvbmcgPSAnTE9ORycsXG4gICAgU2hvcnQgPSAnU0hPUlQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgb3IgdXBkYXRlZCBob2xkaW5ncyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LiBUaGUgd2ViaG9vayB0eXBpY2FsbHkgZmlyZXMgaW4gcmVzcG9uc2UgdG8gYW55IG5ld2x5IGFkZGVkIGhvbGRpbmdzIG9yIHByaWNlIGNoYW5nZXMgdG8gZXhpc3RpbmcgaG9sZGluZ3MsIG1vc3QgY29tbW9ubHkgYWZ0ZXIgbWFya2V0IGNsb3NlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEhPTERJTkdTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2hvbGRpbmdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1cGRhdGVkIGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXBkYXRlZF9ob2xkaW5nczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBob2xkaW5ncyBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ3NPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmdzT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb3N0IGJhc2lzIG9mIHRoZSBob2xkaW5nIChlLmcuLCB0aGUgdG90YWwgYW1vdW50IHNwZW50IHRvIGFjcXVpcmUgYWxsIGFzc2V0cyBjdXJyZW50bHkgaW4gdGhlIGhvbGRpbmcpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eTogU2VjdXJpdHlPdmVycmlkZTtcbn1cbi8qKlxuICogSG93IFBsYWlkIHNob3VsZCBkZWxpdmVyIHRoZSBQbGFpZCBMaW5rIHNlc3Npb24gdG8gdGhlIGN1c3RvbWVyLiBPbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgZW5hYmxlZCBmb3IgTGluayBEZWxpdmVyeSAoYmV0YSkuIFRvIHJlcXVlc3QgTGluayBEZWxpdmVyeSBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuIFxcJ3Ntc1xcJyB3aWxsIGRlbGl2ZXIgdmlhIFNNUy4gTXVzdCBwYXNzIGB1c2VyLnBob25lX251bWJlcmAuIFxcJ2VtYWlsXFwnIHdpbGwgZGVsaXZlciB2aWEgZW1haWwuIE11c3QgcGFzcyBgdXNlci5lbWFpbF9hZGRyZXNzYC4gSW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBpZ25vcmVkOyB1c2UgdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgdG8gdGVzdCBMaW5rIERlbGl2ZXJ5IGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kIHtcbiAgICBTbXMgPSAnc21zJyxcbiAgICBFbWFpbCA9ICdlbWFpbCdcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgc3RhdGUgb2YgYW4gU01TIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzIHZlcmlmaWNhdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzIHZlcmlmaWNhdGlvbi4gV2lsbCBhbHdheXMgYmUgYE1BTlVBTExZX1ZFUklGSUVEYCBvciBgVkVSSUZJQ0FUSU9OX0ZBSUxFRGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIG9mIHRoZSBhZmZlY3RlZCBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ/OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGh1bWFuIHJldmlldyBjaGVjaywgd2hpY2ggcmVmZXJzIHRvIGEgY2hlY2sgdGhhdCBpcyBwZXJmb3JtZWQgYnkgYSBkb2N1bWVudCBzcGVjaWFsaXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIdW1hblJldmlld1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEh1bWFuUmV2aWV3IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SHVtYW5SZXZpZXdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEh1bWFuUmV2aWV3XG4gICAgICovXG4gICAgc3RhdHVzOiBIdW1hblJldmlld1N0YXR1cztcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgb2YgdGhlIGh1bWFuIHJldmlldyBjaGVjaywgd2hlbiBhdmFpbGFibGUuIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBwb3NzaWJsZTogICBgc3VjY2Vzc2AgLSBUaGUgZG9jdW1lbnQgcGFzc2VkIHRoZSBjaGVjay4gIGBmYWlsZWRgIC0gVGhlIGRvY3VtZW50IGZhaWxlZCB0aGUgY2hlY2suICBgbm9fZGF0YWAgLSBUaGUgZG9jdW1lbnQgd2FzIHN1Ym1pdHRlZCwgYnV0IHRoZSBkb2N1bWVudCBzcGVjaWFsaXN0IHJldmlldyB3YXMgbm90IGNvbXBsZXRlZCBpbiB0aW1lLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSHVtYW5SZXZpZXdTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBnbG9iYWxseSB1bmlxdWUgYW5kIGh1bWFuIHJlYWRhYmxlIElEIHR5cGUsIHNwZWNpZmljIHRvIHRoZSBjb3VudHJ5IGFuZCBkb2N1bWVudCBjYXRlZ29yeS4gRm9yIG1vcmUgY29udGV4dCBvbiB0aGlzIGZpZWxkLCBzZWUgW0lucHV0IFZhbGlkYXRpb24gUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpZC1udW1iZXJzKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElETnVtYmVyVHlwZSB7XG4gICAgQXJEbmkgPSAnYXJfZG5pJyxcbiAgICBBdURyaXZlcnNMaWNlbnNlID0gJ2F1X2RyaXZlcnNfbGljZW5zZScsXG4gICAgQXVQYXNzcG9ydCA9ICdhdV9wYXNzcG9ydCcsXG4gICAgQnJDcGYgPSAnYnJfY3BmJyxcbiAgICBDYVNpbiA9ICdjYV9zaW4nLFxuICAgIENsUnVuID0gJ2NsX3J1bicsXG4gICAgQ25SZXNpZGVudENhcmQgPSAnY25fcmVzaWRlbnRfY2FyZCcsXG4gICAgQ29OaXQgPSAnY29fbml0JyxcbiAgICBEa0NwciA9ICdka19jcHInLFxuICAgIEVnTmF0aW9uYWxJZCA9ICdlZ19uYXRpb25hbF9pZCcsXG4gICAgRXNEbmkgPSAnZXNfZG5pJyxcbiAgICBFc05pZSA9ICdlc19uaWUnLFxuICAgIEhrSGtpZCA9ICdoa19oa2lkJyxcbiAgICBJblBhbiA9ICdpbl9wYW4nLFxuICAgIEluRXBpYyA9ICdpbl9lcGljJyxcbiAgICBJdENmID0gJ2l0X2NmJyxcbiAgICBKb0NpdmlsSWQgPSAnam9fY2l2aWxfaWQnLFxuICAgIEpwTXlOdW1iZXIgPSAnanBfbXlfbnVtYmVyJyxcbiAgICBLZUh1ZHVtYU5hbWJhID0gJ2tlX2h1ZHVtYV9uYW1iYScsXG4gICAgS3dDaXZpbElkID0gJ2t3X2NpdmlsX2lkJyxcbiAgICBNeEN1cnAgPSAnbXhfY3VycCcsXG4gICAgTXhSZmMgPSAnbXhfcmZjJyxcbiAgICBNeU5yaWMgPSAnbXlfbnJpYycsXG4gICAgTmdOaW4gPSAnbmdfbmluJyxcbiAgICBOekRyaXZlcnNMaWNlbnNlID0gJ256X2RyaXZlcnNfbGljZW5zZScsXG4gICAgT21DaXZpbElkID0gJ29tX2NpdmlsX2lkJyxcbiAgICBQaFBzbiA9ICdwaF9wc24nLFxuICAgIFBsUGVzZWwgPSAncGxfcGVzZWwnLFxuICAgIFJvQ25wID0gJ3JvX2NucCcsXG4gICAgU2FOYXRpb25hbElkID0gJ3NhX25hdGlvbmFsX2lkJyxcbiAgICBTZVBpbiA9ICdzZV9waW4nLFxuICAgIFNnTnJpYyA9ICdzZ19ucmljJyxcbiAgICBUclRjS2ltbGlrID0gJ3RyX3RjX2tpbWxpaycsXG4gICAgVXNTc24gPSAndXNfc3NuJyxcbiAgICBVc1Nzbkxhc3Q0ID0gJ3VzX3Nzbl9sYXN0XzQnLFxuICAgIFphU21hcnRJZCA9ICd6YV9zbWFydF9pZCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIFByb3RlY3QgZXZlbnQgaW5jbHVkaW5nIFRydXN0IEluZGV4IHNjb3JlIGFuZCBmcmF1ZCBhdHRyaWJ1dGVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJRFZQcm90ZWN0RXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRFZQcm90ZWN0RXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJRFZQcm90ZWN0RXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGV2ZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElEVlByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcnVzdEluZGV4fVxuICAgICAqIEBtZW1iZXJvZiBJRFZQcm90ZWN0RXZlbnRcbiAgICAgKi9cbiAgICB0cnVzdF9pbmRleDogVHJ1c3RJbmRleCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXZlbnQgZnJhdWQgYXR0cmlidXRlcyBhcyBhbiBhcmJpdHJhcnkgc2V0IG9mIGtleS12YWx1ZSBwYWlycy4gVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHJldHVybmVkIHZhcmllcyBieSBtb2RlbC5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIElEVlByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIGZyYXVkX2F0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElTT0N1cnJlbmN5Q29kZSB7XG4gICAgVXNkID0gJ1VTRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIGlkZW50aXR5IGRhdGEgaGFzIGJlZW4gZGV0ZWN0ZWQgb24gYW4gSXRlbS4gSXRlbXMgYXJlIGNoZWNrZWQgZm9yIGlkZW50aXR5IHVwZGF0ZXMgZXZlcnkgMzAtOTAgZGF5cy4gV2UgcmVjb21tZW5kIHRoYXQgdXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rIHlvdSBtYWtlIGFub3RoZXIgY2FsbCB0byBgL2lkZW50aXR5L2dldGAgdG8gZmV0Y2ggdGhlIHVzZXJcXCdzIGxhdGVzdCBpZGVudGl0eSBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElERU5USVRZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpZGVudGl0eSBhdHRyaWJ1dGVzIHRoYXQgY2hhbmdlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJQSE9ORVNcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9pZGVudGl0eTogeyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW4gY2xvc2VkIGJldGEuIE9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogQm9vbGVhbiBmaWVsZCBpbmRpY2F0aW5nIGlmIHRoZSB1cGxvYWRlZCBkb2N1bWVudFxcJ3MgYWNjb3VudCBudW1iZXIgbWF0Y2hlcyB0aGUgYWNjb3VudCBudW1iZXIgd2UgaGF2ZSBvbiBmaWxlXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGlzX2FjY291bnRfbnVtYmVyX21hdGNoPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdXBsb2FkZWRfYXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50IG9iamVjdCB3aXRoIG1ldGFkYXRhIG9mIHRoZSB1cGxvYWRlZCBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZCB7XG4gICAgLyoqXG4gICAgICogQSBVVUlEIGlkZW50aWZ5aW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgcmlza19pbnNpZ2h0cz86IElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHM7XG59XG4vKipcbiAqIE1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdWJtaXR0ZWQgZG9jdW1lbnQgdHlwZS4gQ3VycmVudGx5LCB0aGlzIHdpbGwgYWx3YXlzIGJlIGBCQU5LX1NUQVRFTUVOVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gICAgICovXG4gICAgZG9jdW1lbnRfdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQm9vbGVhbiBmaWVsZCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHVwbG9hZGVkIGRvY3VtZW50XFwncyBhY2NvdW50IG51bWJlciBtYXRjaGVzIHRoZSBhY2NvdW50IG51bWJlciB3ZSBoYXZlIG9uIGZpbGUuIElmIGBmYWxzZWAsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhY2NlcHQgdGhlIHVwbG9hZGVkIGlkZW50aXR5IGRhdGEgYXMgYWNjdXJhdGUgd2l0aG91dCBmdXJ0aGVyIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9udW1iZXJfbWF0Y2g/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSB1cGxvYWRlZCBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGFcbiAgICAgKi9cbiAgICBwYWdlX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBsYXN0IHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgZG9jdW1lbnQgd2FzIG9yaWdpbmFsbHkgdXBsb2FkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gICAgICovXG4gICAgdXBsb2FkZWRfYXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCByZXByZXNlbnRpbmcgZnJhdWQgcmlzayBkYXRhIG9mIHRoZSB1cGxvYWRlZCBkb2N1bWVudC4gT25seSBwcm92aWRlZCB3aGVuIHVzaW5nIElkZW50aXR5IERvY3VtZW50IFVwbG9hZCB3aXRoIEZyYXVkIFJpc2sgZW5hYmxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHNcbiAgICAgKi9cbiAgICByaXNrX3N1bW1hcnk/OiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1N1bW1hcnk7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcmlzayBzaWduYWxzLlxuICAgICAqIEB0eXBlIHtBcnJheTxJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHNcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM/OiBBcnJheTxJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbD47XG59XG4vKipcbiAqIFJpc2sgc2lnbmFscyB0aWVkIHRvIHRoZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByaXNrIGZvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZnJhdWQgcmlzayB3YXMgZGV0ZWN0ZWQgb24gdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIGhhc19mcmF1ZF9yaXNrPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBwcm92aWRpbmcgbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHNwZWNpZmljIHJpc2sgc2lnbmFsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgc2lnbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZXZhbnQgcGFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJpc2sgc2lnbmFsLiBJZiB0aGUgcmlzayBzaWduYWwgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHBhZ2UsIHRoZSB2YWx1ZSB3aWxsIGJlIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBwYWdlX251bWJlcj86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJpc2sgc3VtbWFyeSBvZiBhbiB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCwgaW5jbHVzaXZlLCB3aGVyZSBhIHNjb3JlIGNsb3NlciB0byAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSB0cnVzdHdvcnRoeSBhbmQgYSBzY29yZSBjbG9zZXIgdG8gMTAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSBmcmF1ZHVsZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfc2NvcmU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIElkZW50aXR5IGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2lkZW50aXR5L2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGl0eUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIElkZW50aXR5IGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRJZGVudGl0eT59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudElkZW50aXR5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aXR5TWF0Y2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5TWF0Y2hVc2VyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IElkZW50aXR5TWF0Y2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2lkZW50aXR5L21hdGNoYCByZXN1bHRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byBwZXJmb3JtIGZ1enp5IG1hdGNoXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlNYXRjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIElkZW50aXR5IG1hdGNoIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLCBwaG9uZSBudW1iZXIsIGVtYWlsIGFkZHJlc3MgYW5kIGFkZHJlc3MgdXNlZCB0byBwZXJmb3JtIGZ1enp5IG1hdGNoLiBJZiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyBpcyBlbmFibGVkIGluIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdCwgbGVhdmUgdGhpcyBmaWVsZCBlbXB0eSB0byBhdXRvbWF0aWNhbGx5IG1hdGNoIGFnYWluc3QgUElJIGNvbGxlY3RlZCBmcm9tIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gY2hlY2tzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eU1hdGNoVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZnVsbCBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciwgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9LiBGb3IgZXhhbXBsZTogXFxcIisxNDE1NzQ1MjEzMFxcXCIuIFBob25lIG51bWJlcnMgcHJvdmlkZWQgaW4gb3RoZXIgZm9ybWF0cyB3aWxsIGJlIHBhcnNlZCBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLiBQaG9uZSBudW1iZXIgaW5wdXQgaXMgdmFsaWRhdGVkIGFnYWluc3QgdmFsaWQgbnVtYmVyIHJhbmdlczsgbnVtYmVyIHN0cmluZ3MgdGhhdCBkbyBub3QgbWF0Y2ggYSByZWFsLXdvcmxkIHBob25lIG51bWJlcmluZyBzY2hlbWUgbWF5IGNhdXNlIHRoZSByZXF1ZXN0IHRvIGZhaWwsIGV2ZW4gaW4gdGhlIFNhbmRib3ggdGVzdCBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pZGVudGl0eS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiBpZGVudGl0eSBkYXRhIHRoYXQgbWF5IGhhdmUgY2hhbmdlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VXBkYXRlVHlwZXMge1xuICAgIFBob25lcyA9ICdQSE9ORVMnLFxuICAgIEFkZHJlc3NlcyA9ICdBRERSRVNTRVMnLFxuICAgIEVtYWlscyA9ICdFTUFJTFMnLFxuICAgIE5hbWVzID0gJ05BTUVTJ1xufVxuXG4vKipcbiAqIEFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IHJlcHJlc2VudHMgYSBjdXN0b21lclxcJ3MgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlaXIgaWRlbnRpdHksIHJlZmxlY3RpbmcgdGhlIHJlcXVpcmVkIHN0ZXBzIGZvciBjb21wbGV0aW5nIHRoZSBzZXNzaW9uLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBzdGVwLCBhbmQgaW5mb3JtYXRpb24gY29sbGVjdGVkIGluIHRoZSBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBgdXNlcl9pZGAgbWF5IG9ubHkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X3VzZXJfaWRgIGlmIHlvdSB3ZXJlIG5vdCBhIHByZS1leGlzdGluZyB1c2VyIG9mIGAvdXNlci9jcmVhdGVgIGFzIG9mIERlY2VtYmVyIDEwLCAyMDI1OyBmb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIElmIGJvdGggdGhpcyBmaWVsZCBhbmQgYSBgY2xpZW50X3VzZXJfaWRgIGFyZSBwcmVzZW50IGluIGEgcmVxdWVzdCwgdGhlIGB1c2VyX2lkYCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRFZQcm90ZWN0RXZlbnR9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGF0ZXN0X3Njb3JlZF9wcm90ZWN0X2V2ZW50PzogSURWUHJvdGVjdEV2ZW50IHwgbnVsbDtcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGF1dG9maWxsZWQsIHNvbWUgZmllbGRzIG1heSBiZSBudWxsIGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uXFwncyBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgQWRkcmVzc2VzIGZyb20gSG9uZyBLb25nIHdpbGwgbm90IGluY2x1ZGUgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlLiBcXFwiU3ViZGl2aXNpb25cXFwiIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgZXRjLiBGb3IgdGhlIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBwb19ib3g6IFBPQm94U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzUHVycG9zZUxhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHR5cGU6IEFkZHJlc3NQdXJwb3NlTGFiZWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEF1dG9maWxsIHJlcHJlc2VudHMgdW52ZXJpZmllZCBjdXN0b21lciBpbmZvcm1hdGlvbi4gVGhpcyBuZWVkcyB0byBiZSBjb25maXJtZWQgYnkgdGhlIGN1c3RvbWVyIGJlZm9yZSB1c2luZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBzdGF0dXMgZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYXV0b2ZpbGwgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBVc2VyIGluZm9ybWF0aW9uIHRoYXQgd2FzIGF1dG9maWxsZWQuIEFsbCB0aGlzIGluZm9ybWF0aW9uIHNob3VsZCBiZSBjb25maXJtZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIG5hbWU6IElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBVc2VySUROdW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBgdXNlcl9pZGAgbWF5IG9ubHkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X3VzZXJfaWRgIGlmIHlvdSB3ZXJlIG5vdCBhIHByZS1leGlzdGluZyB1c2VyIG9mIGAvdXNlci9jcmVhdGVgIGFzIG9mIERlY2VtYmVyIDEwLCAyMDI1OyBmb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIElmIGJvdGggdGhpcyBmaWVsZCBhbmQgYSBgY2xpZW50X3VzZXJfaWRgIGFyZSBwcmVzZW50IGluIGEgcmVxdWVzdCwgdGhlIGB1c2VyX2lkYCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGV4cG9zZSBhIHNoYXJlYWJsZSBVUkwgZm9yIHRoZSB2ZXJpZmljYXRpb24gYmVpbmcgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfc2hhcmVhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZsYWcgc3BlY2lmeWluZyBob3cgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gaGFuZGxlIGF0dGVtcHRzIHRvIGNyZWF0ZSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gd2hlbiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBpZGVtcG90ZW5jeSBpcyBlbmFibGVkLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgZXhpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLiBJZiBpZGVtcG90ZW5jeSBpcyBkaXNhYmxlZCwgUGxhaWQgd2lsbCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCBhIGA0MDAgQmFkIFJlcXVlc3RgIHN0YXR1cyBjb2RlIGlmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHN1cHBsaWVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2lkZW1wb3RlbnQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC4gSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIHNoYXJlYWJsZSBVUkwgZmVhdHVyZSwgeW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlc2UgZmllbGRzIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpbnN0ZWFkOyBib3RoIGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYW5kIGAvbGluay90b2tlbi9jcmVhdGVgIGFyZSB2YWxpZCB3YXlzIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIGEgbm9uLWBudWxsYCB1c2VyIGRhdGEgb2JqZWN0IHZpYSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgLCBhbnkgdXNlciBkYXRhIGZpZWxkcyBlbnRlcmVkIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBmb3IgdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCB3aWxsIGJlIGlnbm9yZWQgd2hlbiBwcmVmaWxsaW5nIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5aW5nIGB1c2VyLmNsaWVudF91c2VyX2lkYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcHJvdmlkZSBgY2xpZW50X3VzZXJfaWRgIGF0IHRoZSByb290IGxldmVsIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBgdXNlcl9pZGAgbWF5IG9ubHkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X3VzZXJfaWRgIGlmIHlvdSB3ZXJlIG5vdCBhIHByZS1leGlzdGluZyB1c2VyIG9mIGAvdXNlci9jcmVhdGVgIGFzIG9mIERlY2VtYmVyIDEwLCAyMDI1OyBmb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIElmIGJvdGggdGhpcyBmaWVsZCBhbmQgYSBgY2xpZW50X3VzZXJfaWRgIGFyZSBwcmVzZW50IGluIGEgcmVxdWVzdCwgdGhlIGB1c2VyX2lkYCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SURWUHJvdGVjdEV2ZW50fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGF0ZXN0X3Njb3JlZF9wcm90ZWN0X2V2ZW50PzogSURWUHJvdGVjdEV2ZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBUaGUgYWRkcmVzcyBtdXN0IGF0IGxlYXN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgdG8gYmUgYSB2YWxpZCBhZGRyZXNzOiBgc3RyZWV0YCwgYGNpdHlgLCBgY291bnRyeWAuIElmIGFueSBhcmUgbWlzc2luZyBvciB1bmFibGUgdG8gYmUgZXh0cmFjdGVkLCB0aGUgYWRkcmVzcyB3aWxsIGJlIG51bGwuICBgcmVnaW9uYCwgYW5kIGBwb3N0YWxfY29kZWAgbWF5IGJlIG51bGwgYmFzZWQgb24gdGhlIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZSAgTm90ZTogT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24gKE9DUikgdGVjaG5vbG9neSBtYXkgc29tZXRpbWVzIGV4dHJhY3QgaW5jb3JyZWN0IGRhdGEgZnJvbSBhIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDaXR5IGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5kaXZpZHVhbFxcJ3MgbmFtZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2VcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGNhbGxpbmcgYC91c2VyL2NyZWF0ZWAuIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgYHVzZXJfaWRgIG1heSBvbmx5IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF91c2VyX2lkYCBpZiB5b3Ugd2VyZSBub3QgYSBwcmUtZXhpc3RpbmcgdXNlciBvZiBgL3VzZXIvY3JlYXRlYCBhcyBvZiBEZWNlbWJlciAxMCwgMjAyNTsgZm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLiBJZiBib3RoIHRoaXMgZmllbGQgYW5kIGEgYGNsaWVudF91c2VyX2lkYCBhcmUgcHJlc2VudCBpbiBhIHJlcXVlc3QsIHRoZSBgdXNlcl9pZGAgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lEVlByb3RlY3RFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxhdGVzdF9zY29yZWRfcHJvdGVjdF9ldmVudD86IElEVlByb3RlY3RFdmVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBjYWxsaW5nIGAvdXNlci9jcmVhdGVgLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhlIGB1c2VyX2lkYCBtYXkgb25seSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfdXNlcl9pZGAgaWYgeW91IHdlcmUgbm90IGEgcHJlLWV4aXN0aW5nIHVzZXIgb2YgYC91c2VyL2NyZWF0ZWAgYXMgb2YgRGVjZW1iZXIgMTAsIDIwMjU7IGZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS4gSWYgYm90aCB0aGlzIGZpZWxkIGFuZCB0aGUgYGNsaWVudF91c2VyX2lkYCBhcmUgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCwgdGhlIGB1c2VyX2lkYCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgUGxhaWQgc2Vzc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgc2Vzc2lvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6IEFycmF5PElkZW50aXR5VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gY29sbGVjdGVkIG91dHNpZGUgb2YgTGluaywgbW9zdCBsaWtlbHkgdmlhIHlvdXIgb3duIG9uYm9hcmRpbmcgcHJvY2Vzcy4gIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBpZGVudGl0eSBmaWVsZHMgYXJlIG9wdGlvbmFsOiAgYGVtYWlsX2FkZHJlc3NgICBgcGhvbmVfbnVtYmVyYCAgYGRhdGVfb2ZfYmlydGhgICBgbmFtZWAgIGBhZGRyZXNzYCAgYGlkX251bWJlcmAgIFNwZWNpZmljYWxseSwgdGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCBpbiB0aGF0IHRoZXkgY2FuIGVpdGhlciBiZSBmdWxseSBwcm92aWRlZCAoc2F0aXNmeWluZyBldmVyeSByZXF1aXJlZCBmaWVsZCBpbiB0aGVpciBzdWJzY2hlbWEpIG9yIG9taXR0ZWQgZnJvbSB0aGUgcmVxdWVzdCBlbnRpcmVseSBieSBub3QgcHJvdmlkaW5nIHRoZSBrZXkgb3IgdmFsdWUuIFByb3ZpZGluZyB0aGVzZSBmaWVsZHMgdmlhIHRoZSBBUEkgd2lsbCByZXN1bHQgaW4gTGluayBza2lwcGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEFsbCB2ZXJpZmljYXRpb24gc3RlcHMgZW5hYmxlZCBpbiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gVGVtcGxhdGUgd2lsbCBzdGlsbCBiZSBydW4uIFZlcmlmaWNhdGlvbiBzdGVwcyB3aWxsIGVpdGhlciBiZSBydW4gaW1tZWRpYXRlbHksIG9yIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYGdhdmVfY29uc2VudGAgZmllbGQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogWW91IGNhbiB1c2UgdGhpcyBmaWVsZCB0byBwcmUtcG9wdWxhdGUgdGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWU7IGlmIGl0IGlzIHByb3ZpZGVkIGhlcmUsIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBpbiB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGhhcyBub3Qgc3VibWl0dGVkIHRoZWlyIG5hbWUsIHRoaXMgZmllbGQgd2lsbCBiZSBudWxsLiBPdGhlcndpc2UsIGJvdGggZmllbGRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHJldHJpZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVRSSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciByZXRyeWluZyBhbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0cmF0ZWd5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHN0cmF0ZWd5OiBTdHJhdGVneTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc3RlcHM/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGV4cG9zZSBhIHNoYXJlYWJsZSBVUkwgZm9yIHRoZSB2ZXJpZmljYXRpb24gYmVpbmcgcmV0cmllZC4gSWYgYSB2YWx1ZSBmb3IgdGhpcyBmbGFnIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBgaXNfc2hhcmVhYmxlYCBzZXR0aW5nIGZyb20gdGhlIG9yaWdpbmFsIHZlcmlmaWNhdGlvbiBhdHRlbXB0IHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19zaGFyZWFibGU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSW5zdHJ1Y3Rpb25zIGZvciB0aGUgYGN1c3RvbWAgcmV0cnkgc3RyYXRlZ3kgc3BlY2lmeWluZyB3aGljaCBzdGVwcyBzaG91bGQgYmUgcmVxdWlyZWQgb3Igc2tpcHBlZC4gICBOb3RlOiAgIFRoaXMgZmllbGQgbXVzdCBiZSBwcm92aWRlZCB3aGVuIHRoZSByZXRyeSBzdHJhdGVneSBpcyBgY3VzdG9tYCBhbmQgbXVzdCBiZSBvbWl0dGVkIG90aGVyd2lzZS4gIEN1c3RvbSByZXRyaWVzIG92ZXJyaWRlIHNldHRpbmdzIGluIHlvdXIgUGxhaWQgVGVtcGxhdGUuIEZvciBleGFtcGxlLCBpZiB5b3VyIFBsYWlkIFRlbXBsYXRlIGhhcyBgdmVyaWZ5X3Ntc2AgZGlzYWJsZWQsIGEgY3VzdG9tIHJldHJ5IHdpdGggYHZlcmlmeV9zbXNgIGVuYWJsZWQgd2lsbCBzdGlsbCByZXF1aXJlIHRoZSBzdGVwLiAgVGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNhbmRib3ggc2VydmVyLiBTYW5kYm94IHJlcXVlc3RzIHdpbGwgc2lsZW50bHkgZGlzYWJsZSB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcCB3aGVuIHByb3ZpZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdCB7XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYHZlcmlmeV9zbXNgIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBreWNfY2hlY2tgIChEYXRhIFNvdXJjZSBWZXJpZmljYXRpb24pIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBJZiBhIHByZXZpb3VzIHNlc3Npb24gaGFzIGFscmVhZHkgcGFzc2VkIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLCB0aGUgbmV3IHNlbGZpZSBjaGVjayB3aWxsIGJlIGEgU2VsZmllIFJlYXV0aGVudGljYXRpb24gY2hlY2ssIGluIHdoaWNoIHRoZSBzZWxmaWUgaXMgdGVzdGVkIGZvciBsaXZlbmVzcyBhbmQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHByZXZpb3VzIHNlbGZpZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHNoYXJlYWJsZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogU2VsZmllQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcmlmeV9zbXM6IFZlcmlmeVNNU0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBgdXNlcl9pZGAgbWF5IG9ubHkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X3VzZXJfaWRgIGlmIHlvdSB3ZXJlIG5vdCBhIHByZS1leGlzdGluZyB1c2VyIG9mIGAvdXNlci9jcmVhdGVgIGFzIG9mIERlY2VtYmVyIDEwLCAyMDI1OyBmb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIElmIGJvdGggdGhpcyBmaWVsZCBhbmQgYSBgY2xpZW50X3VzZXJfaWRgIGFyZSBwcmVzZW50IGluIGEgcmVxdWVzdCwgdGhlIGB1c2VyX2lkYCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lEVlByb3RlY3RFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgbGF0ZXN0X3Njb3JlZF9wcm90ZWN0X2V2ZW50PzogSURWUHJvdGVjdEV2ZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoaXMgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuICAgYGFjdGl2ZWAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaXMgaW5jb21wbGV0ZS4gVGhlIHVzZXIgbWF5IGhhdmUgY29tcGxldGVkIHBhcnQgb2YgdGhlIHNlc3Npb24sIGJ1dCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHBhc3NlZC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkLCBwYXNzaW5nIGFsbCBzdGVwcyBkZWZpbmVkIHRvIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS4gIGBmYWlsZWRgIC0gVGhlIHVzZXIgZmFpbGVkIG9uZSBvciBtb3JlIHN0ZXBzIGluIHRoZSBzZXNzaW9uIGFuZCB3YXMgdG9sZCB0byBjb250YWN0IHN1cHBvcnQuICBgZXhwaXJlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGFjdGl2ZSBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lIHdpdGhvdXQgYmVpbmcgY29tcGxldGVkIGFuZCB3YXMgYXV0b21hdGljYWxseSBtYXJrZWQgYXMgZXhwaXJlZC4gTm90ZSB0aGF0IHNlc3Npb25zIGN1cnJlbnRseSBkbyBub3QgZXhwaXJlLiBBdXRvbWF0aWMgZXhwaXJhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBlbmFibGVkIGluIHRoZSBmdXR1cmUuICBgY2FuY2VsZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBjYW5jZWxlZCwgZWl0aGVyIHZpYSB0aGUgZGFzaGJvYXJkIGJ5IGEgdXNlciwgb3IgdmlhIEFQSS4gVGhlIHVzZXIgbWF5IGhhdmUgY29tcGxldGVkIHBhcnQgb2YgdGhlIHNlc3Npb24sIGJ1dCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHBhc3NlZC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBDYW5jZWxlZCA9ICdjYW5jZWxlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3Jldmlldydcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHN0ZXAgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFdhaXRpbmdGb3JQcmVyZXF1aXNpdGUgPSAnd2FpdGluZ19mb3JfcHJlcmVxdWlzaXRlJyxcbiAgICBOb3RBcHBsaWNhYmxlID0gJ25vdF9hcHBsaWNhYmxlJyxcbiAgICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnLFxuICAgIE1hbnVhbGx5UmVqZWN0ZWQgPSAnbWFudWFsbHlfcmVqZWN0ZWQnXG59XG5cbi8qKlxuICogRWFjaCBzdGVwIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgIGBhY3RpdmVgIC0gVGhpcyBzdGVwIGlzIHRoZSB1c2VyXFwncyBjdXJyZW50IHN0ZXAuIFRoZXkgYXJlIGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBjb21wbGV0aW5nIHRoaXMgc3RlcCwgb3IgdGhleSByZWNlbnRseSBjbG9zZWQgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIHN0ZXAuIE9ubHkgb25lIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYGFjdGl2ZWAgYXQgYW55IGdpdmVuIHBvaW50LiAgYHN1Y2Nlc3NgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGhhcyBjb21wbGV0ZWQgdGhpcyBzdGVwLiAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgdGhpcyBzdGVwLiBUaGlzIGNhbiBlaXRoZXIgY2F1c2UgdGhlIHVzZXIgdG8gZmFpbCB0aGUgc2Vzc2lvbiBhcyBhIHdob2xlLCBvciBjYXVzZSB0aGVtIHRvIGZhbGwgYmFjayB0byBhbm90aGVyIHN0ZXAgZGVwZW5kaW5nIG9uIGhvdyB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlIGlzIGNvbmZpZ3VyZWQuIEEgZmFpbGVkIHN0ZXAgZG9lcyBub3QgaW1wbHkgYSBmYWlsZWQgc2Vzc2lvbi4gIGB3YWl0aW5nX2Zvcl9wcmVyZXF1aXNpdGVgIC0gVGhlIHVzZXIgbmVlZHMgdG8gY29tcGxldGUgYW5vdGhlciBzdGVwIGZpcnN0LCBiZWZvcmUgdGhleSBwcm9ncmVzcyB0byB0aGlzIHN0ZXAuIFRoaXMgc3RlcCBtYXkgbmV2ZXIgcnVuLCBkZXBlbmRpbmcgb24gaWYgdGhlIHVzZXIgZmFpbHMgYW4gZWFybGllciBzdGVwIG9yIGlmIHRoZSBzdGVwIGlzIG9ubHkgcnVuIGFzIGEgZmFsbGJhY2suICBgbm90X2FwcGxpY2FibGVgIC0gVGhpcyBzdGVwIHdpbGwgbm90IGJlIHJ1biBmb3IgdGhpcyBzZXNzaW9uLiAgYHNraXBwZWRgIC0gVGhlIHJldHJ5IGluc3RydWN0aW9ucyB0aGF0IGNyZWF0ZWQgdGhpcyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzcGVjaWZpZWQgdGhhdCB0aGlzIHN0ZXAgc2hvdWxkIGJlIHNraXBwZWQuICBgZXhwaXJlZGAgLSBUaGlzIHN0ZXAgaGFkIG5vdCB5ZXQgYmVlbiBjb21wbGV0ZWQgd2hlbiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgYXMgYSB3aG9sZSBleHBpcmVkLiAgYGNhbmNlbGVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgY2FuY2VsZWQgYmVmb3JlIHRoZSB1c2VyIGNvbXBsZXRlZCB0aGlzIHN0ZXAuICBgcGVuZGluZ19yZXZpZXdgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHRlbXBsYXRlIHdhcyBjb25maWd1cmVkIHRvIHBlcmZvcm0gYSBzY3JlZW5pbmcgdGhhdCBoYWQgb25lIG9yIG1vcmUgaGl0cyBuZWVkaW5nIHJldmlldy4gIGBtYW51YWxseV9hcHByb3ZlZGAgLSBUaGUgc3RlcCB3YXMgbWFudWFsbHkgb3ZlcnJpZGRlbiB0byBwYXNzIGJ5IGEgdGVhbSBtZW1iZXIgaW4gdGhlIGRhc2hib2FyZC4gIGBtYW51YWxseV9yZWplY3RlZGAgLSBUaGUgc3RlcCB3YXMgbWFudWFsbHkgb3ZlcnJpZGRlbiB0byBmYWlsIGJ5IGEgdGVhbSBtZW1iZXIgaW4gdGhlIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBhY2NlcHRfdG9zOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmeV9zbXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZzogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIGNvbXBsZXRlZCBhIHN0ZXAgb2YgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNURVBfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHJlc291cmNlIElEIGFuZCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdGVtcGxhdGUgY29uZmlndXJpbmcgdGhlIGJlaGF2aW9yIG9mIGEgZ2l2ZW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gY29sbGVjdGVkLCBzb21lIGZpZWxkcyBtYXkgYmUgbnVsbCBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvblxcJ3MgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlLiBcXFwiU3ViZGl2aXNpb25cXFwiIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgZXRjLiBGb3IgdGhlIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZGF0YSB0aGF0IHdhcyBlaXRoZXIgY29sbGVjdGVkIGZyb20gdGhlIHVzZXIgb3IgcHJvdmlkZWQgdmlhIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIG5hbWU6IElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBVc2VySUROdW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBIGhpZ2ggbGV2ZWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1YWxpdHkgb2YgdGhlIGltYWdlIHRoZSB1c2VyIHN1Ym1pdHRlZC4gIEZvciBleGFtcGxlLCBhbiBpbWFnZSB0aGF0IGlzIGJsdXJyeSwgZGlzdG9ydGVkIGJ5IGdsYXJlIGZyb20gYSBuZWFyYnkgbGlnaHQgc291cmNlLCBvciBpbXByb3Blcmx5IGZyYW1lZCBtaWdodCBiZSBtYXJrZWQgYXMgbG93IG9yIG1lZGl1bSBxdWFsaXR5LiBQb29yIHF1YWxpdHkgaW1hZ2VzIGFyZSBtb3JlIGxpa2VseSB0byBmYWlsIE9DUiBhbmQvb3IgdGVtcGxhdGUgY29uZm9ybWl0eSBjaGVja3MuICBOb3RlOiBCeSBkZWZhdWx0LCBQbGFpZCB3aWxsIGxldCBhIHVzZXIgcmVjYXB0dXJlIGRvY3VtZW50IGltYWdlcyB0d2ljZSBiZWZvcmUgZmFpbGluZyB0aGUgZW50aXJlIHNlc3Npb24gaWYgd2UgYXR0cmlidXRlIHRoZSBmYWlsdXJlIHRvIGxvdyBpbWFnZSBxdWFsaXR5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VRdWFsaXR5IHtcbiAgICBIaWdoID0gJ2hpZ2gnLFxuICAgIE1lZGl1bSA9ICdtZWRpdW0nLFxuICAgIExvdyA9ICdsb3cnXG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgaW1hZ2UgcXVhbGl0eSBvZiB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEltYWdlUXVhbGl0eURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVF1YWxpdHlEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgZ2xhcmUgY2hlY2suICBgc3VjY2Vzc2AgLSBUaGUgaW1hZ2UgaXMgZnJlZSBvZiBnbGFyZS4gIGBmYWlsZWRgIC0gVGhlIGltYWdlIGNvbnRhaW5zIGdsYXJlIHRoYXQgbWF5IG9ic2N1cmUgZG9jdW1lbnQgZGV0YWlscy5cbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5T3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgSW1hZ2VRdWFsaXR5RGV0YWlsc1xuICAgICAqL1xuICAgIGdsYXJlX2NoZWNrOiBJbWFnZVF1YWxpdHlPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIG9mIHRoZSBkaW1lbnNpb25zIGNoZWNrLiAgYHN1Y2Nlc3NgIC0gVGhlIGltYWdlIG1lZXRzIHRoZSBtaW5pbXVtIHNpemUgYW5kIHJlc29sdXRpb24gcmVxdWlyZW1lbnRzLiAgYGZhaWxlZGAgLSBUaGUgaW1hZ2UgZG9lcyBub3QgbWVldCB0aGUgbWluaW11bSBzaXplIG9yIHJlc29sdXRpb24gcmVxdWlyZW1lbnRzLlxuICAgICAqIEB0eXBlIHtJbWFnZVF1YWxpdHlPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBJbWFnZVF1YWxpdHlEZXRhaWxzXG4gICAgICovXG4gICAgZGltZW5zaW9uc19jaGVjazogSW1hZ2VRdWFsaXR5T3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgYmx1ciBjaGVjay4gIGBzdWNjZXNzYCAtIFRoZSBpbWFnZSBpcyBzdWZmaWNpZW50bHkgc2hhcnAuICBgZmFpbGVkYCAtIFRoZSBpbWFnZSBpcyB0b28gYmx1cnJ5IGZvciBhbmFseXNpcy5cbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5T3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgSW1hZ2VRdWFsaXR5RGV0YWlsc1xuICAgICAqL1xuICAgIGJsdXJfY2hlY2s6IEltYWdlUXVhbGl0eU91dGNvbWU7XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHRoZSBpbWFnZSBxdWFsaXR5IGNoZWNrLiAgIGBzdWNjZXNzYCAtIFRoZSBjaGVjayBwYXNzZWQuICBgZmFpbGVkYCAtIFRoZSBjaGVjayBkaWQgbm90IHBhc3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbWFnZVF1YWxpdHlPdXRjb21lIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQW4gdXBkYXRlIG9uIHRoZSBoZWFsdGggaW5jaWRlbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jaWRlbnRVcGRhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNpZGVudFVwZGF0ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzPzogSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHVwZGF0ZSB3YXMgcHVibGlzaGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDIwLTEwLTMwVDE1OjI2OjQ4WlxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgdXBkYXRlZF9kYXRlPzogc3RyaW5nO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEluY2lkZW50VXBkYXRlU3RhdHVzRW51bSB7XG4gICAgSW52ZXN0aWdhdGluZyA9ICdJTlZFU1RJR0FUSU5HJyxcbiAgICBJZGVudGlmaWVkID0gJ0lERU5USUZJRUQnLFxuICAgIFNjaGVkdWxlZCA9ICdTQ0hFRFVMRUQnLFxuICAgIFJlc29sdmVkID0gJ1JFU09MVkVEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJyZWFrZG93biBvZiB0aGUgZGlmZmVyZW50IGluY29tZSB0eXBlcyBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lQnJlYWtkb3duVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgdHlwZTogSW5jb21lQnJlYWtkb3duVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGhvdXJseSByYXRlIGF0IHdoaWNoIHRoZSBpbmNvbWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaG91cnMgbG9nZ2VkIGZvciB0aGlzIGluY29tZSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBwYXkgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgaW5jb21lLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogICBgXFxcInJlZ3VsYXJcXFwiYDogcmVndWxhciBpbmNvbWUgICBgXFxcIm92ZXJ0aW1lXFxcImA6IG92ZXJ0aW1lIGluY29tZSAgIGBcXFwiYm9udXNcXFwiYDogYm9udXMgaW5jb21lXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVCcmVha2Rvd25UeXBlIHtcbiAgICBCb251cyA9ICdib251cycsXG4gICAgT3ZlcnRpbWUgPSAnb3ZlcnRpbWUnLFxuICAgIFJlZ3VsYXIgPSAncmVndWxhcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIENvbXByZWhlbnNpdmUgaW5jb21lIGFuYWx5c2lzIGluY2x1ZGluZyB0b3RhbCBpbmNvbWUsIGluY29tZSBleGNsdWRpbmcgdHJhbnNmZXJzLCBhbmQgaW5ib3VuZCB0cmFuc2ZlciBhbW91bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGFsbCBpbmNvbWUgdHJhbnNhY3Rpb25zIGluIHRoZSBnaXZlbiB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7QW1vdW50V2l0aEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX2luY29tZT86IEFtb3VudFdpdGhDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgZXhjbHVkaW5nIGFjY291bnQgdHJhbnNmZXIgdHJhbnNhY3Rpb25zIGZvciB0aGUgcGVyaW9kLCBpbmNsdWRpbmcgYSBtb250aGx5IGF2ZXJhZ2UuXG4gICAgICogQHR5cGUge0Ftb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfZXhjbHVkaW5nX3RyYW5zZmVycz86IEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZTtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5ib3VuZCB0cmFuc2ZlciB0cmFuc2FjdGlvbnMgZm9yIHRoZSBwZXJpb2QsIGluY2x1ZGluZyBhIG1vbnRobHkgYXZlcmFnZS5cbiAgICAgKiBAdHlwZSB7QW1vdW50V2l0aEN1cnJlbmN5V2l0aE1vbnRobHlBdmVyYWdlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zZmVyc19pbj86IEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZTtcbn1cbi8qKlxuICogRmlsdGVycyB0aGUgcmV0dXJuZWQgaW5jb21lIHN0cmVhbXMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmNvbWUgY2F0ZWdvcmllcy4gSWYgbm8gZmlsdGVycyBhcmUgcmVxdWVzdGVkLCBzdHJlYW1zIGZyb20gdGhlIGZvbGxvd2luZyBkZWZhdWx0IHNldCBvZiBjYXRlZ29yaWVzIGFyZSByZXR1cm5lZDogLSBgRUFSTkVEX0lOQ09NRS4qYCAoYEVBUk5FRF9JTkNPTUUuU0FMQVJZYCwgYEVBUk5FRF9JTkNPTUUuR0lHX0VDT05PTVlgLCBgRUFSTkVEX0lOQ09NRS5TRUxGX0VNUExPWUVEYCkgLSBgQkVORUZJVFMuRElTQUJJTElUWWAgLSBgUkVUSVJFTUVOVC4qYCAoYFJFVElSRU1FTlQuR09WRVJOTUVOVF9ERVJJVkVEYCwgYFJFVElSRU1FTlQuUFJJVkFURV9SRVRJUkVNRU5UYCwgYFJFVElSRU1FTlQuUExBTl9ESVNUUklCVVRJT05gKSAgVGhlIGZpbmFsIGxpc3Qgb2YgaW5jb21lIGNhdGVnb3JpZXMgaXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyB0aGUgYGluY2x1ZGVkX2NhdGVnb3JpZXNgLCB0aGVuIHJlbW92aW5nIHRoZSBgZXhjbHVkZWRfY2F0ZWdvcmllc2AuIFByaW9yaXR5IGlzIGdpdmVuIHRvIGBleGNsdWRlZF9jYXRlZ29yaWVzYCBpbiB0aGUgY2FzZSBvZiBjb2xsaXNpb25zLiAgRmlsdGVyIHBhdHRlcm5zIHN1cHBvcnRlZDogLSBgKmA6IEFsbCBjYXRlZ29yaWVzIC0gYFBSSU1BUlkuKmA6IEFsbCBjYXRlZ29yaWVzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHByaW1hcnkgY2F0ZWdvcnkgLSBgUFJJTUFSWS5TRUNPTkRBUllgOiBBIHNwZWNpZmljIGluY29tZSBjYXRlZ29yeSAgRm9yIGEgbGlzdCBvZiBpbmNvbWUgY2F0ZWdvcmllcywgc2VlIHRoZSBbSW5jb21lIFYyIENhdGVnb3J5IFRheG9ub215XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvaW5jb21lLXYyLWNhdGVnb3J5LXRheG9ub215LmNzdikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZUluc2lnaHRzRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lSW5zaWdodHNGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGVzIGluY29tZSBzdHJlYW1zIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lSW5zaWdodHNGaWx0ZXJcbiAgICAgKi9cbiAgICBpbmNsdWRlZF9jYXRlZ29yaWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEV4Y2x1ZGVzIGluY29tZSBzdHJlYW1zIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lSW5zaWdodHNGaWx0ZXJcbiAgICAgKi9cbiAgICBleGNsdWRlZF9jYXRlZ29yaWVzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgSW5jb21lIEluc2lnaHRzIHRvIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZUluc2lnaHRzVmVyc2lvbiB7XG4gICAgSWkyID0gJ0lJMidcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IHBheXJvbGwgZGF0YSBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBheXN0dWJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwYXlzdHVicz86IEFycmF5PFBheXN0dWJPdmVycmlkZT47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHcycyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFcyT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVPdmVycmlkZVxuICAgICAqL1xuICAgIHcycz86IEFycmF5PFcyT3ZlcnJpZGU+O1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBudW1iZXIgb2YgaW5jb21lIHNvdXJjZXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU291cmNlc0NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVNvdXJjZXNDb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaW5jb21lIHNvdXJjZXMgZGV0ZWN0ZWQgYXQgdGhlIHN1YnNjcmlwdGlvbiBkYXRlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU291cmNlc0NvdW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYmFzZWxpbmVfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaW5jb21lIHNvdXJjZXMgY3VycmVudGx5IGRldGVjdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU291cmNlc0NvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIHZlcmlmaWVkIGZpZWxkcyBmcm9tIGEgcGF5c3R1YiB2ZXJpZmljYXRpb24uIEFsbCBmaWVsZHMgYXJlIHByb3ZpZGVkIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZXJfbmFtZTogRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZWVfbmFtZTogRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX2dyb3NzX2luY29tZTogWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9uZXRfaW5jb21lOiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IFBheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHByb2plY3RlZF93YWdlOiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmaWVkX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaWVsZCBudW1iZXIgZm9yIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgaW5jb21lIHN1bW1hcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZW5kcG9pbnQgdG8gd2hpY2ggUGxhaWQgc2hvdWxkIHNlbmQgd2ViaG9va3MgcmVsYXRlZCB0byB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHByZWNoZWNrIGNyZWF0ZWQgd2l0aCBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgLiBXaWxsIGJlIHVzZWQgdG8gaW1wcm92ZSBjb252ZXJzaW9uIG9mIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogT3B0aW9uYWwgYXJndW1lbnRzIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlIHByb2R1Y3QgZGF0YS4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGNvcnJlbGF0ZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gdGhlc2UgSXRlbXMgd2l0aCBkYXRhIGZyb20gdGhlIHVzZXJcXCdzIHBheXN0dWIsIHN1Y2ggYXMgZGF0ZSBhbmQgYW1vdW50LiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIExpbmssIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvcHRpb25zIHRvIGVuYWJsZSBmb3IgZG9jdW1lbnQgcGFyc2luZ1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZyB7XG4gICAgT2NyID0gJ29jcicsXG4gICAgUmlza1NpZ25hbHMgPSAncmlza19zaWduYWxzJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkb2N1bWVudCBJRCB0byBkb3dubG9hZC4gSWYgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcgemlwIGZpbGUsIHJhdGhlciB0aGFuIGFsbCBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmxvdyB0eXBlcyB0byByZXRyaWV2ZSBwYXlyb2xsIGluY29tZSBkYXRhXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGUge1xuICAgIERpZ2l0YWxJbmNvbWUgPSAncGF5cm9sbF9kaWdpdGFsX2luY29tZScsXG4gICAgRG9jdW1lbnRJbmNvbWUgPSAncGF5cm9sbF9kb2N1bWVudF9pbmNvbWUnXG59XG5cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uIGZvciB3aGljaCB0byBnZXQgcGF5c3R1YiBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBNZXRhZGF0YSBmb3IgYW4gaW5jb21lIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5c3R1YnM6IEFycmF5PFBheXN0dWI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNvbmZpZGVuY2UgdGhhdCBQbGFpZCBjYW4gc3VwcG9ydCB0aGUgdXNlciBpbiB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cgaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBtYW51YWwgcGF5c3R1YiB1cGxvYWQuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJISUdIXFxcImA6IEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgXFxcImBMT1dgXFxcIjogSXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIHVzZXIgY2FuIHVzZSB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuICBgXFxcIlVOS05PV05cXFwiYDogSXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIHVzZXIgaXMgc3VwcG9ydGFibGUgd2l0aCB0aGUgaW5mb3JtYXRpb24gcGFzc2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlIHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIExvdyA9ICdMT1cnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIHRheCBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAgICAgKi9cbiAgICB0YXhfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBlbXBsb3llclxcJ3MgcHVibGljIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgbWlsaXRhcnkgaW5mbyBpbiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcmVjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mbyB7XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHVzZXIgY3VycmVudGx5IGFjdGl2ZSBkdXR5IGluIHRoZSBVUyBtaWxpdGFyeVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGlzX2FjdGl2ZV9kdXR5PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlcnZpbmcgaW4gdGhlIFVTIG1pbGl0YXJ5LCB0aGUgYnJhbmNoIG9mIHRoZSBtaWxpdGFyeSBpbiB3aGljaCB0aGV5IGFyZSBzZXJ2aW5nIFZhbGlkIHZhbHVlczogXFwnQUlSIEZPUkNFXFwnLCBcXCdBUk1ZXFwnLCBcXCdDT0FTVCBHVUFSRFxcJywgXFwnTUFSSU5FU1xcJywgXFwnTkFWWVxcJywgXFwnVU5LTk9XTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gICAgICovXG4gICAgYnJhbmNoPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBwYXlyb2xsIGluc3RpdHV0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHBheXJvbGwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5cm9sbF9pbnN0aXR1dGlvbj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcHJlY2hlY2suIFByb3ZpZGUgdGhpcyB2YWx1ZSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaW4gb3JkZXIgdG8gb3B0aW1pemUgTGluayBjb252ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmVjaGVja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIGVsaWdpYmlsaXR5IGlzIGJlaW5nIGV2YWx1YXRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBob21lX2FkZHJlc3M/OiBTaWduYWxBZGRyZXNzRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIGF0dGVtcHQgdG8gcmVmcmVzaCBQYXlyb2xsIEluY29tZSBkYXRhIGZvciBhIHVzZXIgdmlhIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIGZhaWxlZCBiZWNhdXNlIHRoZSB1c2VyIG11c3QgcmUtY29ubmVjdCB0aGVpciBwYXlyb2xsIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SRUZSRVNIX1JFQ09OTkVDVF9ORUVERURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmlzayBzaWduYWxzIGhhdmUgYmVlbiBwcm9jZXNzZWQgZm9yIGRvY3VtZW50cyB1cGxvYWRlZCB2aWEgRG9jdW1lbnQgSW5jb21lLiBJdCB3aWxsIHR5cGljYWxseSB0YWtlIGEgbWludXRlIG9yIHR3byBmb3IgdGhpcyB3ZWJob29rIHRvIGZpcmUgYWZ0ZXIgdGhlIGVuZCB1c2VyIGhhcyB1cGxvYWRlZCB0aGVpciBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIG1heSB0aGVuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZG9jdW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBhbmQgdG8gcmV0cmlldmUgcmlzayBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiSU5DT01FXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW0gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUklTS19TSUdOQUxTX1BST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmcmF1ZCBkZXRlY3Rpb24gcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiBJZiB0aGUgdXNlciB1cGxvYWRlZCBtdWx0aXBsZSBkb2N1bWVudHMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbGwgZG9jdW1lbnRzIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gQ2FsbCB0aGUgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGFsbCByaXNrIHNpZ25hbCBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsc19zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgdHlwZXMgb2Ygc291cmNlIGluY29tZSBkYXRhIHRoYXQgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2hhcmVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGUge1xuICAgIEJhbmsgPSAnYmFuaycsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlIGhhcyBjaGFuZ2VkLiBUaGlzIHdlYmhvb2sgaXMgZmlyZWQgZm9yIGJvdGggdGhlIERvY3VtZW50IGFuZCBQYXlyb2xsIEluY29tZSBmbG93cywgYnV0IG5vdCB0aGUgQmFuayBJbmNvbWUgZmxvdy4gSXQgd2lsbCB0eXBpY2FsbHkgdGFrZSBzZXZlcmFsIG1pbnV0ZXMgZm9yIHRoaXMgd2ViaG9vayB0byBmaXJlIGFmdGVyIHRoZSBlbmQgdXNlciBoYXMgdXBsb2FkZWQgdGhlaXIgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiSU5DT01FXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYDogIFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgZG9jdW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgc3VjY2Vzc2Z1bGx5IG9yIHRoYXQgdGhlIGRvY3VtZW50cyB3ZXJlIG5vdCBwYXJzYWJsZS4gSWYgdGhlIHVzZXIgdXBsb2FkZWQgbXVsdGlwbGUgZG9jdW1lbnRzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYWxsIGRvY3VtZW50cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIENhbGwgdGhlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgZW5kcG9pbnQgYW5kIGNoZWNrIHRoZSBkb2N1bWVudCBtZXRhZGF0YSB0byBzZWUgd2hpY2ggZG9jdW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfRkFJTEVEYDogQW4gdW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCB3aGVuIGF0dGVtcHRpbmcgdG8gcHJvY2VzcyB0aGUgdmVyaWZpY2F0aW9uIGRvY3VtZW50YXRpb24uICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QRU5ESU5HX0FQUFJPVkFMYDogKGRlcHJlY2F0ZWQpIFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNlbnQgdG8gdGhlIHVzZXIgZm9yIHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZvcm1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUYXhmb3JtPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRheGZvcm1zOiBBcnJheTxUYXhmb3JtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiB3ZWJob29rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbldlYmhvb2tTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGFyZW50IGNvbnRhaW5lciBmb3IgbmFtZSB0aGF0IGFsbG93cyBmb3IgY2hvaWNlIGdyb3VwIGJldHdlZW4gcGFyc2VkIGFuZCB1bnBhcnNlZCBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmRpdmlkdWFsTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIEZpcnN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBMYXN0TmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBOYW1lIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsLCBpbmNsdWRpbmcgYWxsIHBhcnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBwZXJzb24uIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICBpc19wcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWFrQWxpYXNEZXRlcm1pbmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICB3ZWFrX2FsaWFzX2RldGVybWluYXRpb246IFdlYWtBbGlhc0RldGVybWluYXRpb247XG59XG4vKipcbiAqIFNob3J0aGFuZCBpZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHNjcmVlbmluZyBsaXN0IGZvciBpbmRpdmlkdWFscy4gIGBBVV9DT05gOiBBdXN0cmFsaWEgRGVwYXJ0bWVudCBvZiBGb3JlaWduIEFmZmFpcnMgYW5kIFRyYWRlIENvbnNvbGlkYXRlZCBMaXN0ICBgQ0FfQ09OYDogR292ZXJubWVudCBvZiBDYW5hZGEgQ29uc29saWRhdGVkIExpc3Qgb2YgU2FuY3Rpb25zICBgRVVfQ09OYDogRXVyb3BlYW4gRXh0ZXJuYWwgQWN0aW9uIFNlcnZpY2UgQ29uc29saWRhdGVkIExpc3QgIGBJWl9DSUFgOiBDSUEgTGlzdCBvZiBDaGllZnMgb2YgU3RhdGUgYW5kIENhYmluZXQgTWVtYmVycyAgYElaX0lQTGA6IEludGVycG9sIFJlZCBOb3RpY2VzIGZvciBXYW50ZWQgUGVyc29ucyBMaXN0ICBgSVpfUEVQYDogUG9saXRpY2FsbHkgRXhwb3NlZCBQZXJzb25zIExpc3QgIGBJWl9VTkNgOiBVbml0ZWQgTmF0aW9ucyBDb25zb2xpZGF0ZWQgU2FuY3Rpb25zICBgSVpfV0JLYDogV29ybGQgQmFuayBMaXN0aW5nIG9mIEluZWxpZ2libGUgRmlybXMgYW5kIEluZGl2aWR1YWxzICBgVUtfSE1DYDogRm9yZWlnbiwgQ29tbW9ud2VhbHRoICYgRGV2ZWxvcG1lbnQgT2ZmaWNlIFVLIFNhbmN0aW9ucyBMaXN0ICBgVVNfRFBMYDogQnVyZWF1IG9mIEluZHVzdHJ5IGFuZCBTZWN1cml0eSBEZW5pZWQgUGVyc29ucyBMaXN0ICBgVVNfRFRDYDogVVMgRGVwYXJ0bWVudCBvZiBTdGF0ZSBBRUNBIERlYmFycmVkICBgVVNfRkJJYDogVVMgRGVwYXJ0bWVudCBvZiBKdXN0aWNlIEZCSSBXYW50ZWQgTGlzdCAgYFVTX0ZTRWA6IFVTIE9GQUMgRm9yZWlnbiBTYW5jdGlvbnMgRXZhZGVycyAgYFVTX0lTTmA6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgTm9ucHJvbGlmZXJhdGlvbiBTYW5jdGlvbnMgIGBVU19QTENgOiBVUyBPRkFDIFBhbGVzdGluaWFuIExlZ2lzbGF0aXZlIENvdW5jaWwgIGBVU19TQU1gOiBVUyBTeXN0ZW0gZm9yIEF3YXJkIE1hbmFnZW1lbnQgRXhjbHVzaW9uIExpc3QgIGBVU19TRE5gOiBVUyBPRkFDIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hdGlvbmFscyBMaXN0ICBgVVNfU1NJYDogVVMgT0ZBQyBTZWN0b3JhbCBTYW5jdGlvbnMgSWRlbnRpZmljYXRpb25zICBgU0dfU09GYDogR292ZXJubWVudCBvZiBTaW5nYXBvcmUgVGVycm9yaXN0cyBhbmQgVGVycm9yaXN0IEVudGl0aWVzICBgVFJfVFdMYDogR292ZXJubWVudCBvZiBUdXJrZXkgVGVycm9yaXN0IFdhbnRlZCBMaXN0ICBgVFJfREZEYDogR292ZXJubWVudCBvZiBUdXJrZXkgRG9tZXN0aWMgRnJlZXppbmcgRGVjaXNpb25zICBgVFJfRk9SYDogR292ZXJubWVudCBvZiBUdXJrZXkgRm9yZWlnbiBGcmVlemluZyBSZXF1ZXN0cyAgYFRSX1dNRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFdlYXBvbnMgb2YgTWFzcyBEZXN0cnVjdGlvbiAgYFRSX0NNQmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IENhcGl0YWwgTWFya2V0cyBCb2FyZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5kaXZpZHVhbFdhdGNobGlzdENvZGUge1xuICAgIEF1Q29uID0gJ0FVX0NPTicsXG4gICAgQ2FDb24gPSAnQ0FfQ09OJyxcbiAgICBFdUNvbiA9ICdFVV9DT04nLFxuICAgIEl6Q2lhID0gJ0laX0NJQScsXG4gICAgSXpJcGwgPSAnSVpfSVBMJyxcbiAgICBJelBlcCA9ICdJWl9QRVAnLFxuICAgIEl6VW5jID0gJ0laX1VOQycsXG4gICAgSXpXYmsgPSAnSVpfV0JLJyxcbiAgICBVa0htYyA9ICdVS19ITUMnLFxuICAgIFVzRHBsID0gJ1VTX0RQTCcsXG4gICAgVXNEdGMgPSAnVVNfRFRDJyxcbiAgICBVc0ZiaSA9ICdVU19GQkknLFxuICAgIFVzRnNlID0gJ1VTX0ZTRScsXG4gICAgVXNJc24gPSAnVVNfSVNOJyxcbiAgICBVc01icyA9ICdVU19NQlMnLFxuICAgIFVzUGxjID0gJ1VTX1BMQycsXG4gICAgVXNTYW0gPSAnVVNfU0FNJyxcbiAgICBVc1NkbiA9ICdVU19TRE4nLFxuICAgIFVzU3NpID0gJ1VTX1NTSScsXG4gICAgU2dTb2YgPSAnU0dfU09GJyxcbiAgICBUclR3bCA9ICdUUl9UV0wnLFxuICAgIFRyRGZkID0gJ1RSX0RGRCcsXG4gICAgVHJGb3IgPSAnVFJfRk9SJyxcbiAgICBUcldtZCA9ICdUUl9XTUQnLFxuICAgIFRyQ21iID0gJ1RSX0NNQidcbn1cblxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGluZGl2aWR1YWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpc19yZXNjYW5uaW5nX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2F0Y2hsaXN0cyBlbmFibGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtXG4gICAgICogQHR5cGUge1NldDxJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgSW5kaXZpZHVhbHNcXFwiLCBcXFwiVVMgQ2FyZGhvbGRlcnNcXFwiLCBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbmFtZV9zZW5zaXRpdml0eTogUHJvZ3JhbU5hbWVTZW5zaXRpdml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIGBpbmZsb3dfbW9kZWxgIGFsbG93cyB5b3UgdG8gbW9kZWwgYSB0ZXN0IGFjY291bnQgdGhhdCByZWNlaXZlcyByZWd1bGFyIGluY29tZSBvciBtYWtlIHJlZ3VsYXIgcGF5bWVudHMgb24gYSBsb2FuLiBBbnkgdHJhbnNhY3Rpb25zIGdlbmVyYXRlZCBieSB0aGUgYGluZmxvd19tb2RlbGAgd2lsbCBhcHBlYXIgaW4gYWRkaXRpb24gdG8gcmFuZG9tbHkgZ2VuZXJhdGVkIHRlc3QgZGF0YSBvciB0cmFuc2FjdGlvbnMgc3BlY2lmaWVkIGJ5IGBvdmVycmlkZV9hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZmxvd01vZGVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5mbG93TW9kZWwge1xuICAgIC8qKlxuICAgICAqIEluZmxvdyBtb2RlbC4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgbm9uZWA6IE5vIGluY29tZSAgYG1vbnRobHktaW5jb21lYDogSW5jb21lIG9jY3VycyBvbmNlIHBlciBtb250aCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgOiBQYXlzIG9mZiB0aGUgYmFsYW5jZSBvbiBhIGxpYWJpbGl0eSBhY2NvdW50IGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnQgZGF5IG9mIG1vbnRoLiAgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YDogTWFrZXMgYW4gaW50ZXJlc3Qtb25seSBwYXltZW50IG9uIGEgbGlhYmlsaXR5IGFjY291bnQgYXQgdGhlIGdpdmVuIHN0YXRlbWVudCBkYXkgb2YgbW9udGguICBOb3RlIHRoYXQgYWNjb3VudCB0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMgd2lsbCBhY2NydWUgaW50ZXJlc3QgaW4gdGhlIFNhbmRib3guIFRoZSB0eXBlcyBpbXBhY3RlZCBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggc3VidHlwZSBgY3JlZGl0YCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBpbmNvbWUgcGVyIG1vbnRoLiBUaGlzIHZhbHVlIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgaW5jb21lX2Ftb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgaW5jb21lIHRyYW5zYWN0aW9uIHdpbGwgYXBwZWFyLiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBwYXltZW50X2RheV9vZl9tb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgYmV0d2VlbiAxIGFuZCAyOCwgb3IgYGxhc3RgIG1lYW5pbmcgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggdGhlIGJhbGFuY2UgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgc3RhdGVtZW50X2RheV9vZl9tb250aDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlbGF0aW5nIHRvIGEgc3BlY2lmaWMgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgaW5zdGl0dXRpb24uIE5vdGUgdGhhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiBtYXkgaGF2ZSBtdWx0aXBsZSByZWNvcmRzLCBlYWNoIHdpdGggZGlmZmVyZW50IGluc3RpdHV0aW9uIElEczsgZm9yIGV4YW1wbGUsIGlmIHRoZSBpbnN0aXR1dGlvbiBoYXMgbWlncmF0ZWQgdG8gT0F1dGgsIHRoZXJlIG1heSBiZSBzZXBhcmF0ZSBgaW5zdGl0dXRpb25faWRgcyBmb3IgdGhlIE9BdXRoIGFuZCBub24tT0F1dGggdmVyc2lvbnMgb2YgdGhlIGluc3RpdHV0aW9uLiBJbnN0aXR1dGlvbnMgdGhhdCBvcGVyYXRlIGluIGRpZmZlcmVudCBjb3VudHJpZXMgb3Igd2l0aCBtdWx0aXBsZSBsb2dpbiBwb3J0YWxzIG1heSBhbHNvIGhhdmUgc2VwYXJhdGUgYGluc3RpdHV0aW9uX2lkYHMgZm9yIGVhY2ggY291bnRyeSBvciBwb3J0YWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIFBsYWlkIHByb2R1Y3RzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uIE5vdGUgdGhhdCBvbmx5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgSW5zdGFudCBBdXRoIHdpbGwgcmV0dXJuIGBhdXRoYCBpbiB0aGUgcHJvZHVjdCBhcnJheTsgaW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IGxpc3QgYGF1dGhgIG1heSBzdGlsbCBzdXBwb3J0IG90aGVyIEF1dGggbWV0aG9kcyBzdWNoIGFzIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgVmVyaWZpY2F0aW9uLiBUbyBpZGVudGlmeSBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIG1ldGhvZHMsIHVzZSB0aGUgYGF1dGhfbWV0YWRhdGFgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtGdWxsIEF1dGggY292ZXJhZ2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS8pLiBUaGUgYGluY29tZV92ZXJpZmljYXRpb25gIHByb2R1Y3QgaGVyZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgQmFuayBJbmNvbWUuIE5vdGU6IEZvciBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGFuZCBUcmFuc2ZlciwgbGlzdGVkIGluc3RpdHV0aW9ucyBtYXkgYmUgaW5jb21wbGV0ZSBvciBpbmNvcnJlY3QuIEluc3RlYWQsIHVzZSB0aGUgZm9sbG93aW5nOiBgYmFsYW5jZWAgc3VwcG9ydCBhbHNvIGluZGljYXRlcyBjb3ZlcmFnZSBvZiBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzOyBgYXV0aGAgc3VwcG9ydCBhbHNvIGluZGljYXRlcyBjb3ZlcmFnZSBvZiBUcmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJZiBQbGFpZCBkb2VzIG5vdCBoYXZlIHByaW1hcnkgY29sb3IgZGF0YSBmb3IgdGhlIGluc3RpdHV0aW9uLCB0aGlzIGZpZWxkIHdpbGwgYmUgYSBkZXRlcm1pbmlzdGljYWxseSBnZW5lcmF0ZWQgZmFsbGJhY2sgY29sb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ28sIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGtub3duIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uIFRoaXMgbGlzdCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9va2luZyB1cCBpbnN0aXR1dGlvbnMgYnkgcm91dGluZyBudW1iZXIuIEl0IGlzIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2YgRFRDIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBkdGNfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIHdpbGwgYmUgYHRydWVgIGlmIE9BdXRoIGlzIHN1cHBvcnRlZCBmb3IgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24sIGV2ZW4gaWYgdGhlIGluc3RpdHV0aW9uIGFsc28gc3VwcG9ydHMgbm9uLU9BdXRoIGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBhdXRoX21ldGFkYXRhPzogQXV0aE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBvcHRpb25zLmluY2x1ZGVfc3RhdHVzYCBvcHRpb24gc2V0IHRvIHRydWUuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbiBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGl0ZW1fbG9naW5zPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBhdXRoPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50c191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9mIHJlY2VudCBoZWFsdGggaW5jaWRlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEhlYWx0aEluY2lkZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBoZWFsdGhfaW5jaWRlbnRzPzogQXJyYXk8SGVhbHRoSW5jaWRlbnQ+IHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBpbnN0aXR1dGlvbiBzdGF0dXMgbWVldHMgdGhlIGNvbmRpdGlvbnMgY29uZmlndXJlZCBpbiB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYERBU0hCT0FSRF9DT05GSUdVUkVEX0FMRVJUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOU1RJVFVUSU9OX1NUQVRVU19BTEVSVF9UUklHR0VSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBnbG9iYWwgc3VjY2VzcyByYXRlIG9mIHRoZSBpbnN0aXR1dGlvbiwgY2FsY3VsYXRlZCBiYXNlZCBvbiBpdGVtIGFkZCBoZWFsdGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9vdmVyYWxsX3N1Y2Nlc3NfcmF0ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIFJUUCBhbmQgUmZQIG5ldHdvcmsgYW5kIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgbGlua2VkIEl0ZW1cXCdzIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3JrcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzXG4gICAgICovXG4gICAgcnRwOiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZlB9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAgICAgKi9cbiAgICByZnA6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHRvIGdldCBkZXRhaWxzIGFib3V0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYC4gSWYgcHJvdmlkZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIGFuIGluc3RpdHV0aW9uXFwncyBsb2dvLCBicmFuZCBjb2xvciwgYW5kIFVSTC4gV2hlbiBhdmFpbGFibGUsIHRoZSBiYW5rXFwncyBsb2dvIGlzIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcsIHRoZSBicmFuZCBjb2xvciBpcyBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEkgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGl0dXRpb24uIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9zdGF0dXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHNraXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuICBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW5zdGl0dXRpb25zL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRoZSBJbnN0aXR1dGlvbnMgYmFzZWQgb24gd2hpY2ggcHJvZHVjdHMgdGhleSBzdXBwb3J0LiBXaWxsIG9ubHkgcmV0dXJuIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgYWxsIGxpc3RlZCBwcm9kdWN0cy4gV2hlbiBmaWx0ZXJpbmcgYmFzZWQgb24gYGF1dGhgLCBhbiBpbnN0aXR1dGlvbiBtdXN0IHN1cHBvcnQgSW5zdGFudCBBdXRoIHRvIG1hdGNoIHRoZSBjcml0ZXJpb24uIFRvIGZpbHRlciBmb3IgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBzdXBwb3J0LCB1c2UgYGJhbGFuY2VgLiBUbyBmaWx0ZXIgZm9yIFRyYW5zZmVyIHN1cHBvcnQsIHVzZSBgYXV0aGAuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiByb3V0aW5nIG51bWJlcnMgdG8gZmlsdGVyIGluc3RpdHV0aW9ucy4gVGhlIHJlc3BvbnNlIHdpbGwgb25seSByZXR1cm4gaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggYWxsIG9mIHRoZSByb3V0aW5nIG51bWJlcnMgaW4gdGhlIGFycmF5LiBSb3V0aW5nIG51bWJlciByZWNvcmRzIHVzZWQgZm9yIHRoaXMgbWF0Y2hpbmcgYXJlIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlOyBob3dldmVyLCBmYWlsdXJlIHRvIG1hdGNoIGEgZ2l2ZW4gcm91dGluZyBudW1iZXIgdG8gYW4gaW5zdGl0dXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZSBpbnN0aXR1dGlvbiBpcyB1bnN1cHBvcnRlZCBieSBQbGFpZC4gSW52YWxpZCByb3V0aW5nIG51bWJlcnMgKG51bWJlcnMgdGhhdCBhcmUgbm90IDkgZGlnaXRzIGluIGxlbmd0aCBvciBkbyBub3QgaGF2ZSBhIHZhbGlkIGNoZWNrc3VtKSB3aWxsIGJlIGZpbHRlcmVkIGZyb20gdGhlIGFycmF5IGJlZm9yZSB0aGUgcmVzcG9uc2UgaXMgcHJvY2Vzc2VkLiBJZiBhbGwgcHJvdmlkZWQgcm91dGluZyBudW1iZXJzIGFyZSBpbnZhbGlkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVycz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gTm90ZSB0aGF0IGluc3RpdHV0aW9ucyB3aWxsIGhhdmUgYG9hdXRoYCBzZXQgdG8gYHRydWVgIGlmIHNvbWUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW5zdGl0dXRpb24gYXJlIHJlcXVpcmVkIHRvIHVzZSBPQXV0aCBmbG93czsgaW5zdGl0dXRpb25zIGluIGEgc3RhdGUgb2YgbWlncmF0aW9uIHRvIE9BdXRoIHdpbGwgaGF2ZSB0aGUgYG9hdXRoYCBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm4gdGhlIGluc3RpdHV0aW9uXFwncyBob21lcGFnZSBVUkwsIGxvZ28gYW5kIHByaW1hcnkgYnJhbmQgY29sb3IuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEksIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgQXV0aCBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggYXV0aCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgUGxhaWQgaW5zdGl0dXRpb25zXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBhY2NvdW50IGZpbHRlciB0byBhcHBseSB0byBpbnN0aXR1dGlvbnMgc2VhcmNoIHJlcXVlc3RzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgbG9hbj86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIGluc3RpdHV0aW9ucyBieSB2YXJpb3VzIFBheW1lbnQgSW5pdGlhdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnkuIEluc3RpdHV0aW9ucyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBxdWVyeSBhcmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgc3VwcG9ydCBhbGwgcHJvZHVjdHMgbGlzdGVkIGluIGBwcm9kdWN0c2AuIFByb3ZpZGUgYG51bGxgIHRvIGdldCBpbnN0aXR1dGlvbnMgcmVnYXJkbGVzcyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMuIE5vdGUgdGhhdCB3aGVuIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBpZiB5b3UgYXJlIGVuYWJsZWQgZm9yIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQgZXZlbiBpZiBgYXV0aGAgaXMgbm90IHByZXNlbnQgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS4gVG8gc2VhcmNoIGZvciBUcmFuc2ZlciBzdXBwb3J0LCB1c2UgYGF1dGhgOyB0byBzZWFyY2ggZm9yIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgc3VwcG9ydCwgdXNlIGBiYWxhbmNlYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBMaW1pdCByZXN1bHRzIHRvIGluc3RpdHV0aW9ucyB3aXRoIG9yIHdpdGhvdXQgT0F1dGggbG9naW4gZmxvd3MuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbnMgd2lsbCBoYXZlIGBvYXV0aGAgc2V0IHRvIGB0cnVlYCBpZiBzb21lIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGluc3RpdHV0aW9uIGFyZSByZXF1aXJlZCB0byB1c2UgT0F1dGggZmxvd3M7IGluc3RpdHV0aW9ucyBpbiBhIHN0YXRlIG9mIG1pZ3JhdGlvbiB0byBPQXV0aCB3aWxsIGhhdmUgdGhlIGBvYXV0aGAgYXR0cmlidXRlIHNldCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2F1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluc3RpdHV0aW9ucyBtYXRjaGluZyB0aGUgc2VhcmNoIGNyaXRlcmlhXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc2luZ2xlIGFjY291bnQgYXQgYSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHdpdGggYWRkaXRpb25hbCBpbnZlc3RtZW50LXNwZWNpZmljIGJhbGFuY2UgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBXaGVuIHVzaW5nIGEgQ1JBIGVuZHBvaW50IChhbiBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCBpLmUuIGFueSBlbmRwb2ludCBiZWdpbm5pbmcgd2l0aCBgL2NyYS9gKSwgdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCB3aWxsIG5vdCBtYXRjaCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIGJ5IGEgbm9uLUNSQSBlbmRwb2ludC4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgYmFsYW5jZXM6IEludmVzdG1lbnRBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBJbnZlc3RtZW50QWNjb3VudFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UsIFBOQywgYW5kIFVTIEJhbmspLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIGlzIHBvcHVsYXRlZCBmb3IgVEFOLWJhc2VkIGluc3RpdHV0aW9ucyAoYGluc181NmAsIGBpbnNfMTNgLCBgaW5zXzEyNzk5MGApIGFzIHdlbGwgYXMgdGhlIE9BdXRoIFNhbmRib3ggaW5zdGl0dXRpb24gKGBpbnNfMTI3Mjg3YCk7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50QWNjb3VudFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEFjY291bnRBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRBY2NvdW50QWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEFsbE9mXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRBbGxPZlxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBiYWxhbmNlczogSW52ZXN0bWVudEFjY291bnRCYWxhbmNlO1xufVxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudCwgaW5jbHVkaW5nIG1hcmdpbiBsb2FuIGluZm9ybWF0aW9uIGZvciBpbnZlc3RtZW50IGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbC10aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBvciBieSBgL3NpZ25hbC9ldmFsdWF0ZWAgd2l0aCBhIEJhbGFuY2Utb25seSBydWxlc2V0LiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIGludG8gZW5hYmxpbmcgW2xpbWl0ZWQtcHVycG9zZSBjaGVja2luZyBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyNlbmFibGluZy1saW1pdGVkLXB1cnBvc2UtY2hlY2tpbmctYWNjb3VudHMtZm9yLXJlbnQtb3ItbW9ydGdhZ2UpLCB3aGljaCBhbHdheXMgaGF2ZSBgbnVsbGAgdmFsdWVzIGZvciBib3RoIGBhdmFpbGFibGVgIGFuZCBgY3VycmVudGAgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gU2ltaWxhciB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaXMgdHlwaWNhbGx5IGV4cGVjdGVkLCB3aGlsZSBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIG9yIGJ5IGAvc2lnbmFsL2V2YWx1YXRlYCB3aXRoIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQ7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgY2FsbGVkIHdpdGggYSBCYWxhbmNlLW9ubHkgYHJ1bGVzZXRfa2V5YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIGludG8gZW5hYmxpbmcgW2xpbWl0ZWQtcHVycG9zZSBjaGVja2luZyBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyNlbmFibGluZy1saW1pdGVkLXB1cnBvc2UtY2hlY2tpbmctYWNjb3VudHMtZm9yLXJlbnQtb3ItbW9ydGdhZ2UpLCB3aGljaCBhbHdheXMgaGF2ZSBgbnVsbGAgdmFsdWVzIGZvciBib3RoIGBhdmFpbGFibGVgIGFuZCBgY3VycmVudGAgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhlIGJhbGFuY2Ugd2FzIHVwZGF0ZWQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIG9ubHkgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGJvcnJvd2VkIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBpbnZlc3RtZW50LXR5cGUgYWNjb3VudHMsIHRoZSBtYXJnaW4gYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYm9ycm93ZWQgYXNzZXRzIGluIHRoZSBhY2NvdW50LCBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBUaGlzIGlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIG1hcmdpbiBvciBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbWFyZ2luX2xvYW5fYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBib3Jyb3dlZCBmdW5kcyBpbiB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBGb3IgaW52ZXN0bWVudC10eXBlIGFjY291bnRzLCB0aGUgbWFyZ2luIGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGJvcnJvd2VkIGFzc2V0cyBpbiB0aGUgYWNjb3VudCwgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gVGhpcyBpcyBjb21tb25seSByZWZlcnJlZCB0byBhcyBtYXJnaW4gb3IgYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QmFsYW5jZUFsbE9mXG4gICAgICovXG4gICAgbWFyZ2luX2xvYW5fYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtaW52ZXN0bWVudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50QWNjb3VudFN1YnR5cGUge1xuICAgIF81MjkgPSAnNTI5JyxcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEZoc2EgPSAnZmhzYScsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTXV0dWFsRnVuZCA9ICdtdXR1YWwgZnVuZCcsXG4gICAgTm9uQ3VzdG9kaWFsV2FsbGV0ID0gJ25vbi1jdXN0b2RpYWwgd2FsbGV0JyxcbiAgICBOb25UYXhhYmxlQnJva2VyYWdlQWNjb3VudCA9ICdub24tdGF4YWJsZSBicm9rZXJhZ2UgYWNjb3VudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIFBlbnNpb24gPSAncGVuc2lvbicsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBRc2hyID0gJ3FzaHInLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJsaWYgPSAncmxpZicsXG4gICAgUm90aCA9ICdyb3RoJyxcbiAgICBSb3RoNDAxayA9ICdyb3RoIDQwMWsnLFxuICAgIFJvdGg0MDNCID0gJ3JvdGggNDAzQicsXG4gICAgUm90aDQ1N2IgPSAncm90aCA0NTdiJyxcbiAgICBSb3RoUGVuc2lvbiA9ICdyb3RoIHBlbnNpb24nLFxuICAgIFJvdGhQcm9maXRTaGFyaW5nUGxhbiA9ICdyb3RoIHByb2ZpdCBzaGFyaW5nIHBsYW4nLFxuICAgIFJvdGhUaHJpZnRTYXZpbmdzUGxhbiA9ICdyb3RoIHRocmlmdCBzYXZpbmdzIHBsYW4nLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUnJzcCA9ICdycnNwJyxcbiAgICBTYXJzZXAgPSAnc2Fyc2VwJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFRocmlmdFNhdmluZ3NQbGFuID0gJ3RocmlmdCBzYXZpbmdzIHBsYW4nLFxuICAgIFRmc2EgPSAndGZzYScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFVnbWEgPSAndWdtYScsXG4gICAgVXRtYSA9ICd1dG1hJyxcbiAgICBWYXJpYWJsZUFubnVpdHkgPSAndmFyaWFibGUgYW5udWl0eScsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB3aXRoaW4gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsZWdhY3kgZmllbGQgZm9ybWVybHkgdXNlZCBpbnRlcm5hbGx5IGJ5IFBsYWlkIHRvIGlkZW50aWZ5IGNlcnRhaW4gY2FuY2VsZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2FuY2VsX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBzZXR0bGVtZW50IGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIHJlcHJlc2VudGluZyB3aGVuIHRoZSBvcmRlciB0eXBlIHdhcyBpbml0aWF0ZWQuIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCByZWZsZWN0cyB0aGUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuIEZvciB0cmFuc2FjdGlvbnMgcmVwcmVzZW50aW5nIGEgc2ltdWx0YW5lb3VzIGNhc2ggY29udHJpYnV0aW9uIGFuZCBwdXJjaGFzZSBvZiBhIHNlY3VyaXR5LCB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBwdXJjaGFzZSB0YWtlcyBwcmVjZWRlbmNlLCBhbmQgdGhlIGBhbW91bnRgIGlzIHJlcHJlc2VudGVkIGFzIHBvc2l0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21iaW5lZCB2YWx1ZSBvZiBhbGwgZmVlcyBhcHBsaWVkIHRvIHRoaXMgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmZWVzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZvciBkZXNjcmlwdGlvbnMgb2YgcG9zc2libGUgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtJbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2ludmVzdG1lbnQtdHJhbnNhY3Rpb24tdHlwZXMtc2NoZW1hKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGUge1xuICAgIEFjY291bnRGZWUgPSAnYWNjb3VudCBmZWUnLFxuICAgIEFkanVzdG1lbnQgPSAnYWRqdXN0bWVudCcsXG4gICAgQXNzaWdubWVudCA9ICdhc3NpZ25tZW50JyxcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBCdXlUb0NvdmVyID0gJ2J1eSB0byBjb3ZlcicsXG4gICAgQ29udHJpYnV0aW9uID0gJ2NvbnRyaWJ1dGlvbicsXG4gICAgRGVwb3NpdCA9ICdkZXBvc2l0JyxcbiAgICBEaXN0cmlidXRpb24gPSAnZGlzdHJpYnV0aW9uJyxcbiAgICBEaXZpZGVuZCA9ICdkaXZpZGVuZCcsXG4gICAgRGl2aWRlbmRSZWludmVzdG1lbnQgPSAnZGl2aWRlbmQgcmVpbnZlc3RtZW50JyxcbiAgICBFeGVyY2lzZSA9ICdleGVyY2lzZScsXG4gICAgRXhwaXJlID0gJ2V4cGlyZScsXG4gICAgRnVuZEZlZSA9ICdmdW5kIGZlZScsXG4gICAgSW50ZXJlc3QgPSAnaW50ZXJlc3QnLFxuICAgIEludGVyZXN0UmVjZWl2YWJsZSA9ICdpbnRlcmVzdCByZWNlaXZhYmxlJyxcbiAgICBJbnRlcmVzdFJlaW52ZXN0bWVudCA9ICdpbnRlcmVzdCByZWludmVzdG1lbnQnLFxuICAgIExlZ2FsRmVlID0gJ2xlZ2FsIGZlZScsXG4gICAgTG9hblBheW1lbnQgPSAnbG9hbiBwYXltZW50JyxcbiAgICBMb25nVGVybUNhcGl0YWxHYWluID0gJ2xvbmctdGVybSBjYXBpdGFsIGdhaW4nLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW5SZWludmVzdG1lbnQgPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbiByZWludmVzdG1lbnQnLFxuICAgIE1hbmFnZW1lbnRGZWUgPSAnbWFuYWdlbWVudCBmZWUnLFxuICAgIE1hcmdpbkV4cGVuc2UgPSAnbWFyZ2luIGV4cGVuc2UnLFxuICAgIE1lcmdlciA9ICdtZXJnZXInLFxuICAgIE1pc2NlbGxhbmVvdXNGZWUgPSAnbWlzY2VsbGFuZW91cyBmZWUnLFxuICAgIE5vblF1YWxpZmllZERpdmlkZW5kID0gJ25vbi1xdWFsaWZpZWQgZGl2aWRlbmQnLFxuICAgIE5vblJlc2lkZW50VGF4ID0gJ25vbi1yZXNpZGVudCB0YXgnLFxuICAgIFBlbmRpbmdDcmVkaXQgPSAncGVuZGluZyBjcmVkaXQnLFxuICAgIFBlbmRpbmdEZWJpdCA9ICdwZW5kaW5nIGRlYml0JyxcbiAgICBRdWFsaWZpZWREaXZpZGVuZCA9ICdxdWFsaWZpZWQgZGl2aWRlbmQnLFxuICAgIFJlYmFsYW5jZSA9ICdyZWJhbGFuY2UnLFxuICAgIFJldHVybk9mUHJpbmNpcGFsID0gJ3JldHVybiBvZiBwcmluY2lwYWwnLFxuICAgIFJlcXVlc3QgPSAncmVxdWVzdCcsXG4gICAgU2VsbCA9ICdzZWxsJyxcbiAgICBTZWxsU2hvcnQgPSAnc2VsbCBzaG9ydCcsXG4gICAgU2VuZCA9ICdzZW5kJyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpbiA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgU2hvcnRUZXJtQ2FwaXRhbEdhaW5SZWludmVzdG1lbnQgPSAnc2hvcnQtdGVybSBjYXBpdGFsIGdhaW4gcmVpbnZlc3RtZW50JyxcbiAgICBTcGluT2ZmID0gJ3NwaW4gb2ZmJyxcbiAgICBTcGxpdCA9ICdzcGxpdCcsXG4gICAgU3RvY2tEaXN0cmlidXRpb24gPSAnc3RvY2sgZGlzdHJpYnV0aW9uJyxcbiAgICBUYXggPSAndGF4JyxcbiAgICBUYXhXaXRoaGVsZCA9ICd0YXggd2l0aGhlbGQnLFxuICAgIFRyYWRlID0gJ3RyYWRlJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgVHJhbnNmZXJGZWUgPSAndHJhbnNmZXIgZmVlJyxcbiAgICBUcnVzdEZlZSA9ICd0cnVzdCBmZWUnLFxuICAgIFVucXVhbGlmaWVkR2FpbiA9ICd1bnF1YWxpZmllZCBnYWluJyxcbiAgICBXaXRoZHJhd2FsID0gJ3dpdGhkcmF3YWwnXG59XG5cbi8qKlxuICogVmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6IGBidXlgOiBCdXlpbmcgYW4gaW52ZXN0bWVudCBgc2VsbGA6IFNlbGxpbmcgYW4gaW52ZXN0bWVudCBgY2FuY2VsYDogQSBjYW5jZWxsYXRpb24gb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uIGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHdoaWNoIG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlciAgRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQnV5ID0gJ2J1eScsXG4gICAgU2VsbCA9ICdzZWxsJyxcbiAgICBDYW5jZWwgPSAnY2FuY2VsJyxcbiAgICBDYXNoID0gJ2Nhc2gnLFxuICAgIEZlZSA9ICdmZWUnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJ1xufVxuXG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgZm9yIHRoZSA0MDFrIGFjY291bnQuIE5vdGUgdGhhdCB0aGUgc3VtIGZpZWxkcyBpbiB0aGlzIG9iamVjdCByZXByZXNlbnQgdGhlIHRvdGFsIG9mIGFic29sdXRlIGNvbnRyaWJ1dGlvbiB2YWx1ZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgbW9zdCByZWNlbnQgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBmb3IgdGhlIDQwMWsgYWNjb3VudC4gSW5jbHVkZXMgYWxsIGNvbnRyaWJ1dGlvbnMgbWFkZSBvbiB0aGUgc2FtZSBkYXkuXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgbGFzdF9jb250cmlidXRpb25fdHJhbnNhY3Rpb25zOiBBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IG1vbnRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgY29udHJpYnV0aW9uX2NvdW50XzFtOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIHRoZSBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IG1vbnRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgY29udHJpYnV0aW9uX2Ftb3VudF8xbTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDYgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgY29udHJpYnV0aW9uX2NvdW50XzZtOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIHRoZSBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDYgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgY29udHJpYnV0aW9uX2Ftb3VudF82bTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9jb3VudF8xMm06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgdGhlIGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgY29udHJpYnV0aW9uX2Ftb3VudF8xMm06IG51bWJlcjtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gYWNjb3VudCBmZWUgdHJhbnNhY3Rpb25zIGZvciB0aGUgNDAxayBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aDQwMWtGZWVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYWNjb3VudCBmZWUgdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlsc1xuICAgICAqL1xuICAgIGFjY291bnRfZmVlX2NvdW50XzEybTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBhY2NvdW50IGZlZSB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtGZWVEZXRhaWxzXG4gICAgICovXG4gICAgYWNjb3VudF9mZWVfYW1vdW50XzEybTogbnVtYmVyO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGFjY291bnQgZmVlIGFuZCBjb250cmlidXRpb24gaW5mb3JtYXRpb24gZm9yIDQwMWsgdHlwZSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIDQwMWsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWtcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrXG4gICAgICovXG4gICAgZmVlX2RldGFpbHM/OiBJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxa1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9kZXRhaWxzPzogSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHM7XG59XG4vKipcbiAqIE9iamVjdCB3aXRoIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIHNvdXJjZSBvZiBkYXRhIGZvciB0aGUgYWNjb3VudCBudW1iZXJzLCBvd25lcnMsIGFuZCBob2xkaW5ncyB0aGF0IGFyZSByZXR1cm5lZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc1xuICAgICAqL1xuICAgIG51bWJlcnM/OiBEYXRhU291cmNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGF0YVNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzXG4gICAgICovXG4gICAgb3duZXJzPzogRGF0YVNvdXJjZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogRGF0YVNvdXJjZXM7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNBVFM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYWNhdHM/OiBBcnJheTxOdW1iZXJzQUNBVFM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQVRPTj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhdG9uPzogQXJyYXk8TnVtYmVyc0FUT04+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzUmV0aXJlbWVudDQwMWs+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgcmV0aXJlbWVudF80MDFrPzogQXJyYXk8TnVtYmVyc1JldGlyZW1lbnQ0MDFrPjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmV0cmlldmVkXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8SW52ZXN0bWVudEFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVycyBmb3IgdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRzQXV0aE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PEludmVzdG1lbnRzQXV0aE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYXRhX3NvdXJjZXM6IEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGFjY291bnRzIG9mIDQwMWsgc3VidHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2RldGFpbHNfNDAxaz86IEFycmF5PEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxaz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIHRoZSBvd25lcnNoaXAgb2YgYW4gaW52ZXN0bWVudHMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGlkZW50aXR5IGluZm9ybWF0aW9uIHBlcnRhaW5zIHRvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSW4gdGhlIGNhc2Ugb2YgYSBqb2ludCBhY2NvdW50LCBQbGFpZCB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byByZXBvcnQgdGhlIG5hbWVzIG9mIGFsbCBhY2NvdW50IGhvbGRlcnMuICBJZiBhbiBJdGVtIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHdpdGggZGlmZmVyZW50IG93bmVyIG5hbWVzLCBzb21lIGluc3RpdHV0aW9ucyB3aWxsIHJlcG9ydCBhbGwgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGluIGVhY2ggYWNjb3VudFxcJ3MgYG5hbWVzYCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjYW5jZWxsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCBhZnRlciBhbiBhc3luY2hyb25vdXMgZXh0cmFjdGlvbiBvbiBhbiBpbnZlc3RtZW50cyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjYW5jZWxsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8SW52ZXN0bWVudEFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCB0cmFuc2FjdGlvbiBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCB0cmFuc2FjdGlvbiBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwIHdoZW4gZmV0Y2hpbmcgdHJhbnNhY3Rpb24gaGlzdG9yeVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnZlc3RtZW50cyBwcm9kdWN0IHZpYSB0aGUgYHByb2R1Y3RzYCwgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AsIG9yIGBvcHRpb25hbF9wcm9kdWN0c2AgYXJyYXkgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgLCBhbmQgYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUsIHRoZSBpbml0aWFsIEludmVzdG1lbnRzIGV4dHJhY3Rpb24gd2lsbCBoYXBwZW4gYXN5bmNocm9ub3VzbHkuIFBsYWlkIHdpbGwgc3Vic2VxdWVudGx5IGZpcmUgYSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2hlbiB0aGUgZXh0cmFjdGlvbiBjb21wbGV0ZXMuIFdoZW4gYGZhbHNlYCwgUGxhaWQgd2lsbCB3YWl0IHRvIHJldHVybiBhIHJlc3BvbnNlIHVudGlsIGV4dHJhY3Rpb24gY29tcGxldGlvbiBhbmQgbm8gYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rIHdpbGwgZmlyZS4gTm90ZSB0aGF0IHdoaWxlIHRoZSBleHRyYWN0aW9uIGlzIGhhcHBlbmluZyBhc3luY2hyb25vdXNseSwgY2FsbHMgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCB3aWxsIHJldHVybiBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9ycyB1bnRpbCB0aGUgZXh0cmFjdGlvbiBjb21wbGV0ZXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhc3luY191cGRhdGU/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8SW52ZXN0bWVudEFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIEFsbCBzZWN1cml0aWVzIGZvciB3aGljaCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgdHJhbnNhY3Rpb24gYmVpbmcgZmV0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbnMgYmVpbmcgZmV0Y2hlZFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBsaXN0IG9mIGludmVzdG1lbnRzIHRyYW5zYWN0aW9ucyBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9uXFwncyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBNdXN0IGJlIHBvc2l0aXZlIGlmIHRoZSB0eXBlIGlzIGEgYnV5IGFuZCBuZWdhdGl2ZSBpZiB0aGUgdHlwZSBpcyBhIHNlbGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21iaW5lZCB2YWx1ZSBvZiBhbGwgZmVlcyBhcHBsaWVkIHRvIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGZlZXM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGludmVzdG1lbnQgdHJhbnNhY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGBidXlgOiBCdXlpbmcgYW4gaW52ZXN0bWVudCBgc2VsbGA6IFNlbGxpbmcgYW4gaW52ZXN0bWVudCBgY2FzaGA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uIGBmZWVgOiBBIGZlZSBvbiB0aGUgYWNjb3VudCBgdHJhbnNmZXJgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk/OiBTZWN1cml0eU92ZXJyaWRlO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiBhbiBpc3N1ZSBlbmNvdW50ZXJlZCB3aXRoIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgaW50ZXJhY3Rpb25zIHdpdGggZmluYW5jaWFsIGluc3RpdHV0aW9ucyBkdXJpbmcgTGlua2luZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpc3N1ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGlzc3VlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhZmZlY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGlkcyBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhZmZlY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSByZWNvcmQgdHJhY2tpbmcgdGhpcyBpc3N1ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgc3VtbWFyeSBvZiB0aGUgZXJyb3IgZm9yIHRoZSBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIHN1bW1hcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGZvciB0aGUgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBkZXRhaWxlZF9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXNzdWVzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIHN0YXR1cz86IElzc3Vlc1N0YXR1cztcbn1cbi8qKlxuICogV2ViaG9vayBub3RpZmljYXRpb25zIGFyZSBzZW50IG9ubHkgd2hlbiBhIHN1YnNjcmliZWQgaXNzdWUgaXMgbWFya2VkIGFzIHJlc29sdmVkLiBUaGUgcGF5bG9hZCBjb250YWlucyBkZXRhaWxzIGFib3V0IHRoZSBpc3N1ZSBhdCB0aGUgdGltZSBvZiBpdHMgcmVzb2x1dGlvbiwgZm9jdXNpbmcgb24gdGhlIG1vc3QgZXNzZW50aWFsIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3VlUmVzb2x2ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVNTVUVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElTU1VFX1JFU09MVkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb25uZWN0aXZpdHkgaXNzdWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpc3N1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciBmb3IgdGhlIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaXNzdWVfZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBpc3N1ZSB3YXMgbWFya2VkIGFzIHJlc29sdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaXNzdWVfcmVzb2x2ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpbnZvbHZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpbnZvbHZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pc3N1ZXMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlzc3VlIHRvIHJldHJpZXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpc3N1ZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJc3N1ZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXNzdWVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1ZX1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc3N1ZT86IElzc3VlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc1NlYXJjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXNzdWVzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIFBsYWlkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVxdWVzdF9pZGAgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhhdCBtaWdodCBoYXZlIGhhZCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uIGlzc3VlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25fcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lzc3Vlcy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNTZWFyY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgaXNzdWVzIGFmZmVjdGluZyB0aGUgSXRlbSwgc2Vzc2lvbiwgb3IgcmVxdWVzdCBwYXNzZWQgaW4sIGNvbmZvcm1pbmcgdG8gdGhlIElzc3VlcyBkYXRhIG1vZGVsLiBBbiBlbXB0eSBsaXN0IGluZGljYXRlcyB0aGF0IG5vIG1hdGNoaW5nIGlzc3VlcyB3ZXJlIGZvdW5kLlxuICAgICAqIEB0eXBlIHtBcnJheTxJc3N1ZT59XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNzdWVzPzogQXJyYXk8SXNzdWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgaXNzdWUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJc3N1ZXNTdGF0dXMge1xuICAgIFJlcG9ydGVkID0gJ1JFUE9SVEVEJyxcbiAgICBBd2FpdGluZ1Jlc29sdXRpb24gPSAnQVdBSVRJTkdfUkVTT0xVVElPTicsXG4gICAgRml4SW5Qcm9ncmVzcyA9ICdGSVhfSU5fUFJPR1JFU1MnLFxuICAgIEZpeFBlbmRpbmdWYWxpZGF0aW9uID0gJ0ZJWF9QRU5ESU5HX1ZBTElEQVRJT04nLFxuICAgIENhbm5vdEZpeCA9ICdDQU5OT1RfRklYJyxcbiAgICBSZXNvbHZlZCA9ICdSRVNPTFZFRCdcbn1cblxuLyoqXG4gKiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lzc3Vlcy9zdWJzY3JpYmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaXNzdWUgdG8gc3Vic2NyaWJlIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc3N1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB3aGVyZSBub3RpZmljYXRpb25zIHNob3VsZCBiZSBzZW50IHdoZW4gdGhlIGlzc3VlIHN0YXR1cyBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pc3N1ZXMvc3Vic2NyaWJlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGJpbmFyeSBtYXRjaCBpbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBjb3VudHJ5IHRoYXQgaXNzdWVkIHRoZSBwcm92aWRlZCBkb2N1bWVudCBtYXRjaGVzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgc2VwYXJhdGVseSBwcm92aWRlZCB0byBQbGFpZC4gIE5vdGU6IFlvdSBjYW4gY29uZmlndXJlIHdoZXRoZXIgYSBgbm9fbWF0Y2hgIG9uIGBpc3N1aW5nX2NvdW50cnlgIGZhaWxzIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBieSBlZGl0aW5nIHlvdXIgUGxhaWQgVGVtcGxhdGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJc3N1aW5nQ291bnRyeSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lLURheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB3aXRob3V0IGFuIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24sIHN1Y2ggYXMgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUF1dGhNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdXRoX21ldGhvZD86IEl0ZW1BdXRoTWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBiaWxsZWRfcHJvZHVjdHNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdmFpbGFibGVfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4gYmlsbGVkIGZvciB0aGUgSXRlbS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXZhaWxhYmxlX3Byb2R1Y3RzYC4gTm90ZSAtIGBiaWxsZWRfcHJvZHVjdHNgIGlzIHBvcHVsYXRlZCBpbiBhbGwgZW52aXJvbm1lbnRzIGJ1dCBvbmx5IHJlcXVlc3RzIGluIFByb2R1Y3Rpb24gYXJlIGJpbGxlZC4gQWxzbyBub3RlIHRoYXQgcHJvZHVjdHMgdGhhdCBhcmUgYmlsbGVkIG9uIGEgcGF5LXBlci1jYWxsIGJhc2lzIHJhdGhlciB0aGFuIGEgcGF5LXBlci1JdGVtIGJhc2lzLCBzdWNoIGFzIGBiYWxhbmNlYCwgd2lsbCBub3QgYXBwZWFyIGhlcmUuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBiaWxsZWRfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYWRkZWQgdG8gdGhlIEl0ZW0uIEluIGFsbW9zdCBhbGwgY2FzZXMsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgYGJpbGxlZF9wcm9kdWN0c2AgZmllbGQuIEZvciBzb21lIHByb2R1Y3RzLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHByb2R1Y3QgdG8gYmUgYWRkZWQgdG8gYW4gSXRlbSBidXQgbm90IHlldCBiaWxsZWQgKGUuZy4gQXNzZXRzLCBiZWZvcmUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBoYXMgYmVlbiBjYWxsZWQsIG9yIEF1dGggb3IgSWRlbnRpdHkgd2hlbiBhZGRlZCBhcyBPcHRpb25hbCBQcm9kdWN0cyBidXQgYmVmb3JlIHRoZWlyIGVuZHBvaW50cyBoYXZlIGJlZW4gY2FsbGVkKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvZHVjdCBtYXkgYXBwZWFyIGluIGBwcm9kdWN0c2AgYnV0IG5vdCBpbiBgYmlsbGVkX3Byb2R1Y3RzYC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoaXMgd2lsbCBjb25zaXN0IG9mIGFsbCBwcm9kdWN0cyB3aGVyZSBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gdGhlIHJlcXVpcmVkIGRhdGEgc2NvcGVzIGZvciB0aGF0IHByb2R1Y3QgYW5kIHlvdSBoYXZlIFByb2R1Y3Rpb24gYWNjZXNzIGZvciB0aGF0IHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBjb25zZW50ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuIElmIHRoZSBJdGVtIGRvZXMgbm90IGhhdmUgY29uc2VudCBleHBpcmF0aW9uIHNjaGVkdWxlZCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gQ3VycmVudGx5LCBvbmx5IGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgYW5kIGEgc21hbGwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgaGF2ZSBleHBpcmluZyBjb25zZW50LiBGb3IgYSBsaXN0IG9mIFVTIGluc3RpdHV0aW9ucyB0aGF0IGN1cnJlbnRseSBleHBpcmUgY29uc2VudCwgc2VlIHRoZSBbT0F1dGggR3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9vYXV0aC8jcmVmcmVzaGluZy1pdGVtLWNvbnNlbnQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbiBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZCwgd2hpY2ggY2FuIGJlIHRoZSBjYXNlIGZvciBJdGVtcyB3aXRoIHNvbWUgZm9ybXMgb2YgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbi4gIGBiYWNrZ3JvdW5kYCAtIEl0ZW0gY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgIGB1c2VyX3ByZXNlbnRfcmVxdWlyZWRgIC0gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgdXBkYXRlX3R5cGU6IEl0ZW1VcGRhdGVUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJdGVtVXBkYXRlVHlwZUVudW0ge1xuICAgIEJhY2tncm91bmQgPSAnYmFja2dyb3VuZCcsXG4gICAgVXNlclByZXNlbnRSZXF1aXJlZCA9ICd1c2VyX3ByZXNlbnRfcmVxdWlyZWQnXG59XG5cbi8qKlxuICogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbmV3X2FjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEFjdGl2aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYWN0aXZpdGllczogQXJyYXk8QWN0aXZpdHk+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aW1lc3RhbXBzIGZvciB0aGUgbGFzdCB0aW1lIGVhY2ggZGF0YSB0eXBlIHdhcyBhY2Nlc3NlZCBwZXIgYXBwbGljYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PExhc3REYXRhQWNjZXNzVGltZXM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X2RhdGFfYWNjZXNzX3RpbWVzOiBBcnJheTxMYXN0RGF0YUFjY2Vzc1RpbWVzPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSB1c2VyIHN1Y2Nlc3NmdWxseSBhZGRzIGEgUGxhaWQgSXRlbSBkdXJpbmcgYSBMaW5rIHNlc3Npb24gd2hlbiB1c2luZyBIb3N0ZWQgTGluayBvciBNdWx0aS1JdGVtIExpbmsgc2Vzc2lvbnMuIENvbnRhaW5zIHRoZSBwdWJsaWMgdG9rZW4gZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BZGRSZXN1bHRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJVEVNX0FERF9SRVNVTFRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgbGlua190b2tlbmAgdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHB1YmxpY190b2tlbmAgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbSB0aGF0IHdhcyBhZGRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BZGRSZXN1bHRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgZm9yIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29ubmVjdGVkIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbnM6IEFycmF5PENvbm5lY3RlZEFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogVXNlciBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLCBmb3IgY2xpZW50cyBtYWtpbmcgYSByZXF1ZXN0IHdpdGhvdXQgYW4gYGFjY2Vzc190b2tlbmAuIFRoaXMgaXMgb25seSBhbGxvd2VkIGZvciBzZWxlY3QgY2xpZW50cyBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIE1vc3QgY2xpZW50cyBzaG91bGQgY2FsbCBgL2l0ZW0vaW1wb3J0YCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZSBoYXNoZWQgYnkgRkkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgZmlfdXNlcm5hbWVfaGFzaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY29wZXM6IFNjb3BlcztcbiAgICAvKipcbiAgICAgKiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCBkdXJpbmcgZW5yb2xsbWVudCwgdGhpcyBmaWVsZCBtdXN0IGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBzdGF0ZSBzZW50IHRvIHRoZSBwYXJ0bmVyIGluIHRoZSBPQXV0aCBMb2dpbiBVUkkuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgd2hlbiB0aGUgY29udGV4dCBpcyBgRU5ST0xMTUVOVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNDb250ZXh0fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29udGV4dDogU2NvcGVzQ29udGV4dDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rL2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGAsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBtZXRob2QgdXNlZCB0byBwb3B1bGF0ZSBBdXRoIGRhdGEgZm9yIHRoZSBJdGVtLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBJdGVtcyB0aGF0IGhhdmUgaGFkIEF1dGggbnVtYmVycyBkYXRhIHNldCBvbiBhdCBsZWFzdCBvbmUgb2YgaXRzIGFjY291bnRzLCBhbmQgd2lsbCBiZSBgbnVsbGAgb3RoZXJ3aXNlLiBGb3IgaW5mbyBhYm91dCB0aGUgdmFyaW91cyBmbG93cywgc2VlIG91ciBbQXV0aCBjb3ZlcmFnZSBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS4gIGBJTlNUQU5UX0FVVEhgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCBkaXJlY3RseSBieSB0aGUgdXNlclxcJ3MgaW5zdGl0dXRpb24gY29ubmVjdGlvbi4gIGBJTlNUQU5UX01BVENIYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBJbnN0YW50IE1hdGNoIGZhbGxiYWNrIGZsb3cuICBgQVVUT01BVEVEX01JQ1JPREVQT1NJVFNgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBmbG93LiAgYFNBTUVfREFZX01JQ1JPREVQT1NJVFNgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3cuICBgSU5TVEFOVF9NSUNST0RFUE9TSVRTYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBJbnN0YW50IE1pY3JvLWRlcG9zaXRzIGZsb3cuICBgREFUQUJBU0VfTUFUQ0hgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIERhdGFiYXNlIE1hdGNoIGZsb3cuICBgREFUQUJBU0VfSU5TSUdIVFNgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIERhdGFiYXNlIEluc2lnaHRzIGZsb3cuICBgVFJBTlNGRVJfTUlHUkFURURgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgW2AvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNmZXIvYWNjb3VudC1saW5raW5nLyNtaWdyYXRlLWFjY291bnQtaW50by10cmFuc2ZlcnMpLiAgYElOVkVTVE1FTlRTX0ZBTExCQUNLYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSBmb3IgSW52ZXN0bWVudHMgTW92ZSB3YXMgcHJvdmlkZWQgdmlhIGEgW2ZhbGxiYWNrIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaW52ZXN0bWVudHMtbW92ZS8jZmFsbGJhY2stZmxvd3MpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXRlbUF1dGhNZXRob2Qge1xuICAgIEluc3RhbnRBdXRoID0gJ0lOU1RBTlRfQVVUSCcsXG4gICAgSW5zdGFudE1hdGNoID0gJ0lOU1RBTlRfTUFUQ0gnLFxuICAgIEF1dG9tYXRlZE1pY3JvZGVwb3NpdHMgPSAnQVVUT01BVEVEX01JQ1JPREVQT1NJVFMnLFxuICAgIFNhbWVEYXlNaWNyb2RlcG9zaXRzID0gJ1NBTUVfREFZX01JQ1JPREVQT1NJVFMnLFxuICAgIEluc3RhbnRNaWNyb2RlcG9zaXRzID0gJ0lOU1RBTlRfTUlDUk9ERVBPU0lUUycsXG4gICAgRGF0YWJhc2VNYXRjaCA9ICdEQVRBQkFTRV9NQVRDSCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0cyA9ICdEQVRBQkFTRV9JTlNJR0hUUycsXG4gICAgVHJhbnNmZXJNaWdyYXRlZCA9ICdUUkFOU0ZFUl9NSUdSQVRFRCcsXG4gICAgSW52ZXN0bWVudHNGYWxsYmFjayA9ICdJTlZFU1RNRU5UU19GQUxMQkFDSycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEEgZGF0YSBzY29wZSBmb3IgdGhlIHByb2R1Y3RzIHRoYXQgYSB1c2VyIGNhbiBjb25zZW50IHRvIGluIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXRlbUNvbnNlbnRlZERhdGFTY29wZSB7XG4gICAgQWNjb3VudEJhbGFuY2VJbmZvID0gJ2FjY291bnRfYmFsYW5jZV9pbmZvJyxcbiAgICBDb250YWN0SW5mbyA9ICdjb250YWN0X2luZm8nLFxuICAgIEFjY291bnRSb3V0aW5nTnVtYmVyID0gJ2FjY291bnRfcm91dGluZ19udW1iZXInLFxuICAgIFRyYW5zYWN0aW9ucyA9ICd0cmFuc2FjdGlvbnMnLFxuICAgIENyZWRpdExvYW5JbmZvID0gJ2NyZWRpdF9sb2FuX2luZm8nLFxuICAgIEludmVzdG1lbnRzID0gJ2ludmVzdG1lbnRzJyxcbiAgICBQYXlyb2xsSW5mbyA9ICdwYXlyb2xsX2luZm8nLFxuICAgIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzSW5mbyA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uX3BheXN0dWJzX2luZm8nLFxuICAgIEluY29tZVZlcmlmaWNhdGlvblcyc0luZm8gPSAnaW5jb21lX3ZlcmlmaWNhdGlvbl93MnNfaW5mbycsXG4gICAgSW5jb21lVmVyaWZpY2F0aW9uQmFua1N0YXRlbWVudHMgPSAnaW5jb21lX3ZlcmlmaWNhdGlvbl9iYW5rX3N0YXRlbWVudHMnLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbkVtcGxveW1lbnRJbmZvID0gJ2luY29tZV92ZXJpZmljYXRpb25fZW1wbG95bWVudF9pbmZvJyxcbiAgICBCYW5rU3RhdGVtZW50cyA9ICdiYW5rX3N0YXRlbWVudHMnLFxuICAgIFJpc2tJbmZvID0gJ3Jpc2tfaW5mbycsXG4gICAgTmV0d29ya0luc2lnaHRzTGl0ZSA9ICduZXR3b3JrX2luc2lnaHRzX2xpdGUnLFxuICAgIEZyYXVkSW5mbyA9ICdmcmF1ZF9pbmZvJ1xufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBlbnRpdHkgYXV0aGVudGljYXRpbmcgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJdGVtQ3JlYXRlQXV0aGVudGljYXRpb24ge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgRGF0YVBhcnRuZXIgPSAnREFUQV9QQVJUTkVSJyxcbiAgICBQbGFpZCA9ICdQTEFJRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdpdGggYW4gSXRlbS4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUVycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2dldGAgYW5kIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVdpdGhDb25zZW50RmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtV2l0aENvbnNlbnRGaWVsZHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzPzogSXRlbVN0YXR1c051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2ltcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHByb2R1Y3Qgc3RyaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2F1dGg6IEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gY29uZmlndXJlIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggYW4gSXRlbS4gUGxhaWQgZmlyZXMgYSB3ZWJob29rIGlmIGNyZWRlbnRpYWxzIGZhaWwuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBvZiB1c2VyIElEIGFuZCBhdXRoIHRva2VuIHBhaXIsIHBlcm1pdHRpbmcgUGxhaWQgdG8gYWdncmVnYXRlIGEgdXNlclxcJ3MgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIE9wYXF1ZSB1c2VyIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEF1dGhvcml6YXRpb24gdG9rZW4gUGxhaWQgd2lsbCB1c2UgdG8gYWdncmVnYXRlIHRoaXMgdXNlclxcJ3MgYWNjb3VudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgYXV0aF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vaW1wb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaGFzIGV4aXRlZCB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIHdpdGhvdXQgdGhlIHVzZXIgaGF2aW5nIGdvbmUgdGhyb3VnaCB0aGUgdXBkYXRlIG1vZGUgZmxvdyBpbiB5b3VyIGFwcCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIGNvbXBsZXRlZCB0aGUgdXBkYXRlIG1vZGUgaW4gYSBkaWZmZXJlbnQgYXBwKS4gSWYgeW91IGhhdmUgbWVzc2FnaW5nIHRoYXQgdGVsbHMgdGhlIHVzZXIgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSBtb2RlIGZsb3csIHlvdSBzaG91bGQgc2lsZW5jZSB0aGlzIG1lc3NhZ2luZyB1cG9uIHJlY2VpdmluZyB0aGUgYExPR0lOX1JFUEFJUkVEYCB3ZWJob29rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMT0dJTl9SRVBBSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCBvbmNlIFBsYWlkIGNhbGN1bGF0ZXMgaW5jb21lIGZyb20gYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVhc29uIGZvciB0ZXJtaW5hdGluZyBwcm9kdWN0cyBvbiB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVhc29uQ29kZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlYXNvbkNvZGUge1xufVxuLyoqXG4gKiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlYXNvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWFzb25fY29kZTogSXRlbVByb2R1Y3RzVGVybWluYXRlUmVhc29uQ29kZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGNvbnRleHQgb3IgZGV0YWlscyBhYm91dCB0aGUgcmVhc29uIGZvciB0ZXJtaW5hdGluZyBwcm9kdWN0cyBvbiB0aGUgSXRlbS4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGByZWFzb25fbm90ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlYXNvbl9ub3RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYHB1YmxpY190b2tlbmAgZm9yIHRoZSBwYXJ0aWN1bGFyIEl0ZW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIGBwdWJsaWNfdG9rZW5gLCBvYnRhaW5lZCBmcm9tIHRoZSBMaW5rIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgdmFsdWUgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBgYWNjZXNzX3Rva2VuYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZWFzb24gZm9yIHJlbW92aW5nIHRoZSBJdGVtICBgRlJBVURfRklSU1RfUEFSVFlgOiBUaGUgZW5kIHVzZXIgd2hvIG93bnMgdGhlIGNvbm5lY3RlZCBiYW5rIGFjY291bnQgY29tbWl0dGVkIGZyYXVkIGBGUkFVRF9GQUxTRV9JREVOVElUWWA6IFRoZSBlbmQgdXNlciBjcmVhdGVkIHRoZSBjb25uZWN0aW9uIHVzaW5nIGZhbHNlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9yIHN0b2xlbiBjcmVkZW50aWFscyBgRlJBVURfQUJVU0VgOiBUaGUgZW5kIHVzZXIgaXMgYWJ1c2luZyB0aGUgY2xpZW50XFwncyBzZXJ2aWNlIG9yIHBsYXRmb3JtIHRocm91Z2ggdGhlaXIgY29ubmVjdGVkIGFjY291bnQgYEZSQVVEX09USEVSYDogT3RoZXIgZnJhdWQtcmVsYXRlZCByZWFzb25zIGludm9sdmluZyB0aGUgZW5kIHVzZXIgbm90IGNvdmVyZWQgYnkgdGhlIHNwZWNpZmljIGZyYXVkIGNhdGVnb3JpZXMgYENPTk5FQ1RJT05fSVNfTk9OX0ZVTkNUSU9OQUxgOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgZW5kIHVzZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpcyBicm9rZW4gYW5kIGNhbm5vdCBiZSByZXN0b3JlZCBgT1RIRVJgOiBBbnkgb3RoZXIgcmVhc29uIGZvciByZW1vdmluZyB0aGUgY29ubmVjdGlvbiBub3QgY292ZXJlZCBieSB0aGUgYWJvdmUgY2F0ZWdvcmllcyBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEl0ZW1SZW1vdmVSZWFzb25Db2RlIHtcbiAgICBGcmF1ZEZpcnN0UGFydHkgPSAnRlJBVURfRklSU1RfUEFSVFknLFxuICAgIEZyYXVkRmFsc2VJZGVudGl0eSA9ICdGUkFVRF9GQUxTRV9JREVOVElUWScsXG4gICAgRnJhdWRBYnVzZSA9ICdGUkFVRF9BQlVTRScsXG4gICAgRnJhdWRPdGhlciA9ICdGUkFVRF9PVEhFUicsXG4gICAgQ29ubmVjdGlvbklzTm9uRnVuY3Rpb25hbCA9ICdDT05ORUNUSU9OX0lTX05PTl9GVU5DVElPTkFMJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1SZW1vdmVSZWFzb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlPzogSXRlbVJlbW92ZVJlYXNvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgY29udGV4dCBvciBkZXRhaWxzIGFib3V0IHRoZSByZWFzb24gZm9yIHJlbW92aW5nIHRoZSBJdGVtLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYHJlYXNvbl9ub3RlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlYXNvbl9ub3RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogSXRlbVN0YXR1c0ludmVzdG1lbnRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTGFzdFdlYmhvb2t9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBsYXN0X3dlYmhvb2s/OiBJdGVtU3RhdHVzTGFzdFdlYmhvb2sgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c0ludmVzdG1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0ludmVzdG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBzdWNjZXNzZnVsbHkgY29ubmVjdHMgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0ludmVzdG1lbnRzXG4gICAgICovXG4gICAgbGFzdF9zdWNjZXNzZnVsX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGZhaWxlZCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0ludmVzdG1lbnRzXG4gICAgICovXG4gICAgbGFzdF9mYWlsZWRfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgd2ViaG9vayBmaXJlZCBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHdoZW4gdGhlIHdlYmhvb2sgd2FzIGZpcmVkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAgICAgKi9cbiAgICBzZW50X2F0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB3ZWJob29rIGNvZGUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAgICAgKi9cbiAgICBjb2RlX3NlbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTGFzdFdlYmhvb2t9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBzdWNjZXNzZnVsbHkgY29ubmVjdHMgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuIFRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVjdCB0cmFuc2FjdGlvbnMgdXBkYXRlcyBwZXJmb3JtZWQgYnkgbm9uLVRyYW5zYWN0aW9ucyBwcm9kdWN0cyAoZS5nLiBTaWduYWwpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuIFRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVjdCB0cmFuc2FjdGlvbnMgdXBkYXRlcyBwZXJmb3JtZWQgYnkgbm9uLVRyYW5zYWN0aW9ucyBwcm9kdWN0cyAoZS5nLiBTaWduYWwpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBJdGVtLiBUbyByZW1vdmUgYSB3ZWJob29rIGZyb20gYW4gSXRlbSwgc2V0IHRvIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgd2l0aG91dCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLCBzdWNoIGFzIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgd2l0aG91dCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLCBzdWNoIGFzIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtQXV0aE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgYXV0aF9tZXRob2Q/OiBJdGVtQXV0aE1ldGhvZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBiaWxsZWRfcHJvZHVjdHNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgYmVlbiBiaWxsZWQgZm9yIHRoZSBJdGVtLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhdmFpbGFibGVfcHJvZHVjdHNgLiBOb3RlIC0gYGJpbGxlZF9wcm9kdWN0c2AgaXMgcG9wdWxhdGVkIGluIGFsbCBlbnZpcm9ubWVudHMgYnV0IG9ubHkgcmVxdWVzdHMgaW4gUHJvZHVjdGlvbiBhcmUgYmlsbGVkLiBBbHNvIG5vdGUgdGhhdCBwcm9kdWN0cyB0aGF0IGFyZSBiaWxsZWQgb24gYSBwYXktcGVyLWNhbGwgYmFzaXMgcmF0aGVyIHRoYW4gYSBwYXktcGVyLUl0ZW0gYmFzaXMsIHN1Y2ggYXMgYGJhbGFuY2VgLCB3aWxsIG5vdCBhcHBlYXIgaGVyZS4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgYmlsbGVkX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGFkZGVkIHRvIHRoZSBJdGVtLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGBiaWxsZWRfcHJvZHVjdHNgIGZpZWxkLiBGb3Igc29tZSBwcm9kdWN0cywgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBwcm9kdWN0IHRvIGJlIGFkZGVkIHRvIGFuIEl0ZW0gYnV0IG5vdCB5ZXQgYmlsbGVkIChlLmcuIEFzc2V0cywgYmVmb3JlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgaGFzIGJlZW4gY2FsbGVkLCBvciBBdXRoIG9yIElkZW50aXR5IHdoZW4gYWRkZWQgYXMgT3B0aW9uYWwgUHJvZHVjdHMgYnV0IGJlZm9yZSB0aGVpciBlbmRwb2ludHMgaGF2ZSBiZWVuIGNhbGxlZCksIGluIHdoaWNoIGNhc2UgdGhlIHByb2R1Y3QgbWF5IGFwcGVhciBpbiBgcHJvZHVjdHNgIGJ1dCBub3QgaW4gYGJpbGxlZF9wcm9kdWN0c2AuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoaXMgd2lsbCBjb25zaXN0IG9mIGFsbCBwcm9kdWN0cyB3aGVyZSBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gdGhlIHJlcXVpcmVkIGRhdGEgc2NvcGVzIGZvciB0aGF0IHByb2R1Y3QgYW5kIHlvdSBoYXZlIFByb2R1Y3Rpb24gYWNjZXNzIGZvciB0aGF0IHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGNvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgSXRlbVxcJ3MgYWNjZXNzIGNvbnNlbnQgd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gSWYgdGhlIEl0ZW0gZG9lcyBub3QgaGF2ZSBjb25zZW50IGV4cGlyYXRpb24gc2NoZWR1bGVkLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLiBDdXJyZW50bHksIG9ubHkgaW5zdGl0dXRpb25zIGluIEV1cm9wZSBhbmQgYSBzbWFsbCBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBoYXZlIGV4cGlyaW5nIGNvbnNlbnQuIEZvciBhIGxpc3Qgb2YgVVMgaW5zdGl0dXRpb25zIHRoYXQgY3VycmVudGx5IGV4cGlyZSBjb25zZW50LCBzZWUgdGhlIFtPQXV0aCBHdWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL29hdXRoLyNyZWZyZXNoaW5nLWl0ZW0tY29uc2VudCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgSXRlbXMgd2l0aCBzb21lIGZvcm1zIG9mIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24uICBgYmFja2dyb3VuZGAgLSBJdGVtIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBiYWNrZ3JvdW5kICBgdXNlcl9wcmVzZW50X3JlcXVpcmVkYCAtIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgdXBkYXRlX3R5cGU6IEl0ZW1XaXRoQ29uc2VudEZpZWxkc1VwZGF0ZVR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEl0ZW0gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB1c2UgY2FzZXMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpLiAgWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiB1c2UgY2FzZXMgb3IgdXBkYXRlIHRoZSBsaXN0IG9mIHVzZSBjYXNlcyB0byByZXF1ZXN0IGF0IGFueSB0aW1lIHZpYSB0aGUgTGluayBDdXN0b21pemF0aW9uIHNlY3Rpb24gb2YgdGhlIFtQbGFpZCBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LXY1KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX3VzZV9jYXNlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGRhdGEgc2NvcGVzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBgY29uc2VudGVkX3Byb2R1Y3RzYDsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jZGF0YS1zY29wZXMtYnktcHJvZHVjdCkgb2YgZGF0YSBzY29wZXMgYW5kIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxJdGVtQ29uc2VudGVkRGF0YVNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSXRlbVdpdGhDb25zZW50RmllbGRzVXBkYXRlVHlwZUVudW0ge1xuICAgIEJhY2tncm91bmQgPSAnYmFja2dyb3VuZCcsXG4gICAgVXNlclByZXNlbnRSZXF1aXJlZCA9ICd1c2VyX3ByZXNlbnRfcmVxdWlyZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEl0ZW0gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZlxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHVzZSBjYXNlcyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuICBZb3UgY2FuIHNlZSB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyBvciB1cGRhdGUgdGhlIGxpc3Qgb2YgdXNlIGNhc2VzIHRvIHJlcXVlc3QgYXQgYW55IHRpbWUgdmlhIHRoZSBMaW5rIEN1c3RvbWl6YXRpb24gc2VjdGlvbiBvZiB0aGUgW1BsYWlkIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktdjUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZlxuICAgICAqL1xuICAgIGNvbnNlbnRlZF91c2VfY2FzZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBkYXRhIHNjb3BlcyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgYGNvbnNlbnRlZF9wcm9kdWN0c2A7IHNlZSB0aGUgW2Z1bGwgbWFwcGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT47XG59XG4vKipcbiAqIEEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbSldUIGxpYnJhcmllc10oaHR0cHM6Ly9qd3QuaW8vI2xpYnJhcmllcy1pbykgdG8gdmVyaWZ5IFBsYWlkIHdlYmhvb2tzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXS1B1YmxpY0tleVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpXS1B1YmxpY0tleSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFsZyBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcnYgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgY3VydmUgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3J2OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtpZCAoS2V5IElEKSBtZW1iZXIgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYSBzcGVjaWZpYyBrZXkuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gY2hvb3NlIGFtb25nIGEgc2V0IG9mIGtleXMgd2l0aGluIHRoZSBKV0sgZHVyaW5nIGtleSByb2xsb3Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBraWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga3R5IChrZXkgdHlwZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleSwgc3VjaCBhcyBSU0Egb3IgRUMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga3R5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZSAocHVibGljIGtleSB1c2UpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgdXNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHggbWVtYmVyIGNvbnRhaW5zIHRoZSB4IGNvb3JkaW5hdGUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCwgcHJvdmlkZWQgYXMgYSBiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGNvb3JkaW5hdGVcXCdzIGJpZyBlbmRpYW4gcmVwcmVzZW50YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB5IG1lbWJlciBjb250YWlucyB0aGUgeSBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSBleHBpcmVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBKV1QgSGVhZGVyLCB1c2VkIGZvciB3ZWJob29rIHZhbGlkYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldUSGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSldUSGVhZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV1RIZWFkZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGtpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBhZGRyZXNzYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICB0eXBlOiBBZGRyZXNzUHVycG9zZUxhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgc3RyZWV0PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIGNpdHk/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgcmVnaW9uPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2RldGFpbHM/OiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYGRhdGVfb2ZfYmlydGhgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgZGF5PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICBtb250aD86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgeWVhcj86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBga3ljX2NoZWNrYCAoRGF0YSBTb3VyY2UgVmVyaWZpY2F0aW9uKSBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMua3ljX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYGt5Y19jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5reWNfY2hlY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0FkZHJlc3NTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja05hbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBLWUNDaGVja05hbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja1Bob25lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBLWUNDaGVja1Bob25lU3VtbWFyeTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgYWRkcmVzc2AgZmllbGQgbWF0Y2hlZCBmb3IgZmllbGRzIHRoYXQgYXJlIG9ubHkgcHJlc2VudCBvbiBhbiBpbnRlcm5hdGlvbmFsIEtZQyBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgYnVpbGRpbmc6IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgY291bnR5OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGRpc3RyaWN0OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGhvdXNlX251bWJlcjogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdWJwcmVtaXNlOiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIHRob3JvdWdoZmFyZTogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgaWRfbnVtYmVyYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0lETnVtYmVyU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBuYW1lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja05hbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja05hbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYHBob25lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tQaG9uZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIGFyZWFfY29kZTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhdHlwZSB3YXMgYWNjZXNzZWQgYnkgYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXN0RGF0YUFjY2Vzc1RpbWVzIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXBwbGljYXRpb24gYWNjZXNzaW5nIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgYWNjb3VudF9iYWxhbmNlX2luZm9gIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFjY291bnRfYmFsYW5jZV9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgYGFjY291bnRfcm91dGluZ19udW1iZXJgIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFjY291bnRfcm91dGluZ19udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgY29udGFjdF9kZXRhaWxzYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjb250YWN0X2RldGFpbHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgdHJhbnNhY3Rpb25zYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgY3JlZGl0X2FuZF9sb2Fuc2Agd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgY3JlZGl0X2FuZF9sb2Fuczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGBpbnZlc3RtZW50c2Agd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgcGF5cm9sbF9pbmZvYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luZm86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgdHJhbnNhY3Rpb25fcmlza19pbmZvYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9yaXNrX2luZm86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBsYXRlc3Qgc2NvcmVkIGV2ZW50IGZvciBhIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhdGVzdFNjb3JlZEV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZXN0U2NvcmVkRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXRlc3RTY29yZWRFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgZXZlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGF0ZXN0U2NvcmVkRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXRlc3RTY29yZWRFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RydXN0SW5kZXh9XG4gICAgICogQG1lbWJlcm9mIExhdGVzdFNjb3JlZEV2ZW50XG4gICAgICovXG4gICAgdHJ1c3RfaW5kZXg6IFRydXN0SW5kZXggfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGZyYXVkIGF0dHJpYnV0ZXMgYXMgYW4gYXJiaXRyYXJ5IHNldCBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZSBzZXQgb2YgYXR0cmlidXRlcyByZXR1cm5lZCB2YXJpZXMgYnkgbW9kZWwuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMYXRlc3RTY29yZWRFdmVudFxuICAgICAqL1xuICAgIGZyYXVkX2F0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgUGxhaWRcXCdzIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCBmb3IgYSB1c2VyIGFuZCB0aGF0IFBsYWlkIGhhcyB2ZXJpZmllZCB0aGF0IHRoZSB1c2VyIG93bnMgdGhlaXIgcGhvbmUgbnVtYmVyLiBJZiB5b3UgcmVjZWl2ZSB0aGlzIHdlYmhvb2ssIHlvdSBzaG91bGQgc2tpcCB5b3VyIG93biBPVFAgcGhvbmUgbnVtYmVyIHZlcmlmaWNhdGlvbiBmbG93IGZvciB0aGUgdXNlciwgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdCBjb21wbGV0ZSB0aGUgZW50aXJlIExpbmsgZmxvdy4gSWYgdGhlIHVzZXIgZG9lc25cXCd0IGNvbXBsZXRlIHRoZSBmdWxsIExpbmsgZmxvdyAoYXMgdmVyaWZpZWQgYnkgeW91ciBiZWluZyBhYmxlIHRvIHN1Y2Nlc3NmdWxseSBjYWxsIGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YCB1c2luZyB0aGUgYHB1YmxpY190b2tlbmAgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2spIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGltcGxlbWVudCBbd2ViaG9vayB2ZXJpZmljYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzL3dlYmhvb2stdmVyaWZpY2F0aW9uLykgb3IgYW5vdGhlciB0ZWNobmlxdWUgdG8gYXZvaWQgd2ViaG9vayBzcG9vZmluZyBhdHRhY2tzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMYXllckF1dGhlbnRpY2F0aW9uUGFzc2VkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExheWVyQXV0aGVudGljYXRpb25QYXNzZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTEFZRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGF5ZXJBdXRoZW50aWNhdGlvblBhc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTEFZRVJfQVVUSEVOVElDQVRJT05fUEFTU0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExheWVyQXV0aGVudGljYXRpb25QYXNzZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGF5ZXJBdXRoZW50aWNhdGlvblBhc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhlc2UgZXZlbnRzIG9jY3VycmVkIGluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGF5ZXJBdXRoZW50aWNhdGlvblBhc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGluayB0b2tlbiB1c2VkIHRvIGNyZWF0ZSB0aGUgTGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBhcmUgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExheWVyQXV0aGVudGljYXRpb25QYXNzZWRXZWJob29rXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTb3VyY2Ugb2YgdGhlIGxlZGdlciBldmVudC4gIGBcXFwiVFJBTlNGRVJcXFwiYCAtIFRoZSBzb3VyY2Ugb2YgdGhlIGxlZGdlciBldmVudCBpcyBhIHRyYW5zZmVyIGBcXFwiU1dFRVBcXFwiYCAtIFRoZSBzb3VyY2Ugb2YgdGhlIGxlZGdlciBldmVudCBpcyBhIHN3ZWVwIGBcXFwiUkVGVU5EXFxcImAgLSBUaGUgc291cmNlIG9mIHRoZSBsZWRnZXIgZXZlbnQgaXMgYSByZWZ1bmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExlZGdlckV2ZW50U291cmNlVHlwZSB7XG4gICAgVHJhbnNmZXIgPSAnVFJBTlNGRVInLFxuICAgIFN3ZWVwID0gJ1NXRUVQJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJ1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHRzIG9mIHRoZSBMZW5kU2NvcmVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGVuZFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVuZFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgcmV0dXJuZWQgYnkgdGhlIExlbmRTY29yZSBtb2RlbC4gV2lsbCBiZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAxIHRvIDk5LiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIGxvd2VyIGNyZWRpdCByaXNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExlbmRTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29ucyBmb3IgYW4gaW5kaXZpZHVhbCBoYXZpbmcgcmlzayBhY2NvcmRpbmcgdG8gdGhlIExlbmRTY29yZS4gRm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHJlYXNvbiBjb2RlcyBhbmQgYSBtYXBwaW5nIG9mIHJlYXNvbiBjb2RlcyB0byBodW1hbi1yZWFkYWJsZSByZWFzb25zLCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiBEaWZmZXJlbnQgTGVuZFNjb3JlIHZlcnNpb25zIHdpbGwgdXNlIGRpZmZlcmVudCBzZXRzIG9mIHJlYXNvbiBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGVuZFNjb3JlXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIExlbmRTY29yZSBjb3VsZCBub3QgYmUgY29tcHV0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGVuZFNjb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgTElBQklMSVRJRVNgIGFuZCBjb2RlIGBERUZBVUxUX1VQREFURWAgd2lsbCBiZSBmaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGxpYWJpbGl0aWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhIGxpYWJpbGl0aWVzIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElBQklMSVRJRVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBcXCdzIGZvciBhY2NvdW50cyB0aGF0IGNvbnRhaW4gbmV3IGxpYWJpbGl0aWVzLlxcJ1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF9uZXdfbGlhYmlsaXRpZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGgga2V5cyBvZiBgYWNjb3VudF9pZGBcXCdzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIGxpYWJpbGl0aWVzIGZpZWxkcyB0aGF0IGNoYW5nZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwicGFzdF9hbW91bnRfZHVlXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9saWFiaWxpdGllczogeyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2xpYWJpbGl0aWVzL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIGBvcHRpb25zYCBjYW5ub3QgYmUgbnVsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbGlhYmlsaXR5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVkaXQgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIGNyZWRpdDogQXJyYXk8Q3JlZGl0Q2FyZExpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3J0Z2FnZSBhY2NvdW50cyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIG1vcnRnYWdlOiBBcnJheTxNb3J0Z2FnZUxpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHVkZW50IGxvYW4gYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFN0dWRlbnRMb2FuPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBzdHVkZW50OiBBcnJheTxTdHVkZW50TG9hbj4gfCBudWxsO1xufVxuLyoqXG4gKiBVc2VkIHRvIGNvbmZpZ3VyZSBTYW5kYm94IHRlc3QgZGF0YSBmb3IgdGhlIExpYWJpbGl0aWVzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGxpYWJpbGl0eSBvYmplY3QsIGVpdGhlciBgY3JlZGl0YCBvciBgc3R1ZGVudGAuIE1vcnRnYWdlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhlIGN1c3RvbSBTYW5kYm94LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdXJjaGFzZSBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gRm9yIHNpbXBsaWNpdHksIHRoaXMgaXMgdGhlIG9ubHkgaW50ZXJlc3QgcmF0ZSB1c2VkIHRvIGNhbGN1bGF0ZSBpbnRlcmVzdCBjaGFyZ2VzLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHVyY2hhc2VfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNhc2ggQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjYXNoX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYWxhbmNlIHRyYW5zZmVyIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgYmFsYW5jZV90cmFuc2Zlcl9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lhbCBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNwZWNpYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsYXN0X3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYG1pbmltdW1fcGF5bWVudF9hbW91bnRgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgIG9yIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGlzX292ZXJkdWVgIGZpZWxkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBsb2FuIHByaW5jaXBhbC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwcmluY2lwYWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbm9taW5hbF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGludGVyZXN0IGNhcGl0YWxpemF0aW9uIGJlZ2lucyBhdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1vbnRocyBhZnRlciBsb2FuIG9yaWdpbmF0aW9uLiBCeSBkZWZhdWx0IGludGVyZXN0IGlzIG5ldmVyIGNhcGl0YWxpemVkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGludGVyZXN0X2NhcGl0YWxpemF0aW9uX2dyYWNlX3BlcmlvZF9tb250aHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfbW9kZWw6IFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWw7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBleHBlY3RlZF9wYXlvZmZfZGF0ZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZXhwZWN0ZWRfcGF5b2ZmX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGd1YXJhbnRvcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZ3VhcmFudG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19mZWRlcmFsYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfZmVkZXJhbDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGxvYW5fbmFtZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fc3RhdHVzOiBTdHVkZW50TG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwc2xmX3N0YXR1czogUFNMRlN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLmRlc2NyaXB0aW9uYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbl9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcmVwYXltZW50X3BsYW4udHlwZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBgXFxcImV4dGVuZGVkIGdyYWR1YXRlZFxcXCJgLCBgXFxcImV4dGVuZGVkIHN0YW5kYXJkXFxcImAsIGBcXFwiZ3JhZHVhdGVkXFxcImAsIGBcXFwiaW5jb21lLWNvbnRpbmdlbnQgcmVwYXltZW50XFxcImAsIGBcXFwiaW5jb21lLWJhc2VkIHJlcGF5bWVudFxcXCJgLCBgXFxcImluY29tZS1zZW5zaXRpdmUgcmVwYXltZW50XFxcImAsIGBcXFwiaW50ZXJlc3Qgb25seVxcXCJgLCBgXFxcIm90aGVyXFxcImAsIGBcXFwicGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwicmV2aXNlZCBwYXkgYXMgeW91IGVhcm5cXFwiYCwgYFxcXCJzdGFuZGFyZFxcXCJgLCBvciBgXFxcInNhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvblxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgc2VxdWVuY2VfbnVtYmVyYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXJ2aWNlcl9hZGRyZXNzOiBBZGRyZXNzO1xufVxuLyoqXG4gKiBBIHNwZWNpZmljIHVzZSBjYXNlIGZvciBhIGxpbWl0ZWQgcHVycG9zZSBjaGVja2luZyBhY2NvdW50LiBMaW1pdGVkIHB1cnBvc2UgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCByZWplY3Qgb3IgcmV0dXJuIEFDSCB0cmFuc2FjdGlvbnMgdGhhdCBhcmVuXFwndCBmb3IgZWxpZ2libGUgdXNlIGNhc2VzLiBGb3IgZXhhbXBsZSwgYSBgUkVOVF9NT1JUR0FHRWAgbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nIGFjY291bnQgd2lsbCByZWplY3QgQUNIIHRyYW5zYWN0aW9ucyB0aGF0IGFyZSBub3Qgc3BlY2lmaWNhbGx5IHJlbnQgb3IgbW9ydGdhZ2UgcGF5bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW1pdGVkUHVycG9zZVR5cGUge1xuICAgIFJlbnRNb3J0Z2FnZSA9ICdSRU5UX01PUlRHQUdFJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGNhbGxiYWNrIGZyb20gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtDYWxsYmFja01ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0NhbGxiYWNrTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhbGxiYWNrX3R5cGU/OiBMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRXZlbnROYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGV2ZW50X25hbWU/OiBMaW5rRXZlbnROYW1lO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGVyZSBpbiB0aGUgZmxvdyB0aGUgTGluayB1c2VyIGV4aXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgc3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYWNjb3VudHMgd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua0RlbGl2ZXJ5QWNjb3VudD47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIGFjY291bnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogTGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElmIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGlzIGJlaW5nIHVzZWQsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IGJlaW5nIHZlcmlmaWVkIGlzIGEgYGJ1c2luZXNzYCBvciBgcGVyc29uYWxgIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIGNsYXNzX3R5cGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2sgY29udGFpbmluZyBtZXRhZGF0YSBwcm94aWVkIG92ZXIgZnJvbSBMaW5rIGNhbGxiYWNrIGUuZy4gYG9uRXZlbnRgLCBgb25FeGl0YCwgYG9uU3VjY2Vzc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExJTktfQ0FMTEJBQ0tgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtDYWxsYmFja01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2NhbGxiYWNrX21ldGFkYXRhOiBMaW5rQ2FsbGJhY2tNZXRhZGF0YTtcbn1cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIGNvbnRhaW5pbmcgYm90aCB0aGUgdHlwZSBhbmQgYWRkcmVzcyB0byBzZW5kIHRoZSBVUkwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBtZXRob2Q/OiBMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIC8gZW1haWwgYWRkcmVzcyB0aGF0IEhvc3RlZCBMaW5rIHNlc3Npb25zIGFyZSBkZWxpdmVyZWQgdG8uIFBob25lIG51bWJlcnMgbXVzdCBiZSBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaW5rRGVsaXZlcnlPcHRpb25zO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24sIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGVsaXZlcnkgbWV0aG9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLiBTYW1lIGFzIHRoZSBgbGlua190b2tlbmAgc3RyaW5nIGV4Y2x1ZGluZyB0aGUgXFxcImxpbmste2Vudn0tXFxcIiBwcmVmaXguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZWxpdmVyeSBtZXRob2QgdG8gYmUgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTC4gIGBTTVNgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggU01TICBgRU1BSUxgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggZW1haWxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVNlc3Npb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24gd2FzIGNyZWF0ZWQgYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gSG9zdGVkIExpbmsgc2Vzc2lvbiB3YXMgY29tcGxldGVkIGF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBcXCdXZWxscyBGYXJnb1xcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHJlbGF0ZWQgdG8gdGhlIGRlbGl2ZXJ5IG9mIHRoZSBsaW5rIHNlc3Npb24gdG8gdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICAgICAqL1xuICAgIGNvbW11bmljYXRpb25fbWV0aG9kPzogTGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkZWxpdmVyeV9zdGF0dXM/OiBMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXM7XG59XG4vKipcbiAqIE9wdGlvbmFsIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU9wdGlvbnNcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBMaW5rRGVsaXZlcnlSZWNpcGllbnQ7XG59XG4vKipcbiAqIE1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIHJlY2lwaWVudC4gSWYgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHBvcHVsYXRlIHRoaXMgZmllbGQgaXMgbm90IGF2YWlsYWJsZSwgbGVhdmUgaXQgYmxhbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgY29tbXVuaWNhdGlvbiBtZXRob2RzIHRvIHNlbmQgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gVVJMIHRvLiBJZiBkZWxpdmVyeSBpcyBub3QgcmVxdWlyZWQsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2Q+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZHM/OiBBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPjtcbiAgICAvKipcbiAgICAgKiBGaXJzdCBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdpbGwgYmUgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwgLyB0ZXh0IChpZiBjb25maWd1cmVkKS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24uICBgQ1JFQVRFRGA6IFRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQgYnV0IG5vdCB5ZXQgYWNjZXNzZWQgYnkgdGhlIHVzZXIgIGBPUEVORURgOiBUaGUgc2Vzc2lvbiBpcyBvcGVuZWQgYnkgdGhlIHVzZXIgYnV0IG5vdCB5ZXQgY29tcGxldGVkICBgRVhJVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gZXhpdGVkIGJ5IHRoZSB1c2VyICBgQ09NUExFVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gY29tcGxldGVkIGJ5IHRoZSB1c2VyICBgRVhQSVJFRGA6IFRoZSBzZXNzaW9uIGhhcyBleHBpcmVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzIHtcbiAgICBDcmVhdGVkID0gJ0NSRUFURUQnLFxuICAgIE9wZW5lZCA9ICdPUEVORUQnLFxuICAgIEV4aXRlZCA9ICdFWElURUQnLFxuICAgIENvbXBsZXRlZCA9ICdDT01QTEVURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGVuZGluZyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wZW5kaW5nJ1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIExpbmsgY2FsbGJhY2sgZXZlbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tDYWxsYmFja1R5cGUge1xuICAgIFN1Y2Nlc3MgPSAnT05fU1VDQ0VTUycsXG4gICAgRXZlbnQgPSAnT05fRVZFTlQnLFxuICAgIEV4aXQgPSAnT05fRVhJVCdcbn1cblxuLyoqXG4gKiBUaGUgY29tbXVuaWNhdGlvbiBtZXRob2QgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZCB7XG4gICAgU21zID0gJ1NNUycsXG4gICAgRW1haWwgPSAnRU1BSUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZGVsaXZlcnkgb2YgdGhlIEhvc3RlZCBMaW5rIHRvIHRoZSB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRXZlbnQge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVVUlEIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVkdXBsaWNhdGUgZXZlbnRzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0V2ZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X21ldGFkYXRhOiBMaW5rRXZlbnRNZXRhZGF0YTtcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgYW4gZXZlbnQgdGhhdCBvY2N1cnJlZCB3aGlsZSB0aGUgdXNlciB3YXMgZ29pbmcgdGhyb3VnaCBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtFdmVudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIHRoYXQgdGhlIHVzZXIgZW5jb3VudGVyZWQuIEVtaXR0ZWQgYnkgYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgbWVzc2FnZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciB0eXBlIHRoYXQgdGhlIHVzZXIgZW5jb3VudGVyZWQuIEVtaXR0ZWQgYnk6IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBrZXkgaW5kaWNhdGVzIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgdXNlciBleGl0ZWQgdGhlIExpbmsgZmxvdy4gRW1pdHRlZCBieTogYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXhpdF9zdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBzZWxlY3RlZCBpbnN0aXR1dGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBpbnN0aXR1dGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHVzZWQgdG8gc2VhcmNoIGZvciBpbnN0aXR1dGlvbnMuIEVtaXR0ZWQgYnk6IGBTRUFSQ0hfSU5TVElUVVRJT05gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc2VhcmNoX3F1ZXJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgc3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLiBFbWl0dGVkIGJ5OiBhbGwgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIGhhcyBlbmNvdW50ZXJlZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBNRkEgdHlwZXM6IGNvZGUsIGRldmljZSwgcXVlc3Rpb25zLCBzZWxlY3Rpb25zLiBFbWl0dGVkIGJ5OiBgU1VCTUlUX01GQWAgYW5kIGBUUkFOU0lUSU9OX1ZJRVdgIHdoZW4gYHZpZXdfbmFtZWAgaXMgYE1GQWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBtZmFfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmlldyB0aGF0IGlzIGJlaW5nIHRyYW5zaXRpb25lZCB0by4gRW1pdHRlZCBieTogYFRSQU5TSVRJT05fVklFV2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB2aWV3X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIHRoZSB2ZXJpZmljYXRpb24gbWV0aG9kIGZvciBhIG1hdGNoZWQgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIgb3IgdGhlIEF1dGggVHlwZSBTZWxlY3QgZmxvdyB0eXBlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBJZiBzZWxlY3Rpb24gaXMgdXNlZCB0byBkZXNjcmliZSBzZWxlY3RlZCB2ZXJpZmljYXRpb24gbWV0aG9kLCB0aGVuIHBvc3NpYmxlIHZhbHVlcyBhcmUgYHBob25lb3RwYCBvciBgcGFzc3dvcmRgOyAgaWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbGVjdGVkIEF1dGggVHlwZSBTZWxlY3QgZmxvdywgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBmbG93X3R5cGVfbWFudWFsYCBvciBgZmxvd190eXBlX2luc3RhbnRgLiBFbWl0dGVkIGJ5OiBgTUFUQ0hFRF9TRUxFQ1RfVkVSSUZZX01FVEhPRGAgYW5kIGBTRUxFQ1RfQVVUSF9UWVBFYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHNlbGVjdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgYnJhbmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBicmFuZF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhpcyBpbnN0aXR1dGlvbiB3YXMgbWF0Y2hlZC4gVGhpcyB3aWxsIGJlIGVpdGhlciBgcmV0dXJuaW5nX3VzZXJgIG9yIGByb3V0aW5nX251bWJlcmAgaWYgZW1pdHRlZCBieSBgTUFUQ0hFRF9TRUxFQ1RfSU5TVElUVVRJT05gLiBPdGhlcndpc2UsIHRoaXMgd2lsbCBiZSBgU0FWRURfSU5TVElUVVRJT05gIG9yIGBBVVRPX1NFTEVDVF9TQVZFRF9JTlNUSVRVVElPTmAgaWYgZW1pdHRlZCBieSBgU0VMRUNUX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1hdGNoX3JlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgc3VibWl0dGVkIGJ5IHVzZXIgYXQgdGhlIG1pY3JvLWRlcG9zaXRzIHJvdXRpbmcgbnVtYmVyIHBhbmUuIEVtaXR0ZWQgYnkgYFNVQk1JVF9ST1VUSU5HX05VTUJFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgbWFzayBleHRyYWN0ZWQgZnJvbSB0aGUgdXNlci1wcm92aWRlZCBhY2NvdW50IG51bWJlci4gSWYgdGhlIHVzZXItaW5wdXR0ZWQgYWNjb3VudCBudW1iZXIgaXMgZm91ciBkaWdpdHMgbG9uZywgYGFjY291bnRfbnVtYmVyX21hc2tgIGlzIGVtcHR5LiBFbWl0dGVkIGJ5IGBTVUJNSVRfQUNDT1VOVF9OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfbWFzaz86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0aGF0IGhhcyBqdXN0IG9jY3VycmVkIGluIHRoZSBMaW5rIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRXZlbnROYW1lIHtcbiAgICBCYW5rSW5jb21lSW5zaWdodHNDb21wbGV0ZWQgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfQ09NUExFVEVEJyxcbiAgICBDbG9zZU9hdXRoID0gJ0NMT1NFX09BVVRIJyxcbiAgICBFcnJvciA9ICdFUlJPUicsXG4gICAgRXhpdCA9ICdFWElUJyxcbiAgICBGYWlsT2F1dGggPSAnRkFJTF9PQVVUSCcsXG4gICAgSGFuZG9mZiA9ICdIQU5ET0ZGJyxcbiAgICBJc3N1ZUZvbGxvd2VkID0gJ0lTU1VFX0ZPTExPV0VEJyxcbiAgICBPcGVuID0gJ09QRU4nLFxuICAgIE9wZW5NeVBsYWlkID0gJ09QRU5fTVlfUExBSUQnLFxuICAgIE9wZW5PYXV0aCA9ICdPUEVOX09BVVRIJyxcbiAgICBTZWFyY2hJbnN0aXR1dGlvbiA9ICdTRUFSQ0hfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEF1dGhUeXBlID0gJ1NFTEVDVF9BVVRIX1RZUEUnLFxuICAgIFNlbGVjdEJyYW5kID0gJ1NFTEVDVF9CUkFORCcsXG4gICAgU2VsZWN0RGVncmFkZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfREVHUkFERURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdERvd25JbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRE9XTl9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0RmlsdGVyZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRklMVEVSRURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEluc3RpdHV0aW9uID0gJ1NFTEVDVF9JTlNUSVRVVElPTicsXG4gICAgU3VibWl0QWNjb3VudE51bWJlciA9ICdTVUJNSVRfQUNDT1VOVF9OVU1CRVInLFxuICAgIFN1Ym1pdENyZWRlbnRpYWxzID0gJ1NVQk1JVF9DUkVERU5USUFMUycsXG4gICAgU3VibWl0RG9jdW1lbnRzID0gJ1NVQk1JVF9ET0NVTUVOVFMnLFxuICAgIFN1Ym1pdERvY3VtZW50c0Vycm9yID0gJ1NVQk1JVF9ET0NVTUVOVFNfRVJST1InLFxuICAgIFN1Ym1pdERvY3VtZW50c1N1Y2Nlc3MgPSAnU1VCTUlUX0RPQ1VNRU5UU19TVUNDRVNTJyxcbiAgICBTdWJtaXRNZmEgPSAnU1VCTUlUX01GQScsXG4gICAgU3VibWl0Um91dGluZ051bWJlciA9ICdTVUJNSVRfUk9VVElOR19OVU1CRVInLFxuICAgIFRyYW5zaXRpb25WaWV3ID0gJ1RSQU5TSVRJT05fVklFVycsXG4gICAgVmlld0RhdGFUeXBlcyA9ICdWSUVXX0RBVEFfVFlQRVMnXG59XG5cbi8qKlxuICogVGhpcyB3ZWJob29rIGNvbnRhaW5zIGEgc3VtbWFyeSBvZiB0aGUgZXZlbnRzIGZyb20gYSBMaW5rIHNlc3Npb24gYW5kIHdpbGwgYmUgZmlyZWQgYWZ0ZXIgdGhlIHVzZXIgZmluaXNoZXMgZ29pbmcgdGhyb3VnaCBMaW5rLiBJZiB0aGUgdXNlciBhYmFuZG9ucyB0aGUgTGluayBmbG93IChpLmUuLCBjbG9zZXMgdGhlIGhvc3RlZCBsaW5rIHdlYnBhZ2Ugb3IgbGVhdmVzIExpbmsgb3BlbiBmb3IgdG9vIGxvbmcgd2l0aG91dCB0YWtpbmcgYW55IGFjdGlvbiksIHRoZSB3ZWJob29rIHdpbGwgYmUgZmlyZWQgNS0xNSBtaW51dGVzIGFmdGVyIHRoZSBsYXN0IHVzZXIgaW50ZXJhY3Rpb24uIEEgc2luZ2xlIExpbmsgc2Vzc2lvbiBtYXkgb2NjYXNpb25hbGx5IGdlbmVyYXRlIG11bHRpcGxlIGBFVkVOVFNgIHdlYmhvb2tzLiBJZiB0aGlzIG9jY3VycywgdGhlIG5ldyB3ZWJob29rIHdpbGwgY29udGFpbiBhbGwgcHJldmlvdXMgZXZlbnRzIGZvciB0aGUgc2Vzc2lvbiwgYXMgd2VsbCBhcyBuZXcgZXZlbnRzIHRoYXQgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGBFVkVOVFNgIHdlYmhvb2sgd2FzIHNlbnQuIElmIHRoaXMgb2NjdXJzLCBldmVudHMgY2FuIGJlIGdyb3VwZWQgdXNpbmcgdGhlIGBsaW5rX3Nlc3Npb25faWRgIGZpZWxkIGFuZCwgaWYgbmVjZXNzYXJ5LCBkZS1kdXBsaWNhdGVkIHVzaW5nIHRoZSBgZXZlbnRfaWRgIGZpZWxkLiAgQnkgZGVmYXVsdCwgdGhlIGBFVkVOVFNgIHdlYmhvb2sgaXMgc2VudCBvbmx5IGZvciBzZXNzaW9ucyB3aGVyZSB0aGUgZW5kIHVzZXIgZ29lcyB0aHJvdWdoIGEgSG9zdGVkIExpbmsgZmxvdyAoaW5jbHVkaW5nIExpbmsgUmVjb3ZlcnkgZmxvd3MpLiBJZiB5b3Ugd291bGQgbGlrZSB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3Igc2Vzc2lvbnMgbm90IHVzaW5nIEhvc3RlZCBMaW5rLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIG9yIHN1cHBvcnQuIFRoaXMgZW5hYmxlbWVudCB3aWxsIGFsc28gY2F1c2UgeW91IHRvIHJlY2VpdmUgdGhlIGBTRVNTSU9OX0ZJTklTSEVEYCB3ZWJob29rIGZvciBub24tSG9zdGVkLUxpbmsgc2Vzc2lvbnMgYW5kIHRvIGJlIGFibGUgdG8gdXNlIGAvbGluay90b2tlbi9nZXRgIHRvIHJlY2VpdmUgZXZlbnRzIGRhdGEgZm9yIG5vbi1Ib3N0ZWQgTGluayBzZXNzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0V2ZW50c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRXZlbnRzV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVZFTlRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExpbmsgZXZlbnRzIGVtaXR0ZWQgZHVyaW5nIHRoZSBMaW5rIHNlc3Npb25cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua0V2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICBldmVudHM6IEFycmF5PExpbmtFdmVudD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgb2NjdXJyZWQgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBMaW5rIHRva2VuIHVzZWQgdG8gY3JlYXRlIHRoZSBMaW5rIHNlc3Npb24gdGhlc2UgZXZlbnRzIGFyZSBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay9vYXV0aC9jb3JyZWxhdGlvbl9pZC9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmcm9tIGEgcmVjZWl2ZWQgT0F1dGggcmVkaXJlY3QgVVJJIGNhbGxiYWNrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfY29ycmVsYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmsvb2F1dGgvY29ycmVsYXRpb25faWQvZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgbGlua190b2tlbmAgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYGxpbmtfY29ycmVsYXRpb25faWRgLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZS1pbml0aWFsaXplIExpbmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGJhbmsgZW1wbG95bWVudCB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZG9jdW1lbnQgdXBsb2FkIENSQSBzZXNzaW9uIGluIGxpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fYmFua19zdGF0ZW1lbnRzX3VwbG9hZGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgUGxhaWQgQ2hlY2sgSXRlbSBhZGQgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgQ2hlY2sgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIFRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBgYWNjb3VudHNgIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIFBsYWlkIENoZWNrIEl0ZW0gdXBkYXRlIHZpYSB1cGRhdGUgbW9kZSBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYVVwZGF0ZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgQ2hlY2sgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIFRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFVcGRhdGVSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIFtvbkV4aXRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay93ZWIvI29uZXhpdCkgY2FsbGJhY2sgZnJvbSBMaW5rLiBJZiB5b3UgYXJlIG5vdCByZWNlaXZpbmcgdGhpcyBmaWVsZCBhbmQgYXJlIGluc3RlYWQgcmVjZWl2aW5nIHRoZSBkZXByZWNhdGVkIGBvbl9leGl0YCBmaWVsZCwgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byB1cGRhdGUgeW91ciBpbnRlZ3JhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25FeGl0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbmV4aXQpIGNhbGxiYWNrIGZyb20gTGluay4gVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBvbmx5IGZvciBsZWdhY3kgaW1wbGVtZW50YXRpb25zIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtgZXhpdGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tZ2V0LXJlc3BvbnNlLWxpbmstc2Vzc2lvbnMtZXhpdCksIGZvciBpbXByb3ZlZCBuYW1pbmcgY29uc2lzdGVuY3kuIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZmllbGQsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIgYGV4aXRgIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIGlmIGEgdXNlciBleGl0cyBMaW5rIHdpdGhvdXQgc3VjY2Vzc2Z1bGx5IGxpbmtpbmcgYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIHN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGluc3RpdHV0aW9uIG9iamVjdC4gSWYgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IG9yIEluc3RhbnQgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgV2VsbHMgRmFyZ29gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24sIGFsb25nIHdpdGggdGhlIHB1YmxpYyB0b2tlbihzKSBpZiBhdmFpbGFibGUuICBCeSBkZWZhdWx0LCB0aGlzIHdlYmhvb2sgaXMgc2VudCBvbmx5IGZvciBzZXNzaW9ucyBlbmFibGVkIGZvciB0aGUgSG9zdGVkIExpbmsgZmxvdyAoaW5jbHVkaW5nIExpbmsgUmVjb3ZlcnkgZmxvd3MpLCBhIE11bHRpLUl0ZW0gTGluayBmbG93LCBvciBhIExheWVyIGZsb3cuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBvdGhlciBzZXNzaW9ucywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBvciBzdXBwb3J0LiBUaGlzIGVuYWJsZW1lbnQgd2lsbCBhbHNvIGVuYWJsZSB0aGUgYEVWRU5UU2Agd2ViaG9vayBmb3IgYWxsIExpbmsgc2Vzc2lvbnMgYW5kIHRoZSBhYmlsaXR5IHRvIHVzZSBgL2xpbmsvdG9rZW4vZ2V0YCB0byByZXRyaWV2ZSBldmVudHMgZm9yIG5vbi1Ib3N0ZWQtTGluayBzZXNzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU0VTU0lPTl9GSU5JU0hFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIExpbmsgc2Vzc2lvbi4gV2lsbCBhbHdheXMgYmUgXFxcIlNVQ0NFU1NcXFwiIG9yIFxcXCJFWElURURcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGxpbmtfdG9rZW5gIHVzZWQgdG8gY3JlYXRlIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbiBnZW5lcmF0ZWQgYnkgdGhlIExpbmsgc2Vzc2lvbi4gVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkOyBwbGVhc2UgdXNlIGBwdWJsaWNfdG9rZW5zYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbnMgZ2VuZXJhdGVkIGJ5IHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgcHVibGljX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhbiBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFJldHVybmVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBheXN0dWJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBXLTJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uIElmIHlvdSBhcmUgbm90IHJlY2VpdmluZyB0aGlzIGZpZWxkIGFuZCBhcmUgaW5zdGVhZCByZWNlaXZpbmcgdGhlIGRlcHJlY2F0ZWQgYG9uX3N1Y2Nlc3NgIGZpZWxkLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHVwZGF0ZSB5b3VyIGludGVncmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBpdGVtX2FkZF9yZXN1bHRzOiBBcnJheTxMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgUGxhaWQgQ2hlY2sgSXRlbSBhZGRzIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBjcmFfaXRlbV9hZGRfcmVzdWx0czogQXJyYXk8TGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIFBsYWlkIENoZWNrIEl0ZW0gdXBkYXRlcyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25DcmFVcGRhdGVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBjcmFfdXBkYXRlX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luY29tZV9yZXN1bHRzOiBBcnJheTxMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGRvY3VtZW50X2luY29tZV9yZXN1bHRzOiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBjcmFfZG9jdW1lbnRfdXBsb2FkX3Jlc3VsdHM/OiBMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25TdWNjZXNzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbnN1Y2Nlc3MpIGNhbGxiYWNrIGZyb20gTGluay4gVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBvbmx5IGZvciBsZWdhY3kgaW50ZWdyYXRpb25zIGFuZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtgcmVzdWx0cy5pdGVtX2FkZF9yZXN1bHRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1nZXQtcmVzcG9uc2UtbGluay1zZXNzaW9ucy1yZXN1bHRzLWl0ZW0tYWRkLXJlc3VsdHMpIHdoaWNoIGNhbiBzdXBwb3J0IG11bHRpcGxlIHB1YmxpYyB0b2tlbnMgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLCBmb3IgZmxvd3Mgc3VjaCBhcyBtdWx0aS1JdGVtIExpbmsuIElmIHlvdSBhcmUgcmVjZWl2aW5nIGBvbl9zdWNjZXNzYCwgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBtaWdyYXRlIHRvIGByZXN1bHRzLml0ZW1fYWRkX3Jlc3VsdHNgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2VzcyB7XG4gICAgLyoqXG4gICAgICogRGlzcGxheWVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBEaXNwbGF5ZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYGFjY291bnRzYCB3aWxsIG9ubHkgaW5jbHVkZSBzZWxlY3RlZCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB1c2VyXFwncyBhY3Rpb25zIGFuZCBldmVudHMgdGhyb3VnaCB0aGUgTGluayBmbG93LiBJbmNsdWRlIHRoaXMgaWRlbnRpZmllciB3aGVuIG9wZW5pbmcgYSBzdXBwb3J0IHRpY2tldCBmb3IgZmFzdGVyIHR1cm5hcm91bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgdHJhbnNmZXJfc3RhdHVzPzogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1cyB8IG51bGw7XG59XG4vKipcbiAqIEFuIGFjY291bnQgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIGFjY291bnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cy4gSXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHVzaW5nIEF1dGggYW5kIGZhbGxpbmcgYmFjayB0byBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQuICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB1bnNlbnRgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCBidXQgUGxhaWQgaGFzIG5vdCB5ZXQgc2VudCB0aGUgbWljcm8tZGVwb3NpdC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wZW5kaW5nYDogVGhlIERhdGFiYXNlIEF1dGggcmVzdWx0IGlzIHBlbmRpbmcgYW5kIHdpbGwgYmUgYXZhaWxhYmxlIHVwb24gQXV0aCByZXF1ZXN0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gd2FzIGJlaW5nIHVzZWQsIGluZGljYXRlcyB0aGUgdXNlclxcJ3Mgc2VsZWN0aW9uIHdoZW4gYXNrZWQgaWYgdGhlIGFjY291bnQgYmVpbmcgdmVyaWZpZWQgaXMgYSBgYnVzaW5lc3NgIG9yIGBwZXJzb25hbGAgYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGFzIFBsYWlkIG5vIGxvbmdlciBjb2xsZWN0cyB0aGlzIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgbWljcm8tZGVwb3NpdCBmbG93LiBUbyBzZWUgd2hldGhlciBhbiBhY2NvdW50IGlzIGJ1c2luZXNzIG9yIHBlcnNvbmFsLCB1c2UgdGhlIGBob2xkZXJfY2F0ZWdvcnlgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgb3IgSW5zdGFudCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiwgd2lsbCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBcXCdXZWxscyBGYXJnb1xcJ2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHRyYW5zZmVyLiBSZXR1cm5lZCBvbmx5IHdoZW4gW1RyYW5zZmVyIFVJXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpKSBpcyBpbXBsZW1lbnRlZC4gIC0gYENPTVBMRVRFYCAtIFRoZSB0cmFuc2ZlciB3YXMgY29tcGxldGVkLiAtIGBJTkNPTVBMRVRFYCAtIFRoZSB0cmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBGb3IgaGVscCwgc2VlIFtUcm91Ymxlc2hvb3RpbmcgdHJhbnNmZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpLyN0cm91Ymxlc2hvb3RpbmctdHJhbnNmZXItdWkpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1cyB7XG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnLFxuICAgIEluY29tcGxldGUgPSAnSU5DT01QTEVURScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEJ5IGRlZmF1bHQsIExpbmsgd2lsbCBwcm92aWRlIGxpbWl0ZWQgYWNjb3VudCBmaWx0ZXJpbmc6IGl0IHdpbGwgb25seSBkaXNwbGF5IEluc3RpdHV0aW9ucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIHByb2R1Y3RzIHN1cHBsaWVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgYW5kLCBpZiBgYXV0aGAgaXMgc3BlY2lmaWVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCB3aWxsIGFsc28gZmlsdGVyIG91dCBhY2NvdW50cyBvdGhlciB0aGFuIGBjaGVja2luZ2AsIGBzYXZpbmdzYCwgYW5kIGBjYXNoIG1hbmFnZW1lbnRgIGFjY291bnRzIG9uIHRoZSBBY2NvdW50IFNlbGVjdCBwYW5lLiBZb3UgY2FuIGZ1cnRoZXIgbGltaXQgdGhlIGFjY291bnRzIHNob3duIGluIExpbmsgYnkgdXNpbmcgYGFjY291bnRfZmlsdGVyc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBzaG93biBpbiBMaW5rLiBPbmx5IHRoZSBzcGVjaWZpZWQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gVGhpcyBmaWx0ZXJpbmcgYXBwbGllcyB0byBib3RoIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3IChpZiBlbmFibGVkKSBhbmQgdGhlIEluc3RpdHV0aW9uIFNlbGVjdCB2aWV3LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgc2VsZWN0ZWQgc3VidHlwZXMgd2lsbCBiZSBvbWl0dGVkIGZyb20gTGluay4gVG8gaW5kaWNhdGUgdGhhdCBhbGwgc3VidHlwZXMgc2hvdWxkIGJlIHNob3duLCB1c2UgdGhlIHZhbHVlIGBcXFwiYWxsXFxcImAuIElmIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBmaWx0ZXIgaXMgdXNlZCwgYW55IGFjY291bnQgdHlwZSBmb3Igd2hpY2ggYSBmaWx0ZXIgaXMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGVudGlyZWx5IG9taXR0ZWQgZnJvbSBMaW5rLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBUaGUgZmlsdGVyIG1heSBvciBtYXkgbm90IGltcGFjdCB0aGUgbGlzdCBvZiBhY2NvdW50cyBzaG93biBieSB0aGUgaW5zdGl0dXRpb24gaW4gdGhlIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3csIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgaW5zdGl0dXRpb24uIElmIHRoZSB1c2VyIHNlbGVjdHMgZXhjbHVkZWQgYWNjb3VudCBzdWJ0eXBlcyBpbiB0aGUgT0F1dGggZmxvdywgdGhlc2UgYWNjb3VudHMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIEl0ZW0uIElmIHRoZSB1c2VyIHNlbGVjdHMgb25seSBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzLCB0aGUgbGluayBhdHRlbXB0IHdpbGwgZmFpbCBhbmQgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byB0cnkgYWdhaW4uIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBsb2FuPzogTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3RoZXJGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgb3RoZXI/OiBPdGhlckZpbHRlcjtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgQ2FzaGZsb3cgUmVwb3J0IHByb2R1Y3QuIEN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ2FzaGZsb3dSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGluIHRoZSBDYXNoZmxvdyBSZXBvcnQgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdG8gcGFzcyBpbiBmb3IgdGhlIENhcmQgU3dpdGNoIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQklOIChCYW5rIElkZW50aWZpY2F0aW9uIE51bWJlcikgb2YgdGhlIGNhcmQgdG8gc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAgICAgKi9cbiAgICBjYXJkX2Jpbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgbGltaXRlZCBwdXJwb3NlIHR5cGVzLiBSZXN0cmljdHMgd2hpY2gga2luZHMgb2YgbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nIGFjY291bnRzIG1heSBiZSBjb25uZWN0ZWQgaW4gTGluayB0byBwcmV2ZW50IHVzZXJzIGZyb20gY29ubmVjdGluZyB0aGVtIGZvciB1bnN1cHBvcnRlZCB1c2UgY2FzZXMuIFJlcXVpcmVkIHdoZW4gXFwnbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nXFwnIGlzIGluIHRoZSBzdWJ0eXBlcyBmaWx0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PExpbWl0ZWRQdXJwb3NlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJcbiAgICAgKi9cbiAgICBsaW1pdGVkX3B1cnBvc2VfdHlwZXM/OiBBcnJheTxMaW1pdGVkUHVycG9zZVR5cGU+O1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEhvc3RlZCBMaW5rLiBUbyBlbmFibGUgdGhlIHNlc3Npb24gZm9yIEhvc3RlZCBMaW5rLCBzZW5kIHRoaXMgb2JqZWN0IGluIHRoZSByZXF1ZXN0LiBJdCBjYW4gYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgZGVsaXZlcnlfbWV0aG9kPzogSG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFVSSSB0aGF0IEhvc3RlZCBMaW5rIHdpbGwgcmVkaXJlY3QgdG8gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBMaW5rIGZsb3cuIFRoaXMgd2lsbCBvbmx5IG9jY3VyIGluIEhvc3RlZCBMaW5rIHNlc3Npb25zLCBub3QgaW4gb3RoZXIgaW1wbGVtZW50YXRpb24gbWV0aG9kcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGNvbXBsZXRpb25fcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IHNlY29uZHMgdGhlIGxpbmsgd2lsbCBiZSB2YWxpZCBmb3IuIE11c3QgYmUgcG9zaXRpdmUuIENhbm5vdCBiZSBsb25nZXIgdGhhbiAyMSBkYXlzLiBUaGUgZGVmYXVsdCBsaWZldGltZSBpcyA3IGRheXMgZm9yIGxpbmtzIGRlbGl2ZXJlZCBieSBlbWFpbCwgMSBkYXkgZm9yIGxpbmtzIGRlbGl2ZXJlZCB2aWEgU01TLCBhbmQgMzAgbWludXRlcyBmb3IgbGlua3Mgbm90IHNlbnQgdmlhIFBsYWlkIExpbmsgZGVsaXZlcnkuIFRoaXMgcGFyYW1ldGVyIHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIGFsbCB0aHJlZSBsaW5rIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgdXJsX2xpZmV0aW1lX3NlY29uZHM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2xpZW50IGlzIG9wZW5pbmcgSG9zdGVkIExpbmsgaW4gYSBtb2JpbGUgYXBwIGluIGFuIGBBc1dlYkF1dGhlbnRpY2F0aW9uU2Vzc2lvbmAgb3IgQ2hyb21lIGN1c3RvbSB0YWIuIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgaXNfbW9iaWxlX2FwcD86IGJvb2xlYW47XG59XG4vKipcbiAqIElkZW50aXR5IG9iamVjdCB1c2VkIHRvIHNwZWNpZnkgZG9jdW1lbnQgdXBsb2FkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgaXNfZG9jdW1lbnRfdXBsb2FkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgLiBDdXJyZW50bHkgY2FuIG9ubHkgY29udGFpbiBvbmUgYGFjY291bnRfaWRgLiBNdXN0IGJlIHBvcHVsYXRlZCBpZiB1c2luZyBEb2N1bWVudCBVcGxvYWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBhcnNpbmcgY29uZmlndXJhdGlvbnMuIFZhbGlkIHBhcnNpbmcgY29uZmlndXJhdGlvbnMgYXJlIGBvY3JgIGFuZCBgcmlza19zaWduYWxzYC4gSWYgcGFyc2luZyBjb25maWd1cmF0aW9ucyBhcmUgb21pdHRlZCwgZGVmYXVsdHMgdG8gYG9jcmBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWdzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz47XG59XG4vKipcbiAqIEEgbWFwIGNvbnRhaW5pbmcgZGF0YSB1c2VkIHRvIGhpZ2hsaWdodCBpbnN0aXR1dGlvbnMgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGJhbmsgdG8gaGlnaGxpZ2h0IGluIExpbmsuIE5vdGU6IGluIHJhcmUgY2FzZXMsIGEgc2luZ2xlIHJvdXRpbmcgbnVtYmVyIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgaW5zdGl0dXRpb25zLCBlLmcuIGR1ZSB0byBhIGJyb2tlcmFnZSB1c2luZyBhbm90aGVyIGluc3RpdHV0aW9uIHRvIG1hbmFnZSBBQ0ggb24gaXRzIHN3ZWVwIGFjY291bnRzLiBJZiB0aGlzIGhhcHBlbnMsIHRoZSBiYW5rIHdpbGwgbm90IGJlIGhpZ2hsaWdodGVkIGluIExpbmsgZXZlbiBpZiB0aGUgcm91dGluZyBudW1iZXIgaXMgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllcikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PExvYW5BY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIGFwcGxpY2F0aW9uLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIExpbmsuIE1heGltdW0gbGVuZ3RoIG9mIDMwIGNoYXJhY3RlcnMuIElmIGEgdmFsdWUgbG9uZ2VyIHRoYW4gMzAgY2hhcmFjdGVycyBpcyBwcm92aWRlZCwgTGluayB3aWxsIGRpc3BsYXkgXFxcIlRoaXMgQXBwbGljYXRpb25cXFwiIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhbmd1YWdlIHRoYXQgTGluayBzaG91bGQgYmUgZGlzcGxheWVkIGluLiBXaGVuIGluaXRpYWxpemluZyB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgdGhpcyBmaWVsZCBpcyBub3QgdXNlZDsgZm9yIG1vcmUgZGV0YWlscywgc2VlIFtJZGVudGl0eSBWZXJpZmljYXRpb24gc3VwcG9ydGVkIGxhbmd1YWdlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vI3N1cHBvcnRlZC1sYW5ndWFnZXMpLiAgU3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IC0gRGFuaXNoIChgXFwnZGFcXCdgKSAtIER1dGNoIChgXFwnbmxcXCdgKSAtIEVuZ2xpc2ggKGBcXCdlblxcJ2ApIC0gRXN0b25pYW4gKGBcXCdldFxcJ2ApIC0gRnJlbmNoIChgXFwnZnJcXCdgKSAtIEdlcm1hbiAoYFxcJ2RlXFwnYCkgLSBIaW5kaSAoYFxcJ2hpXFwnYCkgLSBJdGFsaWFuIChgXFwnaXRcXCdgKSAtIExhdHZpYW4gKGBcXCdsdlxcJ2ApIC0gTGl0aHVhbmlhbiAoYFxcJ2x0XFwnYCkgLSBOb3J3ZWdpYW4gKGBcXCdub1xcJ2ApIC0gUG9saXNoIChgXFwncGxcXCdgKSAtIFBvcnR1Z3Vlc2UgKGBcXCdwdFxcJ2ApIC0gUm9tYW5pYW4gKGBcXCdyb1xcJ2ApIC0gU3BhbmlzaCAoYFxcJ2VzXFwnYCkgLSBTd2VkaXNoIChgXFwnc3ZcXCdgKSAtIFZpZXRuYW1lc2UgKGBcXCd2aVxcJ2ApICBXaGVuIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJlZCBoZXJlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmcgaW4gdGhlIGN1c3RvbWl6YXRpb24sIG9yIHRoZSBjdXN0b21pemF0aW9uIHdpbGwgbm90IGJlIGFwcGxpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiBQbGFpZC1zdXBwb3J0ZWQgY291bnRyeSBjb2RlcyB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW5zdGl0dXRpb25zIGZyb20gYWxsIGxpc3RlZCBjb3VudHJpZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgY29tcGxldGUgbWFwcGluZyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMgYnkgY291bnRyeSwgc2VlIGh0dHBzOi8vc3VwcG9ydC5wbGFpZC5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjc4OTU4MjY5NDc3MzUtV2hhdC1QbGFpZC1wcm9kdWN0cy1hcmUtc3VwcG9ydGVkLWluLWVhY2gtY291bnRyeS1hbmQtcmVnaW9uLiBGb3IgYWNjZXNzIHRvIGFkZGl0aW9uYWwgY291bnRyaWVzIGJleW9uZCB3aGF0IHlvdSBoYXZlIGJlZW4gYXBwcm92ZWQgZm9yLCBbY29udGFjdCBzYWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vY29udGFjdC8pLCB5b3VyIGFjY291bnQgbWFuYWdlciwgb3Igc3VwcG9ydC4gIElmIHVzaW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgYGNvdW50cnlfY29kZXNgIHNob3VsZCBiZSBzZXQgdG8gdGhlIGNvdW50cnkgd2hlcmUgeW91ciBjb21wYW55IGlzIGJhc2VkLCBub3QgdGhlIGNvdW50cnkgd2hlcmUgeW91ciB1c2VyIGlzIGxvY2F0ZWQuIEZvciBhbGwgb3RoZXIgcHJvZHVjdHMsIGBjb3VudHJ5X2NvZGVzYCByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB5b3VyIHVzZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIElmIExpbmsgaXMgbGF1bmNoZWQgd2l0aCBtdWx0aXBsZSBjb3VudHJ5IGNvZGVzLCBvbmx5IHByb2R1Y3RzIHRoYXQgeW91IGFyZSBlbmFibGVkIGZvciBpbiBhbGwgY291bnRyaWVzIHdpbGwgYmUgdXNlZCBieSBMaW5rLiBXaGlsZSBhbGwgY291bnRyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gU2FuZGJveCwgaW4gUHJvZHVjdGlvbiBvbmx5IHRoZSBjb3VudHJpZXMgeW91IGhhdmUgcmVxdWVzdGVkIGFjY2VzcyBmb3IgYXJlIHNob3duLiBUbyByZXF1ZXN0IGFjY2VzcyB0byBhZGRpdGlvbmFsIGNvdW50cmllcywgW2ZpbGUgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiAgSWYgdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIG1ha2Ugc3VyZSB0aGUgY291bnRyeSBjb2RlcyBpbiB0aGUgY3VzdG9taXphdGlvbiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgaW4gYGNvdW50cnlfY29kZXNgLCBvciB0aGUgY3VzdG9taXphdGlvbiBtYXkgbm90IGJlIGFwcGxpZWQuICBJZiB1c2luZyB0aGUgQXV0aCBmZWF0dXJlcyBJbnN0YW50IE1hdGNoLCBJbnN0YW50IE1pY3JvLWRlcG9zaXRzLCBTYW1lLURheSBNaWNyby1kZXBvc2l0cywgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBvciBEYXRhYmFzZSBBdXRoLCBgY291bnRyeV9jb2Rlc2AgbXVzdCBiZSBzZXQgdG8gYFtcXCdVU1xcJ11gLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIEEgYHVzZXJfaWRgIGdlbmVyYXRlZCB1c2luZyBgL3VzZXIvY3JlYXRlYC4gUmVxdWlyZWQgZm9yIGludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIFBsYWlkIFByb3RlY3QsIE11bHRpLUl0ZW0gTGluaywgb3IgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIE9uZSBvZiBlaXRoZXIgdGhlIGB1c2VyX2lkYCBvciB0aGUgYHVzZXJgIGZpZWxkIGlzIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB0aGF0IHRoZSBsaW5rZWQgSXRlbSBtdXN0IHN1cHBvcnQuIElmIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCBzaG91bGQgYmUgb21pdHRlZCAodW5sZXNzIHlvdSBhcmUgdXNpbmcgdXBkYXRlIG1vZGUgdG8gYWRkIGEgY3JlZGl0IHByb2R1Y3QsIHN1Y2ggYXMgQXNzZXRzLCBTdGF0ZW1lbnRzLCBJbmNvbWUsIG9yIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgdG8gYW4gZXhpc3RpbmcgSXRlbSk7IGF0IGxlYXN0IG9uZSBgcHJvZHVjdGAgaXMgcmVxdWlyZWQgb3RoZXJ3aXNlLiAgVG8gbWF4aW1pemUgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYW5kIGFjY291bnRzIGF2YWlsYWJsZSwgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIG1pbmltYWwgcHJvZHVjdCBzZXQgcmVxdWlyZWQgZm9yIHlvdXIgdXNlIGNhc2UsIGFzIHRoZSBwcm9kdWN0cyBzcGVjaWZpZWQgd2lsbCBsaW1pdCB3aGljaCBpbnN0aXR1dGlvbnMgYW5kIGFjY291bnQgdHlwZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8geW91ciB1c2VycyBpbiBMaW5rLiBPbmx5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgKmFsbCogcmVxdWVzdGVkIHByb2R1Y3RzIGNhbiBiZSBzZWxlY3RlZDsgaWYgYSB1c2VyIGF0dGVtcHRzIHRvIHNlbGVjdCBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgYSBsaXN0ZWQgcHJvZHVjdCwgYSBcXFwiQ29ubmVjdGl2aXR5IG5vdCBzdXBwb3J0ZWRcXFwiIGVycm9yIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gTGluay4gRm9yIGVhY2ggc3BlY2lmaWVkIHByb2R1Y3QsIHRoZSBJdGVtIGNvbm5lY3RlZCBieSB0aGUgdXNlciBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNvbXBhdGlibGUgYWNjb3VudC4gRm9yIGRldGFpbHMgb24gY29tcGF0aWJsZSBwcm9kdWN0IC8gYWNjb3VudCB0eXBlIGNvbWJpbmF0aW9ucywgc2VlIFt0aGUgYWNjb3VudCB0eXBlL3Byb2R1Y3Qgc3VwcG9ydCBtYXRyaXhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtLXByb2R1Y3Qtc3VwcG9ydC1tYXRyaXgpLiAgVG8gYWRkIHByb2R1Y3RzIHdpdGhvdXQgbGltaXRpbmcgdGhlIGluc3RpdHV0aW9uIGxpc3Qgb3IgYWNjb3VudCB0eXBlcywgdXNlIHRoZSBbYG9wdGlvbmFsX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1vcHRpb25hbC1wcm9kdWN0cykgb3IgIFtgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1yZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpIGZpZWxkcy4gUHJvZHVjdHMgY2FuIGFsc28gYmUgYWRkZWQgdG8gYW4gSXRlbSBieSBjYWxsaW5nIHRoZSBwcm9kdWN0IGVuZHBvaW50IGFmdGVyIG9idGFpbmluZyBhbiBhY2Nlc3MgdG9rZW47IHRoaXMgbWF5IHJlcXVpcmUgdGhlIHByb2R1Y3QgdG8gYmUgbGlzdGVkIGluIHRoZSBbYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1hZGRpdGlvbmFsLWNvbnNlbnRlZC1wcm9kdWN0cykgYXJyYXkuIEZvciBkZXRhaWxzLCBzZWUgW0Nob29zaW5nIHdoZW4gdG8gaW5pdGlhbGl6ZSBwcm9kdWN0c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8pLiAgYGJhbGFuY2VgIGlzICpub3QqIGEgdmFsaWQgdmFsdWUsIHRoZSBCYWxhbmNlIHByb2R1Y3QgZG9lcyBub3QgcmVxdWlyZSBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluaXRpYWxpemVkIHdoZW4gYW55IG90aGVyIHByb2R1Y3QgaXMgaW5pdGlhbGl6ZWQuICBJZiBsYXVuY2hpbmcgTGluayB3aXRoIENSQSBwcm9kdWN0cywgYGNyYV9iYXNlX3JlcG9ydHNgIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LiAgTm90ZSB0aGF0LCB1bmxlc3MgeW91IGhhdmUgb3B0ZWQgdG8gZGlzYWJsZSBJbnN0YW50IE1hdGNoIHN1cHBvcnQsIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgSW5zdGFudCBNYXRjaCB3aWxsIGFsc28gYmUgc2hvd24gaW4gTGluayBpZiBgYXV0aGAgaXMgc3BlY2lmaWVkIGFzIGEgcHJvZHVjdCwgZXZlbiB0aG91Z2ggdGhlc2UgaW5zdGl0dXRpb25zIGRvIG5vdCBjb250YWluIGBhdXRoYCBpbiB0aGVpciBwcm9kdWN0IGFycmF5LiAgSW4gUHJvZHVjdGlvbiwgeW91IHdpbGwgYmUgYmlsbGVkIGZvciBlYWNoIHByb2R1Y3QgdGhhdCB5b3Ugc3BlY2lmeSB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBOb3RlIHRoYXQgYSBwcm9kdWN0IGNhbm5vdCBiZSByZW1vdmVkIGZyb20gYW4gSXRlbSBvbmNlIHRoZSBJdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhhdCBwcm9kdWN0LiBUbyBzdG9wIGJpbGxpbmcgb24gYW4gSXRlbSBmb3Igc3Vic2NyaXB0aW9uLWJhc2VkIHByb2R1Y3RzLCBzdWNoIGFzIExpYWJpbGl0aWVzLCBJbnZlc3RtZW50cywgYW5kIFRyYW5zYWN0aW9ucywgcmVtb3ZlIHRoZSBJdGVtIHZpYSBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byB1c2Ugb25seSBpZiB0aGUgaW5zdGl0dXRpb24gYW5kIGFjY291bnQocykgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgc3VwcG9ydCB0aGUgcHJvZHVjdC4gSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBzdGlsbCBiZSBzaG93biBpbiBMaW5rLiBUaGUgcHJvZHVjdHMgd2lsbCBvbmx5IGJlIGV4dHJhY3RlZCBhbmQgYmlsbGVkIGlmIHRoZSB1c2VyIHNlbGVjdHMgYW4gaW5zdGl0dXRpb24gYW5kIGFjY291bnQgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZW0uICBUaGVyZSBzaG91bGQgYmUgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5cy4gVGhlIGBwcm9kdWN0c2AgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiAgRm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyB0aGlzIGZlYXR1cmUsIHNlZSBbUmVxdWlyZWQgaWYgU3VwcG9ydGVkIFByb2R1Y3RzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB0aGF0IHdpbGwgZW5oYW5jZSB0aGUgY29uc3VtZXJcXCdzIHVzZSBjYXNlLCBidXQgdGhhdCB5b3VyIGFwcCBjYW4gZnVuY3Rpb24gd2l0aG91dC4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGZldGNoIGRhdGEgZm9yIHRoZXNlIHByb2R1Y3RzIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMsIGFuZCBmYWlsdXJlIHRvIHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYWZmZWN0IEl0ZW0gY3JlYXRpb24uICBUaGVyZSBzaG91bGQgYmUgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW09wdGlvbmFsIFByb2R1Y3RzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNvcHRpb25hbC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbmFsX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGFkZGl0aW9uYWwgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byBjb2xsZWN0IGNvbnNlbnQgZm9yIHRvIHN1cHBvcnQgeW91ciB1c2UgY2FzZS4gVGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYmUgYmlsbGVkIHVudGlsIHlvdSBzdGFydCB1c2luZyB0aGVtIGJ5IGNhbGxpbmcgdGhlIHJlbGV2YW50IGVuZHBvaW50cy4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBoYXZlIGNvbnNlbnQgY29sbGVjdGVkLiAgSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBzdGlsbCBiZSBzaG93biBpbiBMaW5rLiAgVGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFycmF5IGFuZCB0aGUgYHByb2R1Y3RzYCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheXMuICBJZiB5b3UgaW5jbHVkZSBgc2lnbmFsYCBpbiBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgW2Avc2lnbmFsL3ByZXBhcmVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9zaWduYWwvI3NpZ25hbHByZXBhcmUpIGJlZm9yZSBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgdGhlIGZpcnN0IHRpbWUgb24gYW4gSXRlbSBpbiBvcmRlciB0byBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgcmVzdWx0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtgL3NpZ25hbC9wcmVwYXJlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvc2lnbmFsLyNzaWduYWxwcmVwYXJlKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggYW55IHdlYmhvb2tzIHNob3VsZCBiZSBzZW50LiBOb3RlIHRoYXQgd2ViaG9va3MgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiAoZS13YWxsZXQgdHJhbnNhY3Rpb25zIG9ubHkpLCBUcmFuc2ZlciwgQmFuayBUcmFuc2ZlciAoaW5jbHVkaW5nIEF1dGggbWljcm8tZGVwb3NpdCBub3RpZmljYXRpb24gd2ViaG9va3MpLCBNb25pdG9yLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGFyZSBjb25maWd1cmVkIHZpYSB0aGUgRGFzaGJvYXJkIGluc3RlYWQuIEluIHVwZGF0ZSBtb2RlLCB0aGlzIGZpZWxkIHdpbGwgbm90IGhhdmUgYW4gZWZmZWN0OyB0byB1cGRhdGUgdGhlIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIGFuIGV4aXN0aW5nIEl0ZW0sIHVzZSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSB0byB1cGRhdGUgb3IgcmVmZXJlbmNlLCB1c2VkIHdoZW4gdXBkYXRpbmcsIG1vZGlmeWluZywgb3IgYWNjZXNzaW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gLiBVc2VkIHdoZW4gbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUsIHdoZW4gY29tcGxldGluZyB0aGUgU2FtZS1EYXkgTWljcm8tZGVwb3NpdCAobWFudWFsKSBmbG93LCBvciAob3B0aW9uYWxseSkgd2hlbiBpbml0aWFsaXppbmcgTGluayBmb3IgYSByZXR1cm5pbmcgdXNlciBhcyBwYXJ0IG9mIHRoZSBUcmFuc2ZlciBVSSBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2Nlc3MgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbXMgdG8gdXBkYXRlIGluIExpbmsgdXBkYXRlIG1vZGUgZm9yIHRoZSBBc3NldHMgcHJvZHVjdC4gVXNpbmcgdGhpcyBpbnN0ZWFkIG9mIHRoZSBgYWNjZXNzX3Rva2VuYCBmaWVsZCBhbGxvd3MgdGhlIHVwZGF0aW5nIG9mIG11bHRpcGxlIGl0ZW1zIGF0IG9uY2UuIFRoaXMgZmVhdHVyZSBpcyBpbiBjbG9zZWQgYmV0YSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mby5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBMaW5rIGN1c3RvbWl6YXRpb24gZnJvbSB0aGUgUGxhaWQgRGFzaGJvYXJkIHRvIGJlIGFwcGxpZWQgdG8gTGluay4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBkZWZhdWx0YCBjdXN0b21pemF0aW9uIHdpbGwgYmUgdXNlZC4gV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGluIHRoZSBjdXN0b21pemF0aW9uIG11c3QgbWF0Y2ggdGhlIGxhbmd1YWdlIHNlbGVjdGVkIHZpYSB0aGUgYGxhbmd1YWdlYCBwYXJhbWV0ZXIsIGFuZCB0aGUgY291bnRyaWVzIGluIHRoZSBjdXN0b21pemF0aW9uIHNob3VsZCBtYXRjaCB0aGUgY291bnRyeSBjb2RlcyBzZWxlY3RlZCB2aWEgYGNvdW50cnlfY29kZXNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2N1c3RvbWl6YXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFwcGVhcmFuY2VNb2RlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwZWFyYW5jZV9tb2RlPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFwcGVhcmFuY2VNb2RlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSSSBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBhIHVzZXIgc2hvdWxkIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBUaGUgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIG5vdCBjb250YWluIGFueSBxdWVyeSBwYXJhbWV0ZXJzLiBXaGVuIHVzZWQgaW4gUHJvZHVjdGlvbiwgbXVzdCBiZSBhbiBodHRwcyBVUkkuIE5vdGUgdGhhdCBhbnkgcmVkaXJlY3QgVVJJIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCByZWRpcmVjdCBVUklzIGxpc3QgaW4gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBJZiBpbml0aWFsaXppbmcgb24gQW5kcm9pZCwgYGFuZHJvaWRfcGFja2FnZV9uYW1lYCBtdXN0IGJlIHNwZWNpZmllZCBpbnN0ZWFkIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHlvdXIgYXBwXFwncyBBbmRyb2lkIHBhY2thZ2UuIFJlcXVpcmVkIGlmIHVzaW5nIHRoZSBgbGlua190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIG9uIEFuZHJvaWQuIEFueSBwYWNrYWdlIG5hbWUgc3BlY2lmaWVkIGhlcmUgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIEFuZHJvaWQgcGFja2FnZSBuYW1lcyBzZXR0aW5nIG9uIHRoZSBbZGV2ZWxvcGVyIGRhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKS4gV2hlbiBjcmVhdGluZyBhIGBsaW5rX3Rva2VuYCBmb3IgaW5pdGlhbGl6aW5nIExpbmsgb24gb3RoZXIgcGxhdGZvcm1zLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgbGVmdCBibGFuayBhbmQgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW5kcm9pZF9wYWNrYWdlX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2RhdGE/OiBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2h9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjYXJkX3N3aXRjaD86IExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2g7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkFjY291bnRGaWx0ZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogTGlua1Rva2VuQWNjb3VudEZpbHRlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkVVQ29uZmlnfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBldV9jb25maWc/OiBMaW5rVG9rZW5FVUNvbmZpZztcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBjZXJ0YWluIGxlZ2FjeSB1c2UgY2FzZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfY29uZmlndXJhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveW1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYmFzZV9yZXBvcnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyZWRpdFBhcnRuZXJJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyZWRpdFBhcnRuZXJJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmFfb3B0aW9ucz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlPzogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVwZGF0ZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHM7XG4gICAgLyoqXG4gICAgICogQSB0aGlyZCBwYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5JbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogTGlua1Rva2VuSW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkludmVzdG1lbnRzQXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGludmVzdG1lbnRzX2F1dGg/OiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmt9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBob3N0ZWRfbGluaz86IExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlblRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IExpbmtUb2tlblRyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ2FzaGZsb3dSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjYXNoZmxvd19yZXBvcnQ/OiBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHJlcXVlc3QgYSBDUkEgY29ubmVjdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyYV9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5O1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgaW5kaWNhdGVzIHRoYXQgY2xpZW50IHN1cHBvcnRzIGxpbmtpbmcgRmluYW5jZUtpdCAvIEFwcGxlQ2FyZCBpdGVtcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZpbmFuY2VraXRfc3VwcG9ydGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGVuYWJsZSBsaW5raW5nIG11bHRpcGxlIGl0ZW1zIGluIHRoZSBzYW1lIExpbmsgc2Vzc2lvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuYWJsZV9tdWx0aV9pdGVtX2xpbms/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdXNlciB0b2tlbiBnZW5lcmF0ZWQgdXNpbmcgYC91c2VyL2NyZWF0ZWAuIEFueSBJdGVtIGNyZWF0ZWQgZHVyaW5nIHRoZSBMaW5rIHNlc3Npb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIFBsYWlkIFByb3RlY3QsIE11bHRpLUl0ZW0gTGluaywgb3IgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGJlZm9yZSBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCBpbnN0ZWFkIG9mIHRoZSBgdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIEJ5IGRlZmF1bHQsIExpbmsgd2lsbCBvbmx5IGRpc3BsYXkgYWNjb3VudCB0eXBlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIHByb2R1Y3RzIHN1cHBsaWVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gWW91IGNhbiBmdXJ0aGVyIGxpbWl0IHRoZSBhY2NvdW50cyBzaG93biBpbiBMaW5rIGJ5IHVzaW5nIGBhY2NvdW50X2ZpbHRlcnNgIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgc3VidHlwZXMgdG8gYmUgc2hvd24gaW4gTGluay4gT25seSB0aGUgc3BlY2lmaWVkIHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIFRoaXMgZmlsdGVyaW5nIGFwcGxpZXMgdG8gYm90aCB0aGUgQWNjb3VudCBTZWxlY3QgdmlldyAoaWYgZW5hYmxlZCkgYW5kIHRoZSBJbnN0aXR1dGlvbiBTZWxlY3Qgdmlldy4gSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIHNlbGVjdGVkIHN1YnR5cGVzIHdpbGwgYmUgb21pdHRlZCBmcm9tIExpbmsuIFRvIGluZGljYXRlIHRoYXQgYWxsIHN1YnR5cGVzIHNob3VsZCBiZSBzaG93biwgdXNlIHRoZSB2YWx1ZSBgXFxcImFsbFxcXCJgLiBJZiB0aGUgYGFjY291bnRfZmlsdGVyc2AgZmlsdGVyIGlzIHVzZWQsIGFueSBhY2NvdW50IHR5cGUgZm9yIHdoaWNoIGEgZmlsdGVyIGlzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBlbnRpcmVseSBvbWl0dGVkIGZyb20gTGluay4gIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIEZvciBpbnN0aXR1dGlvbnMgdXNpbmcgT0F1dGgsIHRoZSBmaWx0ZXIgd2lsbCBub3QgYWZmZWN0IHRoZSBsaXN0IG9mIGluc3RpdHV0aW9ucyBvciBhY2NvdW50cyBzaG93biBieSB0aGUgYmFuayBpbiB0aGUgT0F1dGggd2luZG93LiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGNyZWRpdD86IExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGxvYW4/OiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBkZXNpcmVkIGFwcGVhcmFuY2UgbW9kZSBmb3IgTGluaywgdXNlZCB0byBmb3JjZSBsaWdodCBvciBkYXJrIG1vZGVzIG9yIHNldCBMaW5rIHRvIGNoYW5nZSBkZXBlbmRpbmcgb24gdXNlciBzeXN0ZW0gc2V0dGluZ3MuIEN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBcHBlYXJhbmNlTW9kZSB7XG4gICAgTGlnaHQgPSAnTElHSFQnLFxuICAgIERhcmsgPSAnREFSSycsXG4gICAgU3lzdGVtID0gJ1NZU1RFTScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEF1dGggcHJvZHVjdC4gVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSBleHRlbmRlZCBBdXRoIGZsb3dzIGZvciB0aGUgcmVzdWx0aW5nIExpbmsgc2Vzc2lvbi4gT21pdHRpbmcgYW55IGZpZWxkIHdpbGwgcmVzdWx0IGluIGEgZGVmYXVsdCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGJ5IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdGhhdCB3aWxsIGFwcGx5IGlmIHlvdSBoYXZlIG5vdCByZXF1ZXN0ZWQgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gYXBwbHkgYSBkaWZmZXJlbnQgZGVmYXVsdC4gSWYgeW91IGhhdmUgZW5hYmxlZCB0aGUgW0Rhc2hib2FyZCBBY2NvdW50IFZlcmlmaWNhdGlvbiBwYW5lXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vYWNjb3VudC12ZXJpZmljYXRpb24pLCB0aGUgc2V0dGluZ3MgZW5hYmxlZCB0aGVyZSB3aWxsIG92ZXJyaWRlIGFueSBzZXR0aW5ncyBpbiB0aGlzIG9iamVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aCB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgQXV0aCBUeXBlIFNlbGVjdCBpcyBlbmFibGVkIGZvciB0aGUgTGluayBzZXNzaW9uLCBhbGxvd2luZyB0aGUgZW5kIHVzZXIgdG8gY2hvb3NlIGJldHdlZW4gbGlua2luZyB2aWEgYSBjcmVkZW50aWFscy1iYXNlZCBmbG93IChpLmUuIEluc3RhbnQgQXV0aCwgSW5zdGFudCBNYXRjaCwgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzKSBvciBhIG1hbnVhbCBmbG93IHRoYXQgZG9lcyBub3QgcmVxdWlyZSBsb2dpbiAoYWxsIG90aGVyIEF1dGggZmxvd3MpIHByaW9yIHRvIHNlbGVjdGluZyB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIERlZmF1bHQgYmVoYXZpb3IgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBhdXRoX3R5cGVfc2VsZWN0X2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBmbG93LiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgSW5zdGFudCBNYXRjaCBmbG93LiBJbnN0YW50IE1hdGNoIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gSW5zdGFudCBNYXRjaCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGlzIGZpZWxkIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgaW5zdGFudF9tYXRjaF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBTYW1lLURheSBNaWNyby1kZXBvc2l0cyBmbG93LiAgRGVmYXVsdCBiZWhhdmlvciBpcyBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHNhbWVfZGF5X21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgSW5zdGFudCBNaWNyby1kZXBvc2l0cyBmbG93LiAgRGVmYXVsdCBiZWhhdmlvciBmb3IgUGxhaWQgdGVhbXMgY3JlYXRlZCBhZnRlciBOb3ZlbWJlciAyMDIzIGlzIGBmYWxzZWA7IGRlZmF1bHQgYmVoYXZpb3IgZm9yIFBsYWlkIHRlYW1zIGNyZWF0ZWQgYmVmb3JlIHRoYXQgZGF0ZSBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgaW5zdGFudF9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGF0IHR5cGUgb2YgW1Jlcm91dGUgdG8gQ3JlZGVudGlhbHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9mbG93LW9wdGlvbnMvI3JlbW92aW5nLW1hbnVhbC12ZXJpZmljYXRpb24tZW50cnktcG9pbnRzLXdpdGgtcmVyb3V0ZS10by1jcmVkZW50aWFscykgcGFuZSBzaG91bGQgYmUgdXNlZCBpbiB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMgZmxvdy4gRGVmYXVsdCBiZWhhdmlvciBpcyBgT1BUSU9OQUxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgcmVyb3V0ZV90b19jcmVkZW50aWFscz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoUmVyb3V0ZVRvQ3JlZGVudGlhbHNFbnVtO1xuICAgIC8qKlxuICAgICAqIERhdGFiYXNlIE1hdGNoIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggRGF0YWJhc2UgQXV0aC4gVXNlIHRoZSBbQWNjb3VudCBWZXJpZmljYXRpb24gRGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vYWNjb3VudC12ZXJpZmljYXRpb24pIHRvIGVuYWJsZSBEYXRhYmFzZSBBdXRoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGF0YWJhc2VfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRGF0YWJhc2UgSW5zaWdodHMgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgd2l0aCBEYXRhYmFzZSBBdXRoLiBVc2UgdGhlIFtBY2NvdW50IFZlcmlmaWNhdGlvbiBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9hY2NvdW50LXZlcmlmaWNhdGlvbikgdG8gZW5hYmxlIERhdGFiYXNlIEF1dGguXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkYXRhYmFzZV9pbnNpZ2h0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGF1dGhfdHlwZV9zZWxlY3RfZW5hYmxlZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZsb3dfdHlwZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgU01TIG1pY3JvLWRlcG9zaXRzIHZlcmlmaWNhdGlvbi4gRGVmYXVsdCBiZWhhdmlvciBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgc21zX21pY3JvZGVwb3NpdHNfdmVyaWZpY2F0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoUmVyb3V0ZVRvQ3JlZGVudGlhbHNFbnVtIHtcbiAgICBPZmYgPSAnT0ZGJyxcbiAgICBPcHRpb25hbCA9ICdPUFRJT05BTCcsXG4gICAgRm9yY2VkID0gJ0ZPUkNFRCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhGbG93VHlwZUVudW0ge1xuICAgIEZsZXhpYmxlQXV0aCA9ICdGTEVYSUJMRV9BVVRIJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEJhc2UgUmVwb3J0IHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGFzc2V0c2AgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIHRoZSBjbGllbnQgaXMgQ1JBLWVuYWJsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggUGxhaWQgQ2hlY2sgcHJvZHVjdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiBQbGFpZCBDaGVjayBwcm9kdWN0cy4gTWF4aW11bSBpcyA3MzE7IG1pbmltdW0gaXMgMTgwLiBJZiBhIHZhbHVlIGxvd2VyIHRoYW4gMTgwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMTgwIGRheXMgb2YgaGlzdG9yeSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRheXMgb2YgZGF0YSByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1aXJlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgcGFydG5lcl9pbnNpZ2h0cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgYmFzZV9yZXBvcnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBjYXNoZmxvd19pbnNpZ2h0cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNMZW5kU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgbGVuZF9zY29yZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zTGVuZFNjb3JlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc05ldHdvcmtJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBuZXR3b3JrX2luc2lnaHRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNOZXR3b3JrSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgaW52ZXN0bWVudCBkYXRhIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgbGlua2VkIGFjY291bnQocykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9pbnZlc3RtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0luY29tZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGluY29tZV9pbnNpZ2h0cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHM7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEJhc2UgUmVwb3J0IHByb2R1Y3QsIHNwZWNpZmljYWxseSB0aGUgYGNsaWVudF9yZXBvcnRfaWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0R1NFT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZ3NlX29wdGlvbnM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRHU0VPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVwb3J0IG11c3QgaW5jbHVkZSBpZGVudGl0eSBpbmZvcm1hdGlvbi4gSWYgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgdGhlIHJlcG9ydCB3aWxsIGZhaWwuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIHJlcXVpcmVfaWRlbnRpdHk/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRIb21lTGVuZGluZ1JlcG9ydE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGhvbWVfbGVuZGluZ19yZXBvcnRfb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHRvIGNyZWF0ZSByZXBvcnRzIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIEdTRXMgZm9yIG1vcnRnYWdlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0R1NFT3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydEdTRU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCB0eXBlcyBvZiByZXBvcnRzIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSB0byBHU0VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxHU0VSZXBvcnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0R1NFT3B0aW9uc1xuICAgICAqL1xuICAgIHJlcG9ydF90eXBlczogQXJyYXk8R1NFUmVwb3J0VHlwZT47XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENhc2hmbG93IEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93QXR0cmlidXRlc1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBDUkEgSW5jb21lIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0luY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lSW5zaWdodHNGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfaW5zaWdodHNfZmlsdGVyPzogSW5jb21lSW5zaWdodHNGaWx0ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVJbnNpZ2h0c1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfaW5zaWdodHNfdmVyc2lvbjogSW5jb21lSW5zaWdodHNWZXJzaW9uIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQ1JBIExlbmRTY29yZSBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0xlbmRTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zTGVuZFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRMZW5kU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0xlbmRTY29yZVxuICAgICAqL1xuICAgIGxlbmRfc2NvcmVfdmVyc2lvbj86IFBsYWlkTGVuZFNjb3JlVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENSQSBOZXR3b3JrIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zTmV0d29ya0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNOZXR3b3JrSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrSW5zaWdodHNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc05ldHdvcmtJbnNpZ2h0c1xuICAgICAqL1xuICAgIG5ldHdvcmtfaW5zaWdodHNfdmVyc2lvbj86IE5ldHdvcmtJbnNpZ2h0c1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cyBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21WZXJzaW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmlzbV92ZXJzaW9ucz86IFByaXNtVmVyc2lvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNGaWNvSW5wdXR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgZmljbz86IENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dCB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENyZWRpdCBQYXJ0bmVyIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gY29tcHV0ZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cy4gRGVmYXVsdHMgdG8gMTgwIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIChEZXByZWNhdGVkKSBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBEZXBvc2l0IFN3aXRjaCAoYmV0YSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZGVwb3NpdF9zd2l0Y2hgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGRlcG9zaXRfc3dpdGNoX2lkYCBwcm92aWRlZCBieSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgRW1wbG95bWVudCBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBlbXBsb3ltZW50YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBlbXBsb3ltZW50IGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X3NvdXJjZV90eXBlcz86IEFycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZTtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBCYW5rIEVtcGxveW1lbnQuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGVtcGxveW1lbnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCBgYmFua2AgaXMgc3BlY2lmaWVkIGluIGBlbXBsb3ltZW50X3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb24gZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgY29uc2VudD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgYWdyZWVkIHRvIGEgcHJpdmFjeSBwb2xpY3kgc3BlY2lmeWluZyB0aGF0IHRoZWlyIGRhdGEgd2lsbCBiZSBzaGFyZWQgd2l0aCBQbGFpZCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzLiAgSWYgYGdhdmVfY29uc2VudGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIGBhY2NlcHRfdG9zYCBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBza2lwcGVkYCBhbmQgdGhlIGVuZCB1c2VyXFwncyBzZXNzaW9uIHdpbGwgc3RhcnQgYXQgdGhlIG5leHQgc3RlcCByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZ2F2ZV9jb25zZW50PzogYm9vbGVhbjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSW5jb21lIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGluY29tZV92ZXJpZmljYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCBvZiB0aGUgdmVyaWZpY2F0aW9uIGluc3RhbmNlLCBhcyBwcm92aWRlZCBieSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYC4gUmVwbGFjZWQgYnkgdGhlIHVzZXIgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgb2YgYW4gYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgYXMgcHJvdmlkZWQgYnkgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gUHJvdmlkaW5nIGFuIGBhc3NldF9yZXBvcnRfaWRgIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHVzZXIgdGhyb3VnaCBhIHN0cmVhbWxpbmVkIGZsb3cuIElmIHByb3ZpZGVkLCB0aGUgYmFuayBsaW5raW5nIGZsb3cgd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIHRoYXQgYSB1c2VyIGhhcyBwcmV2aW91c2x5IGNvbm5lY3RlZCB3aXRoLiBEYXRhIGZyb20gdGhlc2UgaW5zdGl0dXRpb25zIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIGRvY3VtZW50IGRhdGEgcmVjZWl2ZWQgZHVyaW5nIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBoZWxwIHZlcmlmeSB0aGF0IHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgYXJlIGFjY3VyYXRlLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGVzZSBJdGVtcyBkdXJpbmcgbGluaywgaXQgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciB0aGlzIExpbmsgc2Vzc2lvbi4gIFRoaXMgZmllbGQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgcGF5cm9sbGAgaW5jb21lIHNvdXJjZSB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZTtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdGVkX2luY29tZV9zb3VyY2VzPzogQXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIEJhbmsgSW5jb21lLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIG11bHRpcGxlIEl0ZW1zIHRvIGJlIGFkZGVkIGluIHRoZSBMaW5rIHNlc3Npb24uIFRoaXMgc2V0dGluZyBpcyBkZXByZWNhdGVkIGFuZCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbW9yZSBnZW5lcmFsIGBlbmFibGVfbXVsdGlfaXRlbV9saW5rYCBzZXR0aW5nLCB3aGljaCBzdXBwb3J0cyBhbGwgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbmFibGVfbXVsdGlwbGVfaXRlbXM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBQYXlyb2xsIEluY29tZSAoaW5jbHVkaW5nIERvY3VtZW50IEluY29tZSkuIEZ1cnRoZXIgY3VzdG9taXphdGlvbiBvcHRpb25zIGZvciBEb2N1bWVudCBJbmNvbWUsIHN1Y2ggYXMgY3VzdG9taXppbmcgd2hpY2ggZG9jdW1lbnQgdHlwZXMgbWF5IGJlIHVwbG9hZGVkLCBhcmUgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBbTGluayBDdXN0b21pemF0aW9uIHBhbmVdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rKSBpbiB0aGUgRGFzaGJvYXJkLiAoUmVxdWlyZXMgUHJvZHVjdGlvbiBlbmFibGVtZW50LilcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiB0byBlbmFibGUgZm9yIHRoZSBMaW5rIHNlc3Npb24uIElmIG5vbmUgYXJlIHNwZWNpZmllZCwgdGhlbiB1c2VycyB3aWxsIHNlZSBib3RoIGRvY3VtZW50IGFuZCBkaWdpdGFsIHBheXJvbGwgaW5jb21lLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGZsb3dfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gTGluayB0b2tlbiB3aWxsIGJlIHVzZWQgZm9yIHVwZGF0ZSBtb2RlLiBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGlzX3VwZGF0ZV9tb2RlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBVbmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIEl0ZW0gdG8gdXBkYXRlIHdpdGguICBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gICAgICovXG4gICAgaXRlbV9pZF90b191cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBhbmFseXNpcyB0byBlbmFibGUgZm9yIGRvY3VtZW50IHVwbG9hZHMuIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCB0aGVuIGRvY3Mgd2lsbCB1bmRlcmdvIE9DUiBwYXJzaW5nIG9ubHkuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIHBhcnNpbmdfY29uZmlnPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz4gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBQYXkgQnkgQmFuayBmbG93LiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIHRvIGNvbmZpZ3VyZSB0aGUgdXNlciBleHBlcmllbmNlLCBhbmQgY3VycmVudGx5IHJlcXVpcmVzIHRoZSBhbW91bnQgZmllbGQgdG8gYmUgc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2ZlciB0aGF0IHByb3ZpZGVzIHRoZSBwYXltZW50IGNvbnRleHQuIFRoZSBtYXggbGVuZ3RoIGlzIDI1Ni5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHBheW1lbnRfaW5pdGlhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuIEVpdGhlciBgcGF5bWVudF9pZGAgb3IgYGNvbnNlbnRfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb25zZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFN0YXRlbWVudHMgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgdGhlIHN0YXRlbWVudHMgcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjAtMTAtMzBcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMC0xMC0zMFxcXCIuIFlvdSBjYW4gcmVxdWVzdCB1cCB0byB0d28geWVhcnMgb2YgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFRyYW5zZmVyIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgcmV0dXJuZWQgYnkgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgaW50ZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaWRgIHJldHVybmVkIGJ5IHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludC4gVXNlZCB0byBpbmRpY2F0ZSBMaW5rIHNlc3Npb24gdG8gY29tcGxldGUgcmVxdWlyZWQgdXNlciBhY3Rpb24gaW4gb3JkZXIgdG8gbWFrZSBhIGRlY2lzaW9uIGZvciB0aGUgYXV0aG9yaXphdGlvbi4gSWYgc2V0LCBgYWNjZXNzX3Rva2VuYCBjYW4gYmUgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCByZXR1cm5lZCBieSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBlbmFibGVzIFt1cGRhdGUgbW9kZSB3aXRoIEFjY291bnQgU2VsZWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvI3VzaW5nLXVwZGF0ZS1tb2RlLXRvLXJlcXVlc3QtbmV3LWFjY291bnRzKSBmb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhIHRoYXQgZG8gbm90IHVzZSBPQXV0aCwgb3IgdGhhdCB1c2UgT0F1dGggYnV0IGRvIG5vdCBoYXZlIHRoZWlyIG93biBhY2NvdW50IHNlbGVjdGlvbiBmbG93LiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyB0aGF0IGhhdmUgYW4gT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdyAoaS5lLiBtb3N0IE9BdXRoLWVuYWJsZWQgaW5zdGl0dXRpb25zKSwgdXBkYXRlIG1vZGUgd2l0aCBBY2NvdW50IFNlbGVjdCB3aWxsIGFsd2F5cyBiZSBlbmFibGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgYWNjb3VudF9zZWxlY3Rpb25fZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogTm90ZTogdGhpcyBmaWVsZCBpcyBub3QgY3VycmVudGx5IHVzZWQuIFBsYWlkIG1heSBlbmFibGUgdGhpcyBmaWVsZCBpbiB0aGUgZnV0dXJlIGlmIDEwMzMtcmVsYXRlZCBleHBpcmF0aW9uIGJlZ2lucyB0byBiZSBlbmZvcmNlZC4gIEJ5IGRlZmF1bHQsIFBsYWlkIHdpbGwgZW5hYmxlIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdyBkdXJpbmcgdXBkYXRlIG1vZGUgZm9yIGFuIEl0ZW0gZW5hYmxlZCBmb3IgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvKSBpZiB0aGUgSXRlbSBleHBpcmVzIHdpdGhpbiBzaXggbW9udGhzLiBEdXJpbmcgYSByZWF1dGhvcml6YXRpb24gZmxvdywgYW4gZW5kIHVzZXIgd2lsbCByZXZpZXcgUGxhaWRcXCdzIGVuZCB1c2VyIHByaXZhY3kgcG9saWN5LCB1c2UgY2FzZSBhbmQgZGF0YSBzY29wZSBjb25zZW50cywgYW5kIGFjY291bnQgYWNjZXNzIGNvbnNlbnRzOyB0aGV5IG1heSBhbHNvIGJlIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb25cXCdzIE9BdXRoIGZsb3cuIEFmdGVyIHRoZSBlbmQgdXNlciBzdWNjZXNzZnVsbHkgY29tcGxldGVzIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdywgdGhlIEl0ZW1cXCdzIGV4cGlyYXRpb24gZGF0ZSB3aWxsIGJlIGV4dGVuZGVkIHRvIDEyIG1vbnRocyBmcm9tIHRoZSB0aW1lIHRoYXQgdGhlIHJlYXV0aG9yaXphdGlvbiB0b29rIHBsYWNlLiBUaGlzIGZpZWxkIGFsbG93cyB5b3UgdG8gb3B0aW9uYWxseSBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWF1dGhvcml6YXRpb24gc2NoZWR1bGluZyBsb2dpYyB0byBlaXRoZXIgZm9yY2libHkgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlYXV0aG9yaXphdGlvbiBmbG93IGZvciBhIGdpdmVuIHVwZGF0ZSBtb2RlIHNlc3Npb24uIFRoaXMgZmllbGQgZG9lcyBub3QgaW1wYWN0IHRoZSBmbG93IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgaW4gdGhlIEVVIG9yIFVLLiBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIHJlYXV0aG9yaXphdGlvbl9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGEgYHVzZXJfdG9rZW5gIG9yIGB1c2VyX2lkYCBtdXN0IGFsc28gYmUgcHJvdmlkZWQsIGFuZCBMaW5rIHdpbGwgb3BlbiBpbiB1cGRhdGUgbW9kZSBmb3IgdGhlIGdpdmVuIHVzZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAgICAgKi9cbiAgICB1c2VyPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0byBiZSB1cGRhdGVkIGluIHVwZGF0ZSBtb2RlLiBJZiBlbXB0eSBvciBgbnVsbGAsIHRoaXMgZmllbGQgd2lsbCBkZWZhdWx0IHRvIGluaXRpYWxpemluZyB1cGRhdGUgbW9kZSBmb3IgdGhlIG1vc3QgcmVjZW50IHVuaGVhbHRoeSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gQSBgdXNlcl90b2tlbmAgbXVzdCBhbHNvIGJlIHByb3ZpZGVkIHRvIHVzZSB0aGlzIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlciB3aG8gd2lsbCBiZSBsaW5raW5nIHRoZWlyIGFjY291bnQuICoqUmVxdWlyZWQqKiBpZiBgdXNlcl9pZGAgaXNuXFwndCBpbmNsdWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlciB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC4gSXQgaXMgY3VycmVudGx5IHVzZWQgYXMgYSBtZWFucyBvZiBzZWFyY2hpbmcgbG9ncyBmb3IgdGhlIGdpdmVuIHVzZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZSwgdXNlZCBmb3IgW21pY3JvLWRlcG9zaXQgYmFzZWQgdmVyaWZpY2F0aW9uIGZsb3dzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS4gRm9yIGEgc21hbGwgbnVtYmVyIG9mIGN1c3RvbWVycyBvbiBsZWdhY3kgZmxvd3MsIHByb3ZpZGluZyB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBtaWNyby1kZXBvc2l0LWJhc2VkIGZsb3dzLiBGb3IgYWxsIG90aGVyIGN1c3RvbWVycywgdGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gUHJvdmlkaW5nIHRoZSB1c2VyXFwncyBuYW1lIGluIHRoaXMgZmllbGQgd2hlbiB1c2luZyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiB3aWxsIHN0cmVhbWxpbmUgdGhlIGVuZCB1c2VyIGV4cGVyaWVuY2UsIGFzIHRoZSB1c2VyIHdpbGwgbm90IGJlIHByb21wdGVkIHRvIGVudGVyIHRoZWlyIG5hbWUgZHVyaW5nIHRoZSBMaW5rIGZsb3c7IFBsYWlkIHdpbGwgdXNlIHRoZSBwcm92aWRlZCBsZWdhbCBuYW1lIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXQuIElmIHN1cHBsaWVkLCB3aWxsIGJlIHVzZWQgd2hlbiBhcHBsaWNhYmxlIHRvIHByZWZpbGwgcGhvbmUgbnVtYmVyIGZpZWxkcyBpbiBMaW5rIGZvciB0aGUgW3JldHVybmluZyB1c2VyIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikgYW5kIHRoZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uKS4gUGhvbmUgbnVtYmVyIGlucHV0IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHZhbGlkIG51bWJlciByYW5nZXM7IG51bWJlciBzdHJpbmdzIHRoYXQgZG8gbm90IG1hdGNoIGEgcmVhbC13b3JsZCBwaG9uZSBudW1iZXJpbmcgc2NoZW1lIG1heSBjYXVzZSB0aGUgcmVxdWVzdCB0byBmYWlsLCBldmVuIGluIHRoZSBTYW5kYm94IHRlc3QgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHBob25lIG51bWJlciB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhIHBob25lIG51bWJlciB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb25cXCd0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuIENhbiBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggW0lkZW50aXR5IFZlcmlmaWNhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgZW1haWwgYWRkcmVzcyB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhbiBlbWFpbCBhZGRyZXNzIHRoYXQgeW91IGhhdmUgdmVyaWZpZWQuIElmIHlvdSBoYXZlIHBlcmZvcm1lZCB2ZXJpZmljYXRpb24gYnV0IGRvblxcJ3QgaGF2ZSB0aGUgdGltZSwgeW91IG1heSBzdXBwbHkgYSBzaWduYWwgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBVTklYIGVwb2NoLiAgIEV4YW1wbGU6IGAyMDIwLTAxLTAxVDAwOjAwOjAwWmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc192ZXJpZmllZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIGFuZCBub3QgY3VycmVudGx5IHVzZWQsIHVzZSB0aGUgYGlkX251bWJlcmAgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcInl5eXktbW0tZGRcXFwiLiBDYW4gYmUgdXNlZCB0byBwcmVmaWxsIExpbmsgZmllbGRzIHdoZW4gdXNlZCB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyB1c2VyIHN0YXRlZCBpbmNvbWUgc291cmNlcyBmb3IgdGhlIEluY29tZSBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBjb3JyZXNwb25kaW5nIHRvIGFuIGluY29tZSBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgcGVyIGN5Y2xlIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfcGVyX2N5Y2xlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgYW5udWFsbHkgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9hbm51YWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV90eXBlPzogVXNlclN0YXRlZEluY29tZVNvdXJjZVBheVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3k7XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBhbmQgdGltZSBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBCeSBkZWZhdWx0LCBhIGBsaW5rX3Rva2VuYCBjcmVhdGVkIHRvIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgdGhhdCB3aWxsIGJlIGV4Y2hhbmdlZCBmb3IgYSBuZXcgYGFjY2Vzc190b2tlbmAgZXhwaXJlcyBhZnRlciA0IGhvdXJzLCBhbmQgYSBgbGlua190b2tlbmAgY3JlYXRlZCBmb3IgYW4gZXhpc3RpbmcgSXRlbSAoc3VjaCBhcyB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gIGJ5IGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlKSBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIElmIHVzaW5nIFtIb3N0ZWQgTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLyksIHRoZSBgbGlua190b2tlbmAgd2lsbCBleHBpcmUgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgSG9zdGVkIExpbmsgVVJMLCBhbmQgeW91IGNhbiBjdXN0b21pemUgdGhlIGR1cmF0aW9uIHVzaW5nIHRoZSBgaG9zdGVkX2xpbmsudXJsX2xpZmV0aW1lX3NlY29uZHNgIG9wdGlvbiBpbiB0aGUgcmVxdWVzdC4gSWYgdXNpbmcgTGluayBEZWxpdmVyeSAoYmV0YSksIHRoZSBgbGlua190b2tlbmAgd2lsbCBleHBpcmUgYnkgZGVmYXVsdCBhZnRlciAyNCBob3VycyBpZiBzZW50IHZpYSBTTVMgYW5kIGFmdGVyIDcgZGF5cyBpZiBzZW50IHZpYSBlbWFpbC4gSWYgdXNpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCBMaW5rIHRva2VuIGV4cGlyYXRpb24gd2lsbCBub3QgYmUgZW5mb3JjZWQ7IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBMaW5rIHNlc3Npb24gY2FuIGJlIGNyZWF0ZWQgd2l0aCBhbiBleHBpcmVkIExpbmsgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIG9mIGEgUGxhaWQtaG9zdGVkIExpbmsgZmxvdyB0aGF0IHdpbGwgdXNlIHRoZSBMaW5rIHRva2VuIHJldHVybmVkIGJ5IHRoaXMgcmVxdWVzdC4gT25seSBwcmVzZW50IGlmIHRoZSBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIEhvc3RlZCBMaW5rLiBUbyBlbmFibGUgdGhlIHNlc3Npb24gZm9yIEhvc3RlZCBMaW5rLCBzZW5kIGEgYGhvc3RlZF9saW5rYCBvYmplY3QgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBob3N0ZWRfbGlua191cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEVVIGZsb3dzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWcge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgb3BlbiBMaW5rIHdpdGhvdXQgYW4gaW5pdGlhbCBVSS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuRVVDb25maWdcbiAgICAgKi9cbiAgICBoZWFkbGVzcz86IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBhcmd1bWVudHMgb3JpZ2luYWxseSBwcm92aWRlZCB0byB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvZHVjdHNgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5pdGlhbF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgd2ViaG9va2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY291bnRyeV9jb2Rlc2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIGBsYW5ndWFnZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEZpbHRlcnNSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IEFjY291bnRGaWx0ZXJzUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWRpcmVjdF91cmlgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X25hbWVgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIExpbmtUb2tlbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IExpbmsgc2Vzc2lvbnMgY3JlYXRlZCB1c2luZyB0aGlzIGBsaW5rX3Rva2VuYC4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbnM/OiBBcnJheTxMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGxpbmsgc2Vzc2lvbi4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIGZvciB0aGUgbGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpcnN0IHN0YXJ0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgc3RhcnRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpbmlzaGVkLCBpZiBhdmFpbGFibGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZmluaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9uX3N1Y2Nlc3M/OiBMaW5rU2Vzc2lvblN1Y2Nlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvbl9leGl0PzogTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGV4aXQ/OiBMaW5rU2Vzc2lvbkV4aXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgY3VzdG9tZXItcmVsYXRlZCBMaW5rIGV2ZW50c1xuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRzPzogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25SZXN1bHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVzdWx0cz86IExpbmtTZXNzaW9uUmVzdWx0cyB8IG51bGw7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50cyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhbGxvdyBzZWxmLWN1c3RvZHkgY3J5cHRvIHdhbGxldHMgdG8gYmUgYWRkZWQgd2l0aG91dCByZXF1aXJpbmcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbGxvd191bnZlcmlmaWVkX2NyeXB0b193YWxsZXRzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGVudGVyIEludmVzdG1lbnRzIGFjY291bnQgYW5kIGhvbGRpbmdzIGluZm9ybWF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFsbG93X21hbnVhbF9lbnRyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIE1vdmUgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGgge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hbnVhbCBlbnRyeSBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYW51YWxfZW50cnlfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hc2tlZCBudW1iZXIgbWF0Y2ggZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgbWFza2VkX251bWJlcl9tYXRjaF9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgc3RhdGVkIGFjY291bnQgbnVtYmVyIGZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIHN0YXRlZF9hY2NvdW50X251bWJlcl9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZmVlIGFuZCBjb250cmlidXRpb24gZGV0YWlscyBmb3IgNDAxayBhY2NvdW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICByb2xsb3Zlcl80MDFrX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3QgZm9yIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gVGhlIG1vcmUgdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZXF1ZXN0ZWQsIHRoZSBsb25nZXIgdGhlIGhpc3RvcmljYWwgdXBkYXRlIHBvbGwgd2lsbCB0YWtlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA5MCBkYXlzLiBJbiBQcm9kdWN0aW9uLCBpZiBhIHZhbHVlIHVuZGVyIDMwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMzAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLiBPbmNlIFRyYW5zYWN0aW9ucyBoYXMgYmVlbiBhZGRlZCB0byBhbiBJdGVtLCB0aGlzIHZhbHVlIGNhbm5vdCBiZSB1cGRhdGVkLiAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlblRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBXZWJob29rIGluZGljYXRpbmcgdGhhdCB0aGUgc3RhdHVzIG9mIHRoZSBkZWxpdmVyeSBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiB0byBhIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVMSVZFUllfU1RBVFVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X21ldGFkYXRhOiBMaW5rRGVsaXZlcnlNZXRhZGF0YTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBtb3J0Z2FnZSBsb2FuIGFncmVlbWVudCBiZXR3ZWVuIG9uZSBvciBtb3JlIGJvcnJvd2VycyBhbmQgYSBtb3J0Z2FnZSBsZW5kZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogTG9hbklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBsb2FuIGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtbG9hbikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuQWNjb3VudFN1YnR5cGUge1xuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIE92ZXJkcmFmdCA9ICdvdmVyZHJhZnQnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGxvYW4gZGlzYnVyc2VtZW50IHRyYW5zYWN0aW9ucyByZWNlaXZlZCBieSB0aGUgdXNlciwgdHJhY2tpbmcgaW5jb21pbmcgZnVuZHMgZnJvbSBsb2FuIHByb3ZpZGVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbkRpc2J1cnNlbWVudHNJbmRpY2F0b3JzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkRpc2J1cnNlbWVudHNJbmRpY2F0b3JzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgdmFsdWUgb2YgaW5mbG93IHRyYW5zYWN0aW9ucyBjYXRlZ29yaXplZCBhcyBgTE9BTl9ESVNCVVJTRU1FTlRTYCwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydCB3aXRoaW4gdGhlIHJlcXVlc3RlZCB0aW1lIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlsZWQgY2F0ZWdvcmllcyB2aWV3IG9mIGFsbCB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgTE9BTl9ESVNCVVJTRU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz59XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGNhdGVnb3J5X2RldGFpbHM/OiBBcnJheTxDYXRlZ29yeUV4cGVuc2VzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9udGhseUF2ZXJhZ2V9XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIG1vbnRobHlfYXZlcmFnZT86IE1vbnRobHlBdmVyYWdlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVcCB0byAzIHRvcCBzZXJ2aWNlIHByb3ZpZGVycyB0aGF0IHRoZSB1c2VyIGhhZCB0aGUgbW9zdCB0cmFuc2FjdGlvbnMgZm9yIGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0b3RhbCBzcGVuZC4gIElmIHRoZSB1c2VyIGhhcyByZWNlaXZlZCBtb25leSBmcm9tIGFueSBwcm92aWRlciBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIHRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICB0b3BfcHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYExPQU5fRElTQlVSU0VNRU5UU2AgY3JlZGl0IGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgc3VtbWFyaWVzIG9mIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX0RJU0JVUlNFTUVOVFNgIGNhdGVnb3J5IHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PE1vbnRobHlTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbkRpc2J1cnNlbWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgbW9udGhseV9zdW1tYXJpZXM/OiBBcnJheTxNb250aGx5U3VtbWFyeT47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHRoYXQgZmFsbHMgaW50byB0aGUgYExPQU5fRElTQlVSU0VNRU5UU2AgY3JlZGl0IGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfbGFzdF9vY2N1cnJlbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdXNlclxcJ3MgbW9udGhseSBpbmZsb3dzIHRoYXQgd2FzIHJlY2VpdmVkIG9uIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYExPQU5fRElTQlVSU0VNRU5UU2AgY3JlZGl0IGNhdGVnb3J5IHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwMCBpbmRpY2F0ZXMgdGhhdCAxMDAlIG9mIHRoZSBpbmZsb3dzIHdlcmUgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgTE9BTl9ESVNCVVJTRU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnkuIElmIHRoZXJlXFwncyBubyBhdmFpbGFibGUgaW5jb21lIGZvciB0aGUgZ2l2ZW4gdGltZSBwZXJpb2QsIHRoaXMgZmllbGQgdmFsdWUgd2lsbCBiZSBgLTFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHBlcmNlbnRhZ2Vfb2ZfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbkZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5GaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBsb2FuIGJ5IHZhcmlvdXMgcGFydGllcyB0byB0aGUgdHJhbnNhY3Rpb24gb3Igb3RoZXIgb3JnYW5pemF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuSWRlbnRpZmllciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBMb2FuSWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuSWRlbnRpZmllclxuICAgICAqL1xuICAgIExvYW5JZGVudGlmaWVyVHlwZTogTG9hbklkZW50aWZpZXJUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGxvYW4gaWRlbnRpZmllci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExvYW5JZGVudGlmaWVyVHlwZSB7XG4gICAgTGVuZGVyTG9hbiA9ICdMZW5kZXJMb2FuJyxcbiAgICBVbml2ZXJzYWxMb2FuID0gJ1VuaXZlcnNhbExvYW4nXG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBpZGVudGlmaWVycyBmb3IgdGhpcyBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuSWRlbnRpZmllcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuSWRlbnRpZmllcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJzXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSOiBMb2FuSWRlbnRpZmllcjtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIG51bWJlciBvZiBsb2FuIHBheW1lbnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5QYXltZW50c0NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5QYXltZW50c0NvdW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBsb2FuIHBheW1lbnRzIG1hZGUgaW4gdGhlIDMwIGRheXMgYmVmb3JlIHRoZSBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0NvdW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYmFzZWxpbmVfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBsb2FuIHBheW1lbnRzIG1hZGUgaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0NvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogSW5zaWdodHMgaW50byBsb2FuIHBheW1lbnQgdHJhbnNhY3Rpb25zIG1hZGUgYnkgdGhlIHVzZXIsIHRyYWNraW5nIG91dGdvaW5nIHBheW1lbnRzIHRvIGxvYW4gcHJvdmlkZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuUGF5bWVudHNJbmRpY2F0b3JzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hblBheW1lbnRzSW5kaWNhdG9ycyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHZhbHVlIG9mIG91dGZsb3cgdHJhbnNhY3Rpb25zIGNhdGVnb3JpemVkIGFzIGBMT0FOX1BBWU1FTlRTYCwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydCB3aXRoaW4gdGhlIHJlcXVlc3RlZCB0aW1lIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbnRobHlBdmVyYWdlfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgbW9udGhseV9hdmVyYWdlPzogTW9udGhseUF2ZXJhZ2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERldGFpbGVkIGNhdGVnb3JpZXMgdmlldyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYExPQU5fUEFZTUVOVFNgIGNyZWRpdCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeUV4cGVuc2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGNhdGVnb3J5X2RldGFpbHM/OiBBcnJheTxDYXRlZ29yeUV4cGVuc2VzPjtcbiAgICAvKipcbiAgICAgKiBVcCB0byAzIHRvcCBzZXJ2aWNlIHByb3ZpZGVycyB0aGF0IHRoZSB1c2VyIGhhZCB0aGUgbW9zdCB0cmFuc2FjdGlvbnMgZm9yIGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0b3RhbCBzcGVuZC4gIElmIHRoZSB1c2VyIGhhcyBub3Qgc3BlbnQgbW9uZXkgb24gYW55IHByb3ZpZGVyIGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgdGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICB0b3BfcHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYExPQU5fUEFZTUVOVFNgIGNyZWRpdCBjYXRlZ29yeSwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9udGhseSBzdW1tYXJpZXMgb2YgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYExPQU5fUEFZTUVOVFNgIGNyZWRpdCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxNb250aGx5U3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBtb250aGx5X3N1bW1hcmllcz86IEFycmF5PE1vbnRobHlTdW1tYXJ5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdGhhdCBmYWxscyBpbnRvIHRoZSBgTE9BTl9QQVlNRU5UU2AgY3JlZGl0IGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2xhc3Rfb2NjdXJyZW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHVzZXJcXCdzIG1vbnRobHkgaW5mbG93cyB0aGF0IHdhcyBzcGVudCBvbiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX1BBWU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAwIGluZGljYXRlcyB0aGF0IDEwMCUgb2YgdGhlIGluZmxvd3Mgd2VyZSBzcGVudCBvbiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX1BBWU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnkuIElmIHRoZXJlXFwncyBubyBhdmFpbGFibGUgaW5jb21lIGZvciB0aGUgZ2l2ZW4gdGltZSBwZXJpb2QsIHRoaXMgZmllbGQgdmFsdWUgd2lsbCBiZSBgLTFgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHBlcmNlbnRhZ2Vfb2ZfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIG51bWJlciBvZiB1bmlxdWUgbG9hbiBwYXltZW50IG1lcmNoYW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5QYXltZW50c01lcmNoYW50Q291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXF1ZSBsb2FuIHBheW1lbnQgbWVyY2hhbnRzIGRldGVjdGVkIGluIHRoZSAzMCBkYXlzIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGRhdGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYmFzZWxpbmVfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiB1bmlxdWUgbG9hbiBwYXltZW50IG1lcmNoYW50cyBkZXRlY3RlZCBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW50X2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsb2FucyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2luZ2xlIGRlYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FufVxuICAgICAqIEBtZW1iZXJvZiBMb2Fuc1xuICAgICAqL1xuICAgIExPQU46IExvYW47XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2Ygd2hlcmUgYSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLiBMb2NhdGlvbiBkYXRhIGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRyYW5zYWN0aW9ucyBhdCBwaHlzaWNhbCBsb2NhdGlvbnMsIG5vdCBmb3Igb25saW5lIHRyYW5zYWN0aW9ucy4gTG9jYXRpb24gZGF0YSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBwcmltYXJpbHkgb24gdGhlIG1lcmNoYW50IGFuZCBpcyBtb3N0IGxpa2VseSB0byBiZSBwb3B1bGF0ZWQgZm9yIHRyYW5zYWN0aW9ucyBhdCBsYXJnZSByZXRhaWwgY2hhaW5zOyBzbWFsbCwgbG9jYWwgYnVzaW5lc3NlcyBhcmUgbGVzcyBsaWtlbHkgdG8gaGF2ZSBsb2NhdGlvbiBkYXRhIGF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbGF0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbG9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBkZWZpbmVkIHN0b3JlIG51bWJlciB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBzdG9yZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbXVsdGktZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzIHRvIHVzZSB3aXRoIHRoaXMgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1GQVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1GQSB7XG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSBgZGV2aWNlYCwgYHNlbGVjdGlvbnNgLCBvciBgcXVlc3Rpb25zYC4gIElmIHZhbHVlIGlzIGBkZXZpY2VgLCB0aGUgTUZBIGFuc3dlciBpcyBgMTIzNGAuICBJZiB2YWx1ZSBpcyBgc2VsZWN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzIGFsd2F5cyB0aGUgZmlyc3Qgb3B0aW9uLiAgSWYgdmFsdWUgaXMgYHF1ZXN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzICBgYW5zd2VyXzxpPl88aj5gIGZvciB0aGUgai10aCBxdWVzdGlvbiBpbiB0aGUgaS10aCByb3VuZCwgc3RhcnRpbmcgZnJvbSAwLiBGb3IgZXhhbXBsZSwgdGhlIGFuc3dlciB0byB0aGUgZmlyc3QgcXVlc3Rpb24gaW4gdGhlIHNlY29uZCByb3VuZCBpcyBgYW5zd2VyXzFfMGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2YgcXVlc3Rpb25zLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBxdWVzdGlvbnMgcGVyIHJvdW5kLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIElmIHZhbHVlIG9mIHR5cGUgaXMgYHNlbGVjdGlvbnNgLCBkZWZhdWx0IHZhbHVlIGlzIDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25zX3Blcl9yb3VuZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2Ygc2VsZWN0aW9ucywgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbnNgLiBEZWZhdWx0cyB0byAxLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYXZhaWxhYmxlIGFuc3dlcnMgcGVyIHF1ZXN0aW9uLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uYC4gRGVmYXVsdHMgdG8gMi4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uc19wZXJfcXVlc3Rpb246IG51bWJlcjtcbn1cbi8qKlxuICogU3VtbWFyeSBvYmplY3QgcmVmbGVjdGluZyB0aGUgbWF0Y2ggcmVzdWx0IG9mIHRoZSBhc3NvY2lhdGVkIGRhdGFcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgTWF0Y2hTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGEgdXNlclxcJ3MgdG9wIG1lcmNoYW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lcmNoYW50SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBpZCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIG1lcmNoYW50IG9mIHRoaXMgdHlwZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ByaW1hcnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGFpbGVkIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfZGV0YWlsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogQWxsb3dzIHNwZWNpZnlpbmcgdGhlIG1ldGFkYXRhIG9mIHRoZSB0ZXN0IGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIGxpbWl0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG1hc2suIFNob3VsZCBiZSBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmcgb2YgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBUaGlzIGFsbG93cyB5b3UgdG8gbW9kZWwgYSBtYXNrIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NvdW50IG51bWJlciAoc3VjaCBhcyB3aXRoIGEgdmlydHVhbCBhY2NvdW50IG51bWJlcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSByZWFzb24geW91IGFyZSBnZW5lcmF0aW5nIGEgQ29uc3VtZXIgUmVwb3J0IGZvciB0aGlzIHVzZXIuICBgQUNDT1VOVF9SRVZJRVdfQ1JFRElUYDogSW4gY29ubmVjdGlvbiB3aXRoIGEgY29uc3VtZXIgY3JlZGl0IHRyYW5zYWN0aW9uIGZvciB0aGUgcmV2aWV3IG9yIGNvbGxlY3Rpb24gb2YgYW4gYWNjb3VudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEEpLiAgYFdSSVRURU5fSU5TVFJVQ1RJT05fT1RIRVJgOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCBzdWNoIGFzIHdoZW4gYW4gaW5kaXZpZHVhbCBhZ3JlZXMgdG8gYWN0IGFzIGEgZ3VhcmFudG9yIG9yIGFzc3VtZXMgcGVyc29uYWwgbGlhYmlsaXR5IGZvciBhIGNvbnN1bWVyLCBidXNpbmVzcywgb3IgY29tbWVyY2lhbCBsb2FuLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTW9uaXRvcmluZ0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlIHtcbiAgICBBY2NvdW50UmV2aWV3Q3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX0NSRURJVCcsXG4gICAgV3JpdHRlbkluc3RydWN0aW9uT3RoZXIgPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBpbmNvbWUgc3ViY2F0ZWdvcnkgb2YgdGhlIHJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5jb21lSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfbW9udGhseV9pbmNvbWU6IFRvdGFsTW9udGhseUluY29tZUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVTb3VyY2VzQ291bnRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudHM6IEluY29tZVNvdXJjZXNDb3VudHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZvcmVjYXN0ZWRNb250aGx5SW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBmb3JlY2FzdGVkX21vbnRobHlfaW5jb21lOiBGb3JlY2FzdGVkTW9udGhseUluY29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlzdG9yaWNhbEFubnVhbEluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hbm51YWxfaW5jb21lOiBIaXN0b3JpY2FsQW5udWFsSW5jb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge0FycmF5PE1vbml0b3JpbmdJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlczogQXJyYXk8TW9uaXRvcmluZ0luY29tZVNvdXJjZT47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW5jb21lIHNvdXJjZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIG5hbWUgb3Igb3JpZ2luYWwgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGluY29tZSB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeTogQ3JlZGl0QmFua0luY29tZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IGRldGVjdGVkIHRyYW5zYWN0aW9uIGRhdGUgZm9yIHRoaXMgaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBsYXN0X3RyYW5zYWN0aW9uX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgTW9uaXRvcmluZyBJbnNpZ2h0cyBmb3IgdGhlIGdpdmVuIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luY29tZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWU6IE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0xvYW5JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzXG4gICAgICovXG4gICAgbG9hbnM6IE1vbml0b3JpbmdMb2FuSW5zaWdodHM7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIE1vbml0b3JpbmcgSW5zaWdodHMgSXRlbVxcJ3Mgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNJdGVtU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJdGVtU3RhdHVzQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHN0YXR1c19jb2RlOiBNb25pdG9yaW5nSXRlbVN0YXR1c0NvZGU7XG4gICAgLyoqXG4gICAgICogQSByZWFzb24gZm9yIHdoeSBhIE1vbml0b3JpbmcgSW5zaWdodHMgUmVwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIHBvcHVsYXRlZCB3aGVuIHRoZSBgc3RhdHVzX2NvZGVgIGlzIG5vdCBgQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICByZWFzb24/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFbnVtIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBpbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzIHtcbiAgICBBdmFpbGFibGUgPSAnQVZBSUxBQkxFJyxcbiAgICBGYWlsZWQgPSAnRkFJTEVEJ1xufVxuXG4vKipcbiAqIEVudW0gZm9yIHRoZSBzdGF0dXMgb2YgdGhlIEl0ZW1cXCdzIGluc2lnaHRzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBNb25pdG9yaW5nSXRlbVN0YXR1c0NvZGUge1xuICAgIEF2YWlsYWJsZSA9ICdBVkFJTEFCTEUnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnLFxuICAgIFBlbmRpbmcgPSAnUEVORElORydcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2FuIGV4cG9zdXJlIHN1YmNhdGVnb3J5IG9mIHRoZSByZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0xvYW5JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdMb2FuSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuUGF5bWVudHNDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdMb2FuSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuX3BheW1lbnRzX2NvdW50czogTG9hblBheW1lbnRzQ291bnRzO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbG9hbiBkaXNidXJzZW1lbnRzIGRldGVjdGVkIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gICAgICovXG4gICAgbG9hbl9kaXNidXJzZW1lbnRzX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5QYXltZW50c01lcmNoYW50Q291bnRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gICAgICovXG4gICAgbG9hbl9wYXltZW50X21lcmNoYW50c19jb3VudHM6IExvYW5QYXltZW50c01lcmNoYW50Q291bnRzO1xufVxuLyoqXG4gKiBUaGUgbW9udGhseSBhdmVyYWdlIGFtb3VudCBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZSB0b3RhbCBieSB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBpbiB0aGUgdGltZSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbnRobHlBdmVyYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9udGhseUF2ZXJhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBtb250aGx5IGF2ZXJhZ2UgYW1vdW50IG9mIGFsbCB0aGUgYWdncmVnYXRlZCB0cmFuc2FjdGlvbnMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBmb3IgdGhlIGdpdmVuIHRpbWUgd2luZG93LiAgVGhlIGF2ZXJhZ2UgaXMgY2FsY3VsYXRlZCBieSBkaXZpZGluZyB0aGUgdG90YWwgYW1vdW50IG9mIHRoZSB0cmFuc2FjdGlvbnMgYnkgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vbnRobHlBdmVyYWdlXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9udGhseUF2ZXJhZ2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbnRobHlBdmVyYWdlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogTW9udGhseSBzdW1tYXJ5IG9mIHRyYW5zYWN0aW9ucyB3aXRoaW4gYSBzcGVjaWZpYyB0aW1lIHBlcmlvZCwgc2hvd2luZyBhZ2dyZWdhdGVkIGFtb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbnRobHlTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9udGhseVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBtb250aCBmb3IgdGhlIGdpdmVuIHJlcG9ydCB0aW1lIHdpbmRvdy4gV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBtb250aCBmb3IgdGhlIGdpdmVuIHJlcG9ydCB0aW1lIHdpbmRvdy4gV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogQW1vdW50V2l0aEN1cnJlbmN5IHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGludGVyZXN0IHJhdGUgZm9yIHRoZSBtb3J0Z2FnZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZSB7XG4gICAgLyoqXG4gICAgICogUGVyY2VudGFnZSB2YWx1ZSAoaW50ZXJlc3QgcmF0ZSBvZiBjdXJyZW50IG1vcnRnYWdlLCBub3QgQVBSKSBvZiBpbnRlcmVzdCBwYXlhYmxlIG9uIGEgbG9hbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICAgICAqL1xuICAgIHBlcmNlbnRhZ2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgaW50ZXJlc3QgY2hhcmdlZCAoZml4ZWQgb3IgdmFyaWFibGUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIG1vcnRnYWdlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHkge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCB0aGF0IHRoaXMgbGlhYmlsaXR5IGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBsb2FuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgb3V0c3RhbmRpbmcgYW1vdW50IGNoYXJnZWQgZm9yIGxhdGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGN1cnJlbnRfbGF0ZV9mZWU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IGhlbGQgaW4gZXNjcm93IHRvIHBheSB0YXhlcyBhbmQgaW5zdXJhbmNlIG9uIGJlaGFsZiBvZiB0aGUgYm9ycm93ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBlc2Nyb3dfYmFsYW5jZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9ycm93ZXIgaGFzIHByaXZhdGUgbW9ydGdhZ2UgaW5zdXJhbmNlIGluIGVmZmVjdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBoYXNfcG1pOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9ycm93ZXIgd2lsbCBwYXkgYSBwZW5hbHR5IGZvciBlYXJseSBwYXlvZmYgb2YgbW9ydGdhZ2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaGFzX3ByZXBheW1lbnRfcGVuYWx0eTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vcnRnYWdlSW50ZXJlc3RSYXRlfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGludGVyZXN0X3JhdGU6IE1vcnRnYWdlSW50ZXJlc3RSYXRlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxhc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3QgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBsb2FuLCBmb3IgZXhhbXBsZSBgY29udmVudGlvbmFsYCwgYGZpeGVkYCwgb3IgYHZhcmlhYmxlYC4gVGhpcyBmaWVsZCBpcyBwcm92aWRlZCBkaXJlY3RseSBmcm9tIHRoZSBsb2FuIHNlcnZpY2VyIGFuZCBkb2VzIG5vdCBoYXZlIGFuIGVudW1lcmF0ZWQgc2V0IG9mIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxvYW5fdHlwZV9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGdWxsIGR1cmF0aW9uIG9mIG1vcnRnYWdlIGFzIGF0IG9yaWdpbmF0aW9uIChlLmcuIGAxMCB5ZWFyYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsb2FuX3Rlcm06IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3JpZ2luYWwgZGF0ZSBvbiB3aGljaCBtb3J0Z2FnZSBpcyBkdWUgaW4gZnVsbC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtYXR1cml0eV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIG5leHQgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfbW9udGhseV9wYXltZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHByaW5jaXBhbCBiYWxhbmNlIG9mIHRoZSBtb3J0Z2FnZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX3ByaW5jaXBhbF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGxvYW4gKHByaW5jaXBhbCArIGludGVyZXN0KSBwYXN0IGR1ZSBmb3IgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHBhc3RfZHVlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgcHJvcGVydHlfYWRkcmVzczogTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBpbnRlcmVzdCBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFlURCBwcmluY2lwYWwgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHl0ZF9wcmluY2lwYWxfcGFpZDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZmllbGRzIGRlc2NyaWJpbmcgcHJvcGVydHkgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXZlIG9yIG5pbmUgZGlnaXQgcG9zdGFsIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIChleGFtcGxlIFxcXCJOQ1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIChleGFtcGxlIFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFwdCAxNVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNldCBvZiB1cGxvYWRlZCBkb2N1bWVudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGF0dHJpYnV0ZXMgdGhhdCBjb3VsZCBpbmRpY2F0ZSBpZiBhIGRvY3VtZW50IGlzIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8Umlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBkb2N1bWVudF9yZWZlcmVuY2VzOiBBcnJheTxSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBzZXQgb2YgZG9jdW1lbnRzXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcmlza19zaWduYWxzOiBBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBuYW1lIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgbmFtZSBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmFtZU1hdGNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYW1lTWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogTWF0Y2ggc2NvcmUgZm9yIG5hbWUuIDEwMCBpcyBhIHBlcmZlY3Qgc2NvcmUsIDk5LTg1IG1lYW5zIGEgc3Ryb25nIG1hdGNoLCA4NC03MCBpcyBhIHBhcnRpYWwgbWF0Y2gsIGFueSBzY29yZSBsZXNzIHRoYW4gNzAgaXMgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBuYW1lIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBmaXJzdCBvciBsYXN0IG5hbWUgY29tcGxldGVseSBtYXRjaGVkLCBsaWtlbHkgYSBmYW1pbHkgbWVtYmVyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfZmlyc3RfbmFtZV9vcl9sYXN0X25hbWVfbWF0Y2g/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBuaWNrbmFtZSBtYXRjaGVkLCBleGFtcGxlIEplbm5pZmVyIGFuZCBKZW5uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX25pY2tuYW1lX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSXMgYHRydWVgIGlmIHRoZSBuYW1lIG9uIGVpdGhlciBvZiB0aGUgbmFtZXMgdGhhdCB3YXMgbWF0Y2hlZCBmb3IgdGhlIHNjb3JlIGNvbnRhaW5lZCBzdHJpbmdzIGluZGljYXRpdmUgb2YgYSBidXNpbmVzcyBuYW1lLCBzdWNoIGFzIFxcXCJDT1JQXFxcIiwgXFxcIkxMQ1xcXCIsIFxcXCJJTkNcXFwiLCBvciBcXFwiTFREXFxcIi4gQSBgdHJ1ZWAgcmVzdWx0IGdlbmVyYWxseSBpbmRpY2F0ZXMgdGhhdCBhbiBhY2NvdW50XFwncyBuYW1lIGlzIGEgYnVzaW5lc3MgbmFtZS4gSG93ZXZlciwgYSBgZmFsc2VgIHJlc3VsdCBkb2VzIG5vdCBtZWFuIHRoZSBhY2NvdW50IG5hbWUgaXMgbm90IGEgYnVzaW5lc3MgbmFtZSwgYXMgc29tZSBidXNpbmVzc2VzIGRvIG5vdCB1c2UgdGhlc2Ugc3RyaW5ncyBpbiB0aGUgbmFtZXMgdXNlZCBmb3IgdGhlaXIgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX2J1c2luZXNzX25hbWVfZGV0ZWN0ZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zaWdodHMgaW50byBuZWdhdGl2ZSBiYWxhbmNlIG9jY3VycmVuY2VzLCBpbmNsdWRpbmcgZnJlcXVlbmN5LCBkdXJhdGlvbiwgYW5kIG1pbmltdW0gYmFsYW5jZSBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZWdhdGl2ZUJhbGFuY2VJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5lZ2F0aXZlQmFsYW5jZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdGhhdCBjYXVzZWQgYW55IGFjY291bnQgaW4gdGhlIHJlcG9ydCB0byBoYXZlIGEgbmVnYXRpdmUgYmFsYW5jZS4gIFRoaXMgdmFsdWUgaXMgaW5jbHVzaXZlIG9mIHRoZSBkYXRlIG9mIHRoZSBsYXN0IG5lZ2F0aXZlIGJhbGFuY2UsIG1lYW5pbmcgdGhhdCBpZiB0aGUgbGFzdCBuZWdhdGl2ZSBiYWxhbmNlIG9jY3VycmVkIHRvZGF5LCB0aGlzIHZhbHVlIHdpbGwgYmUgYDBgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5lZ2F0aXZlQmFsYW5jZUluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9sYXN0X29jY3VycmVuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYWdncmVnYXRlZCBkYXlzIHRoYXQgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQgaGFzIGhhZCBhIG5lZ2F0aXZlIGJhbGFuY2Ugd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZWdhdGl2ZUJhbGFuY2VJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QW1vdW50V2l0aEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBOZWdhdGl2ZUJhbGFuY2VJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1pbmltdW1fYmFsYW5jZT86IEFtb3VudFdpdGhDdXJyZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN1bW1hcnkgb2YgdGhlIG5lZ2F0aXZlIGJhbGFuY2Ugb2NjdXJyZW5jZXMgZm9yIHRoaXMgYWNjb3VudC4gIElmIHRoZSB1c2VyIGhhcyBub3QgaGFkIGEgbmVnYXRpdmUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIHRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxOZWdhdGl2ZUJhbGFuY2VPY2N1cnJlbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTmVnYXRpdmVCYWxhbmNlSW5zaWdodHNcbiAgICAgKi9cbiAgICBvY2N1cnJlbmNlcz86IEFycmF5PE5lZ2F0aXZlQmFsYW5jZU9jY3VycmVuY2U+O1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGEgc3BlY2lmaWMgb2NjdXJyZW5jZSBvZiBhIG5lZ2F0aXZlIGJhbGFuY2UgcGVyaW9kLCBpbmNsdWRpbmcgc3RhcnQgYW5kIGVuZCBkYXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmVnYXRpdmVCYWxhbmNlT2NjdXJyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5lZ2F0aXZlQmFsYW5jZU9jY3VycmVuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiB0aGF0IGNhdXNlZCB0aGUgYWNjb3VudCB0byBoYXZlIGEgbmVnYXRpdmUgYmFsYW5jZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5lZ2F0aXZlQmFsYW5jZU9jY3VycmVuY2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0aGF0IGNhdXNlZCB0aGUgYWNjb3VudCB0byBoYXZlIGEgbmVnYXRpdmUgYmFsYW5jZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLiBUaGlzIGRhdGUgaXMgaW5jbHVzaXZlLCBtZWFuaW5nIHRoYXQgdGhpcyB3YXMgdGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSBhY2NvdW50IGhhZCBhIG5lZ2F0aXZlIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmVnYXRpdmVCYWxhbmNlT2NjdXJyZW5jZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QW1vdW50V2l0aEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBOZWdhdGl2ZUJhbGFuY2VPY2N1cnJlbmNlXG4gICAgICovXG4gICAgbWluaW11bV9iYWxhbmNlPzogQW1vdW50V2l0aEN1cnJlbmN5IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldFBheSB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgbmV0IHBheSBmb3IgdGhlIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsPzogVG90YWw7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIE5ldHdvcmsgSW5zaWdodHMuIFJlcXVpcmVkIGlmIHVzaW5nIE5ldHdvcmsgSW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrSW5zaWdodHNWZXJzaW9uIHtcbiAgICBOaTEgPSAnTkkxJ1xufVxuXG4vKipcbiAqIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL25ldHdvcmsvc3RhdHVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IE5ldHdvcmtTdGF0dXNHZXRVc2VyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiBhIHRlbXBsYXRlIGRlZmluZWQgaW4gUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGZpZWxkIGlzIHVzZWQgaWYgeW91IGhhdmUgYWRkaXRpb25hbCBjcml0ZXJpYSB0aGF0IHlvdSB3YW50IHRvIGNoZWNrIGFnYWluc3QgKGUuZy4gTGF5ZXIgZWxpZ2liaWxpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbmV0d29yay9zdGF0dXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXR3b3JrX3N0YXR1czogTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTmV0d29ya1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxheWVyPzogTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgTGF5ZXItcmVsYXRlZCBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZUxheWVyIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgTGF5ZXIgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXJcbiAgICAgKi9cbiAgICBlbGlnaWJsZTogYm9vbGVhbjtcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIG92ZXJhbGwgbmV0d29yayBzdGF0dXMgb2YgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFJldHVybmluZ1VzZXIgPSAnUkVUVVJOSU5HX1VTRVInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyIGZvciB0aGUgbmV0d29yayBzdGF0dXMgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIgaW4gW0UuMTY0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FLjE2NCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gUGxhaWQgZGV0ZWN0cyBhIG5ldyBhY2NvdW50LiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIHlvdSBjYW4gcHJvbXB0IHlvdXIgdXNlcnMgdG8gc2hhcmUgbmV3IGFjY291bnRzIHdpdGggeW91IHRocm91Z2ggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvI3VzaW5nLXVwZGF0ZS1tb2RlLXRvLXJlcXVlc3QtbmV3LWFjY291bnRzKSAoVVMvQ0Egb25seSkuIElmIHRoZSBlbmQgdXNlciBoYXMgb3B0ZWQgbm90IHRvIHNoYXJlIG5ldyBhY2NvdW50cyB3aXRoIFBsYWlkIHZpYSB0aGVpciBpbnN0aXR1dGlvblxcJ3MgT0F1dGggc2V0dGluZ3MsIFBsYWlkIHdpbGwgbm90IGRldGVjdCBuZXcgYWNjb3VudHMgYW5kIHRoaXMgd2ViaG9vayB3aWxsIG5vdCBmaXJlLiBGb3IgZW5kIHVzZXIgYWNjb3VudHMgaW4gdGhlIEVVIGFuZCBVSywgdXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCB5b3UgY2FuIHByb21wdCB5b3VyIHVzZXIgdG8gcmUtbGluayB0aGVpciBhY2NvdW50IGFuZCB0aGVuIGRlbGV0ZSB0aGUgb2xkIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpZXIgbnVtYmVyIGRhdGEgdXNlZCB0byBjb25maWd1cmUgdGhlIHRlc3QgYWNjb3VudC4gQWxsIHZhbHVlcyBhcmUgb3B0aW9uYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBXaWxsIGJlIHVzZWQgZm9yIHRoZSBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJvdXRpbmcgbnVtYmVyLiBUbyB0ZXN0IGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAsIHNldCB0aGlzIHRvIDMyMjI3MTYyNyB0byBmb3JjZSBhIGB0cnVlYCByZXN1bHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2hfd2lyZV9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgZWZ0X2JyYW5jaGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9pbnN0aXR1dGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFRlQgYnJhbmNoIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfaW5zdGl0dXRpb25gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnRfYnJhbmNoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSAoQklDKS4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBpbnRlcm5hdGlvbmFsX2liYW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2JpYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLiBJZiBubyBhY2NvdW50IG51bWJlciBpcyBzcGVjaWZpZWQgdmlhIGBhY2NvdW50YCwgd2lsbCBhbHNvIGJlIHVzZWQgYXMgdGhlIGFjY291bnQgbnVtYmVyIGJ5IGRlZmF1bHQuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9iaWNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2liYW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQmFjcyBzb3J0IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYmFjc19zb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudCB2aWEgQUNBVFMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0FUU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0FUUyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNBVFNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXJzIGZvciB0aGUgY2xlYXJpbmdob3VzZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGluIG9yZGVyIG9mIHJlbGV2YW5jZS4gSWYgdGhpcyBhcnJheSBpcyBlbXB0eSwgY2FsbCBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIHdpdGggdGhlIGBpdGVtLmluc3RpdHV0aW9uX2lkYCB0byBnZXQgdGhlIERUQyBudW1iZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGR0Y19udW1iZXJzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0gge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIEF0IGNlcnRhaW4gaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgQ2hhc2UsIFBOQywgYW5kIFVTIEJhbmssIHlvdSB3aWxsIHJlY2VpdmUgXFxcInRva2VuaXplZFxcXCIgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXJzLCB3aGljaCBhcmUgbm90IHRoZSB1c2VyXFwncyBhY3R1YWwgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLiBGb3IgaW1wb3J0YW50IGRldGFpbHMgb24gaG93IHRoaXMgbWF5IGltcGFjdCB5b3VyIGludGVncmF0aW9uIGFuZCBvbiBob3cgdG8gYXZvaWQgZnJhdWQsIHVzZXIgY29uZnVzaW9uLCBhbmQgQUNIIHJldHVybnMsIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IG51bWJlciBpcyB0b2tlbml6ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBGb3IgaW1wb3J0YW50IGRldGFpbHMgb24gaG93IHRva2VuaXplZCBhY2NvdW50IG51bWJlcnMgbWF5IGltcGFjdCB5b3VyIGludGVncmF0aW9uLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBpc190b2tlbml6ZWRfYWNjb3VudF9udW1iZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpZiB0aGUgaW5zdGl0dXRpb24gaXMga25vd24gdG8gdXNlIGEgc2VwYXJhdGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci4gTWFueSBpbnN0aXR1dGlvbnMgZG8gbm90IGhhdmUgYSBzZXBhcmF0ZSB3aXJlIHJvdXRpbmcgbnVtYmVyIGFuZCB1c2UgdGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3Igd2lyZXMgaW5zdGVhZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gaGF2ZSB0aGUgZW5kIHVzZXIgbWFudWFsbHkgY29uZmlybSB0aGVpciB3aXJlIHJvdXRpbmcgbnVtYmVyIGJlZm9yZSBzZW5kaW5nIGFueSB3aXJlcyB0byB0aGVpciBhY2NvdW50LCBlc3BlY2lhbGx5IGlmIHRoaXMgZmllbGQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIGludG8gdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9pbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBvdXQgb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9vdXQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVVMgYWNjb3VudCB2aWEgQUNIIG9yIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0hOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0hOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnQuICBBdCBjZXJ0YWluIGluc3RpdHV0aW9ucywgaW5jbHVkaW5nIENoYXNlLCBQTkMsIGFuZCBVUyBCYW5rLCB5b3Ugd2lsbCByZWNlaXZlIFxcXCJ0b2tlbml6ZWRcXFwiIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVycywgd2hpY2ggYXJlIG5vdCB0aGUgdXNlclxcJ3MgYWN0dWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0aGlzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiBhbmQgb24gaG93IHRvIGF2b2lkIGZyYXVkLCB1c2VyIGNvbmZ1c2lvbiwgYW5kIEFDSCByZXR1cm5zLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IG51bWJlciBpcyB0b2tlbml6ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBGb3IgaW1wb3J0YW50IGRldGFpbHMgb24gaG93IHRva2VuaXplZCBhY2NvdW50IG51bWJlcnMgbWF5IGltcGFjdCB5b3VyIGludGVncmF0aW9uLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGlzX3Rva2VuaXplZF9hY2NvdW50X251bWJlcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIFRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHJvdXRpbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaWYgdGhlIGluc3RpdHV0aW9uIGlzIGtub3duIHRvIHVzZSBhIHNlcGFyYXRlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIE1hbnkgaW5zdGl0dXRpb25zIGRvIG5vdCBoYXZlIGEgc2VwYXJhdGUgd2lyZSByb3V0aW5nIG51bWJlciBhbmQgdXNlIHRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHdpcmVzIGluc3RlYWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGhhdmUgdGhlIGVuZCB1c2VyIG1hbnVhbGx5IGNvbmZpcm0gdGhlaXIgd2lyZSByb3V0aW5nIG51bWJlciBiZWZvcmUgc2VuZGluZyBhbnkgd2lyZXMgdG8gdGhlaXIgYWNjb3VudCwgZXNwZWNpYWxseSBpZiB0aGlzIGZpZWxkIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIGludG8gdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfb3V0PzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudCB2aWEgQVRPTi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FUT05cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQVRPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCYWNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYWNzIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYWNzIHNvcnQgY29kZSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVSyBiYW5rIGFjY291bnQgdmlhIEJhY3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhY3MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFjcyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBDYW5hZGlhbiBiYW5rIGFjY291bnQgdmlhIEVGVC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0VGVFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBicmFuY2g6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGJyYW5jaCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSUJBTk51bGxhYmxlIHtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCdXNpbmVzcyBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBudW1iZXJzIHVzaW5nIHRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgYW5kIEJJQy9TV0lGVCBjb2RlIGZvcm1hdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQnVzaW5lc3MgSWRlbnRpZmllciBDb2RlLCBhbHNvIGtub3duIGFzIFNXSUZUIGNvZGUsIGZvciB0aGlzIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSAoQklDKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgZnJvbSBhIDQwMWsgYWNjb3VudCB0byBhbm90aGVyIDQwMWsgYWNjb3VudCBvciBJUkEgdmlhIHRoZSBtYW51YWwgNDAxayByb2xsb3ZlciBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzUmV0aXJlbWVudDQwMWtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzUmV0aXJlbWVudDQwMWsge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1JldGlyZW1lbnQ0MDFrXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGFuIG51bWJlciBmb3IgdGhlIGVtcGxveWVyXFwncyA0MDFrIHJldGlyZW1lbnQgcGxhblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNSZXRpcmVtZW50NDAxa1xuICAgICAqL1xuICAgIHBsYW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1JldGlyZW1lbnQ0MDFrXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbn1cbi8qKlxuICogT0F1dGggZXJyb3IgY29kZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT0F1dGhFcnJvckNvZGUge1xuICAgIEludmFsaWRSZXF1ZXN0ID0gJ2ludmFsaWRfcmVxdWVzdCcsXG4gICAgSW52YWxpZENsaWVudCA9ICdpbnZhbGlkX2NsaWVudCcsXG4gICAgSW52YWxpZEdyYW50ID0gJ2ludmFsaWRfZ3JhbnQnLFxuICAgIFVuYXV0aG9yaXplZENsaWVudCA9ICd1bmF1dGhvcml6ZWRfY2xpZW50JyxcbiAgICBJbnZhbGlkU2NvcGUgPSAnaW52YWxpZF9zY29wZScsXG4gICAgVW5zdXBwb3J0ZWRHcmFudFR5cGUgPSAndW5zdXBwb3J0ZWRfZ3JhbnRfdHlwZSdcbn1cblxuLyoqXG4gKiBPQXV0aCBlcnJvciByZXNwb25zZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPQXV0aEVycm9yUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPQXV0aEVycm9yUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPQXV0aEVycm9yQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhFcnJvclJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBPQXV0aEVycm9yQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoRXJyb3JSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJJIGlkZW50aWZ5aW5nIHRoZSBzcGVjaWZpYyBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoRXJyb3JSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yX3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhFcnJvclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBPQXV0aCBncmFudCBiZWluZyByZXF1ZXN0ZWQ6ICBgY2xpZW50X2NyZWRlbnRpYWxzYCBhbGxvd3MgZXhjaGFuZ2luZyBhIGNsaWVudCBpZCBhbmQgY2xpZW50IHNlY3JldCBmb3IgYSByZWZyZXNoIGFuZCBhY2Nlc3MgdG9rZW4uIGByZWZyZXNoX3Rva2VuYCBhbGxvd3MgcmVmcmVzaGluZyBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYSByZWZyZXNoIHRva2VuLiBXaGVuIHVzaW5nIHRoaXMgZ3JhbnQgdHlwZSwgb25seSB0aGUgYHJlZnJlc2hfdG9rZW5gIGZpZWxkIGlzIHJlcXVpcmVkIChhbG9uZyB3aXRoIHRoZSBgY2xpZW50X2lkYCBhbmQgYGNsaWVudF9zZWNyZXRgKS4gYHVybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOnRva2VuLWV4Y2hhbmdlYCBhbGxvd3MgZXhjaGFuZ2luZyBhIHN1YmplY3QgdG9rZW4gZm9yIGFuIE9BdXRoIHRva2VuLiBXaGVuIHVzaW5nIHRoaXMgZ3JhbnQgdHlwZSwgdGhlIGBhdWRpZW5jZWAsIGBzdWJqZWN0X3Rva2VuYCBhbmQgYHN1YmplY3RfdG9rZW5fdHlwZWAgZmllbGRzIGFyZSByZXF1aXJlZC4gVGhlc2UgZ3JhbnRzIGFyZSBkZWZpbmVkIGluIHRoZWlyIHJlc3BlY3RpdmUgUkZDcy4gYHJlZnJlc2hfdG9rZW5gIGFuZCBgY2xpZW50X2NyZWRlbnRpYWxzYCBhcmUgZGVmaW5lZCBpbiBSRkMgNjc0OSBhbmQgYHVybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOnRva2VuLWV4Y2hhbmdlYCBpcyBkZWZpbmVkIGluIFJGQyA4NjkzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT0F1dGhHcmFudFR5cGUge1xuICAgIFJlZnJlc2hUb2tlbiA9ICdyZWZyZXNoX3Rva2VuJyxcbiAgICBVcm5pZXRmcGFyYW1zb2F1dGhncmFudFR5cGV0b2tlbkV4Y2hhbmdlID0gJ3VybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOnRva2VuLWV4Y2hhbmdlJyxcbiAgICBDbGllbnRDcmVkZW50aWFscyA9ICdjbGllbnRfY3JlZGVudGlhbHMnXG59XG5cbi8qKlxuICogT0F1dGggdG9rZW4gaW50cm9zcGVjdCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhJbnRyb3NwZWN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQW4gT0F1dGggdG9rZW4gb2YgYW55IHR5cGUgKGByZWZyZXNoX3Rva2VuYCwgYGFjY2Vzc190b2tlbmAsIGV0YylcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5IGFzIGVpdGhlciBgc2VjcmV0YCBvciBgY2xpZW50X3NlY3JldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhJbnRyb3NwZWN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkgYXMgZWl0aGVyIGBzZWNyZXRgIG9yIGBjbGllbnRfc2VjcmV0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBPQXV0aCB0b2tlbiBpbnRyb3NwZWN0IHJlc3BvbnNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhJbnRyb3NwZWN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gaW5kaWNhdG9yIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBwcmVzZW50ZWQgdG9rZW4gaXMgY3VycmVudGx5IGFjdGl2ZS4gQSBgdHJ1ZWAgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIHRva2VuIGhhcyBiZWVuIGlzc3VlZCwgaGFzIG5vdCBiZWVuIHJldm9rZWQsIGFuZCBpcyB3aXRoaW4gdGhlIHRpbWUgd2luZG93IG9mIHZhbGlkaXR5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBzY29wZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9rZW4sIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGluIFtodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY3NDkjc2VjdGlvbi0zLjNdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjc0OSNzZWN0aW9uLTMuMykuIEN1cnJlbnRseSBhY2NlcHRlZCB2YWx1ZXMgYXJlOiAgYHVzZXI6cmVhZGAgYWxsb3dzIHJlYWRpbmcgdXNlciBkYXRhLiBgdXNlcjp3cml0ZWAgYWxsb3dzIHdyaXRpbmcgdXNlciBkYXRhLiBgZXhjaGFuZ2VgIGFsbG93cyBleGNoYW5naW5nIGEgdG9rZW4gdXNpbmcgdGhlIGB1cm46cGxhaWQ6cGFyYW1zOm9hdXRoOnVzZXItdG9rZW5gIGdyYW50IHR5cGUuIGBtY3A6ZGFzaGJvYXJkYCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBNQ1AgZGFzaGJvYXJkIHNlcnZlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3BlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4cGlyYXRpb24gdGltZSBhcyBVTklYIHRpbWVzdGFtcCBzaW5jZSBKYW51YXJ5IDEgMTk3MCBVVENcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJc3N1ZWQgYXQgdGltZSBhcyBVTklYIHRpbWVzdGFtcCBzaW5jZSBKYW51YXJ5IDEgMTk3MCBVVENcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIGlhdD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdWJqZWN0IG9mIHRoZSB0b2tlblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgc3ViPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEF1ZGllbmNlIG9mIHRoZSB0b2tlblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElzc3VlciBvZiB0aGUgdG9rZW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIGlzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSB0b2tlblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgdG9rZW5fdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVc2VyIElEIG9mIHRoZSB0b2tlblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhJbnRyb3NwZWN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9BdXRoIHRva2VuIHJldm9rZSByZXF1ZXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE9BdXRoUmV2b2tlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoUmV2b2tlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQW4gT0F1dGggdG9rZW4gb2YgYW55IHR5cGUgKGByZWZyZXNoX3Rva2VuYCwgYGFjY2Vzc190b2tlbmAsIGV0YylcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoUmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keSBhcyBlaXRoZXIgYHNlY3JldGAgb3IgYGNsaWVudF9zZWNyZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoUmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkgYXMgZWl0aGVyIGBzZWNyZXRgIG9yIGBjbGllbnRfc2VjcmV0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN1Y2Nlc3NmdWwgT0F1dGggdG9rZW4gcmV2b2tlIHJlc3BvbnNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE9BdXRoUmV2b2tlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPQXV0aFJldm9rZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhSZXZva2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdGhlIHN1YmplY3QgdG9rZW4uIGB1cm46cGxhaWQ6cGFyYW1zOnRva2Vuczp1c2VyYCBhbGxvd3MgZXhjaGFuZ2luZyBhIFBsYWlkLWlzc3VlZCB1c2VyIHRva2VuIGZvciBhbiBPQXV0aCB0b2tlbi4gV2hlbiB1c2luZyB0aGlzIHRva2VuIHR5cGUsIGBhdWRpZW5jZWAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF9pZGAuIGBzdWJqZWN0X3Rva2VuYCBtdXN0IGJlIGEgUGxhaWQtaXNzdWVkIHVzZXIgdG9rZW4gaXNzdWVkIGZyb20gdGhlIGAvdXNlci9jcmVhdGVgIGVuZHBvaW50LiBgdXJuOnBsYWlkOnBhcmFtczpvYXV0aDp1c2VyLXRva2VuYCBhbGxvd3MgZXhjaGFuZ2luZyBhIHJlZnJlc2ggdG9rZW4gZm9yIGFuIE9BdXRoIHRva2VuIHRvIGFub3RoZXIgYGNsaWVudF9pZGAuIFRoZSBvdGhlciBgY2xpZW50X2lkYCBpcyBwcm92aWRlZCBpbiBgYXVkaWVuY2VgLiBgc3ViamVjdF90b2tlbmAgbXVzdCBiZSBhbiBPQXV0aCByZWZyZXNoIHRva2VuIGlzc3VlZCBmcm9tIHRoZSBgL29hdXRoL3Rva2VuYCBlbmRwb2ludC4gYHVybjpwbGFpZDpwYXJhbXM6Y3JlZGl0Om11bHRpLXVzZXJgIGFsbG93cyBleGNoYW5naW5nIGEgUGxhaWQtaXNzdWVkIHVzZXIgdG9rZW4gZm9yIGFuIE9BdXRoIHRva2VuLiBXaGVuIHVzaW5nIHRoaXMgdG9rZW4gdHlwZSwgYGF1ZGllbmNlYCBtYXkgYmUgYSBjbGllbnQgaWQgb3IgYSBzdXBwb3J0ZWQgQ1JBIHBhcnRuZXIgVVJOLiBgYXVkaWVuY2VgIHN1cHBvcnRzIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgY2xpZW50cy4gV2hlbiBtdWx0aXBsZSBjbGllbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGBhdWRpZW5jZWAgYSBtdWx0aS1wYXJ0eSB0b2tlbiBpcyBjcmVhdGVkIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGFsbCBwYXJ0aWVzIGluIHRoZSBhdWRpZW5jZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZWlyIGBjbGllbnRfaWRgIGFuZCBgY2xpZW50X3NlY3JldGAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPQXV0aFN1YmplY3RUb2tlblR5cGUge1xuICAgIFRva2Vuc3VzZXIgPSAndXJuOnBsYWlkOnBhcmFtczp0b2tlbnM6dXNlcicsXG4gICAgT2F1dGh1c2VyVG9rZW4gPSAndXJuOnBsYWlkOnBhcmFtczpvYXV0aDp1c2VyLXRva2VuJyxcbiAgICBDcmVkaXRtdWx0aVVzZXIgPSAndXJuOnBsYWlkOnBhcmFtczpjcmVkaXQ6bXVsdGktdXNlcidcbn1cblxuLyoqXG4gKiBPQXV0aCB0b2tlbiBncmFudCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPQXV0aFRva2VuUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoVG9rZW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T0F1dGhHcmFudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXF1ZXN0XG4gICAgICovXG4gICAgZ3JhbnRfdHlwZTogT0F1dGhHcmFudFR5cGU7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkgYXMgZWl0aGVyIGBzZWNyZXRgIG9yIGBjbGllbnRfc2VjcmV0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkgYXMgZWl0aGVyIGBzZWNyZXRgIG9yIGBjbGllbnRfc2VjcmV0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBzY29wZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9rZW4sIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGluIFtodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY3NDkjc2VjdGlvbi0zLjNdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjc0OSNzZWN0aW9uLTMuMykuIEN1cnJlbnRseSBhY2NlcHRlZCB2YWx1ZXMgYXJlOiAgYHVzZXI6cmVhZGAgYWxsb3dzIHJlYWRpbmcgdXNlciBkYXRhLiBgdXNlcjp3cml0ZWAgYWxsb3dzIHdyaXRpbmcgdXNlciBkYXRhLiBgZXhjaGFuZ2VgIGFsbG93cyBleGNoYW5naW5nIGEgdG9rZW4gdXNpbmcgdGhlIGB1cm46cGxhaWQ6cGFyYW1zOm9hdXRoOnVzZXItdG9rZW5gIGdyYW50IHR5cGUuIGBtY3A6ZGFzaGJvYXJkYCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBNQ1AgZGFzaGJvYXJkIHNlcnZlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVxdWVzdFxuICAgICAqL1xuICAgIHNjb3BlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggdG9rZW4gZm9yIE9BdXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZyZXNoX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSSSBvZiB0aGUgdGFyZ2V0IHJlc291cmNlIHNlcnZlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXF1ZXN0XG4gICAgICovXG4gICAgcmVzb3VyY2U/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVXNlZCB3aGVuIGV4Y2hhbmdpbmcgYSB0b2tlbi4gVGhlIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgYHN1YmplY3RfdG9rZW5fdHlwZWA6ICAtIEZvciBgdXJuOnBsYWlkOnBhcmFtczp0b2tlbnM6dXNlcmA6IE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfaWRgLiAtIEZvciBgdXJuOnBsYWlkOnBhcmFtczpvYXV0aDp1c2VyLXRva2VuYDogVGhlIG90aGVyIGBjbGllbnRfaWRgIHRvIGV4Y2hhbmdlIHRva2VucyB0by4gLSBGb3IgYHVybjpwbGFpZDpwYXJhbXM6Y3JlZGl0Om11bHRpLXVzZXJgOiAgYSBgY2xpZW50X2lkYCBvciBvbmUgb2YgdGhlIHN1cHBvcnRlZCBDUkEgcGFydG5lciBVUk5zOiBgdXJuOnBsYWlkOnBhcmFtczpjcmEtcGFydG5lcjpleHBlcmlhbmAsIGB1cm46cGxhaWQ6cGFyYW1zOmNyYS1wYXJ0bmVyOmZhbm5pZS1tYWVgLCBvciBgdXJuOnBsYWlkOnBhcmFtczpjcmEtcGFydG5lcjpmcmVkZGllLW1hY2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpZW5jZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUb2tlbiByZXByZXNlbnRpbmcgdGhlIHN1YmplY3QuIFRoZSBtZWFuaW5nIGRlcGVuZHMgb24gdGhlIGBzdWJqZWN0X3Rva2VuX3R5cGVgLiBGb3IgYHVybjpwbGFpZDpwYXJhbXM6dG9rZW5zOnVzZXJgLCB0aGUgYHN1YmplY3RfdG9rZW5gIG11c3QgYmUgYSBQbGFpZC1pc3N1ZWQgdXNlciB0b2tlbiBmcm9tIHRoZSBgL3VzZXIvY3JlYXRlYCBlbmRwb2ludC4gRm9yIGB1cm46cGxhaWQ6cGFyYW1zOm9hdXRoOnVzZXItdG9rZW5gLCB0aGUgYHN1YmplY3RfdG9rZW5gIG11c3QgYmUgYW4gT0F1dGggcmVmcmVzaCB0b2tlbiBpc3N1ZWQgZnJvbSB0aGUgYC9vYXV0aC90b2tlbmAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICBzdWJqZWN0X3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPQXV0aFN1YmplY3RUb2tlblR5cGV9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXF1ZXN0XG4gICAgICovXG4gICAgc3ViamVjdF90b2tlbl90eXBlPzogT0F1dGhTdWJqZWN0VG9rZW5UeXBlO1xufVxuLyoqXG4gKiBPQXV0aCB0b2tlbiBncmFudCBzdWNjZXNzIHJlc3BvbnNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE9BdXRoVG9rZW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoVG9rZW5SZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQWNjZXNzIHRva2VuIGZvciBPQXV0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggdG9rZW4gZm9yIE9BdXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmcmVzaF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgdG9rZW4gdGhlIGFjY2VzcyB0b2tlbiBpcy4gQ3VycmVudGx5IGl0IGlzIGFsd2F5cyBCZWFyZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b2tlbl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZSByZW1haW5pbmcgaW4gc2Vjb25kcyBiZWZvcmUgZXhwaXJhdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmVzX2luOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFZhbGlkIHZhbHVlcyBhcmUgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT21pdHRhYmxlVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBvcHRpb24gc2VjdXJpdHkuICBGb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZGF0YSBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgaWYgdGhlIEl0ZW0gaXMgdXNpbmcgYSBbY3VzdG9tIFNhbmRib3ggdXNlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgYW5kIHRoZSBgdGlja2VyYCBmaWVsZCBvZiB0aGUgY3VzdG9tIHNlY3VyaXR5IGZvbGxvd3MgdGhlIFtPQ0MgT3B0aW9uIFN5bWJvbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3B0aW9uX3N5bWJvbCNUaGVfT0NDX09wdGlvbl9TeW1ib2wpIHN0YW5kYXJkIHdpdGggbm8gc3BhY2VzLiBGb3IgYW4gZXhhbXBsZSBvZiBzaW11bGF0aW5nIHRoaXMgaW4gU2FuZGJveCwgc2VlIHRoZSBbY3VzdG9tIFNhbmRib3ggR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vcGxhaWQvc2FuZGJveC1jdXN0b20tdXNlcnMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcHRpb25Db250cmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIG9wdGlvbiBjb250cmFjdC4gSXQgaXMgb25lIG9mOiAgYHB1dGA6IGZvciBQdXQgb3B0aW9uIGNvbnRyYWN0cyAgYGNhbGxgOiBmb3IgQ2FsbCBvcHRpb24gY29udHJhY3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBjb250cmFjdF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpa2UgcHJpY2UgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBwZXIgc2hhcmUgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBzdHJpa2VfcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGlja2VyIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IGZvciB0aGlzIG9wdGlvbiBjb250cmFjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIHVuZGVybHlpbmdfc2VjdXJpdHlfdGlja2VyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGZ1bmRzLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGJ5IGxvY2FsIHJlZ3VsYXRpb24gZm9yIGNlcnRhaW4gYnVzaW5lc3NlcyAoZS5nLiBtb25leSByZW1pdHRhbmNlKSB0byBzZW5kIHBheW91dHMgdG8gcmVjaXBpZW50cyBpbiB0aGUgRVUgYW5kIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb3VyY2Ugb2YgdGhlIGZ1bmRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGZ1bGxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIGZyb20gd2hpY2ggdGhlIGZ1bmRzIGFyZSBzb3VyY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSwgYWxzbyBrbm93biBhcyBTV0lGVCBjb2RlLCBmb3IgdGhpcyBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRpbmdGdW5kU291cmNlXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3JcXCdzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB0cmFuc2ZlciBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeSB7XG4gICAgT25jZVBlck1vbnRoID0gJ29uY2VfcGVyX21vbnRoJyxcbiAgICBUd2ljZVBlck1vbnRoID0gJ3R3aWNlX3Blcl9tb250aCcsXG4gICAgT25jZVBlcldlZWsgPSAnb25jZV9wZXJfd2VlaycsXG4gICAgRGFpbHkgPSAnZGFpbHknXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3Igb3RoZXIgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1vdGhlcikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdGhlckFjY291bnRTdWJ0eXBlIHtcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgb3RoZXJgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3RoZXJGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdGhlckZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIHVudXN1YWxseSBsYXJnZSB0cmFuc2FjdGlvbnMgdGhhdCBleGNlZWQgdHlwaWNhbCBzcGVuZGluZyBwYXR0ZXJucyBmb3IgdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE91dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE91dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgd2hvc2UgdmFsdWUgaXMgYWJvdmUgdGhlIHRocmVzaG9sZCBvZiBub3JtYWwgYW1vdW50cyBmb3IgYSBnaXZlbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE91dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Ftb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgT3V0bGllclRyYW5zYWN0aW9uc0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogQW1vdW50V2l0aEN1cnJlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVcCB0byAzIHRvcCBjYXRlZ29yaWVzIG9mIGV4cGVuc2VzIGluIHRoaXMgZ3JvdXAuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5RXhwZW5zZXM+fVxuICAgICAqIEBtZW1iZXJvZiBPdXRsaWVyVHJhbnNhY3Rpb25zSW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3BfY2F0ZWdvcmllcz86IEFycmF5PENhdGVnb3J5RXhwZW5zZXM+O1xufVxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgcGF5cm9sbDpgIFBheXJvbGwgYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIG90aGVyIHRlc3QgZGF0YSBpbiBvcmRlciB0byBhY2hpZXZlIG1vcmUgY29uc2lzdGVudCwgcmVhbGlzdGljIHRlc3QgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdmVycmlkZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHlwZTogT3ZlcnJpZGVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgc3RhcnQgd2l0aCB0aGlzIGFtb3VudCBhcyB0aGUgY3VycmVudCBiYWxhbmNlLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIGFsd2F5cyBoYXZlIHRoaXMgYW1vdW50IGFzIGl0cyBhdmFpbGFibGUgYmFsYW5jZSwgcmVnYXJkbGVzcyBvZiBjdXJyZW50IGJhbGFuY2Ugb3IgY2hhbmdlcyBpbiB0cmFuc2FjdGlvbnMgb3ZlciB0aW1lLiBDYW5ub3QgYmUgc2V0IHRvZ2V0aGVyIHdpdGggYGhhc19udWxsX2F2YWlsYWJsZV9iYWxhbmNlYC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGZvcmNlX2F2YWlsYWJsZV9iYWxhbmNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGFjY291bnQgd2lsbCBhbHdheXMgaGF2ZSBudWxsIGFzIGl0cyBhdmFpbGFibGUgYmFsYW5jZSwgcmVnYXJkbGVzcyBvZiBjdXJyZW50IGJhbGFuY2Ugb3IgY2hhbmdlcyBpbiB0cmFuc2FjdGlvbnMgb3ZlciB0aW1lLiBDYW5ub3QgYmUgc2V0IHRvZ2V0aGVyIHdpdGggYGZvcmNlX2F2YWlsYWJsZV9iYWxhbmNlYC4gXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBoYXNfbnVsbF9hdmFpbGFibGVfYmFsYW5jZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBiZSBkZW5vbWluYXRlZCBpbiB0aGUgZ2l2ZW4gY3VycmVuY3kuIFRyYW5zYWN0aW9ucyB3aWxsIGFsc28gYmUgaW4gdGhpcyBjdXJyZW5jeSBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgbWV0YTogTWV0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG51bWJlcnM6IE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ3NPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogSG9sZGluZ3NPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBPd25lck92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGxpYWJpbGl0eTogTGlhYmlsaXR5T3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZmxvd01vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5mbG93X21vZGVsOiBJbmZsb3dNb2RlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBJbmNvbWVPdmVycmlkZTtcbn1cbi8qKlxuICogRGF0YSByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBPbmx5IHRoZSBgbmFtZXNgIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gQW55IGZpZWxkcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZGVmYXVsdCBTYW5kYm94IGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lck92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGVzZSBzaG91bGQgYWx3YXlzIGJlIHRoZSBuYW1lcyBvZiBpbmRpdmlkdWFscywgZXZlbiBmb3IgYnVzaW5lc3MgYWNjb3VudHMuIE5vdGUgdGhhdCB0aGUgc2FtZSBuYW1lIGRhdGEgd2lsbCBiZSB1c2VkIGZvciBhbGwgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PFBob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxFbWFpbD47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgdmFyaW91cyBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz47XG59XG4vKipcbiAqIEhvdyBhbiBhc3NldCBpcyBvd25lZC4gIGBhc3NvY2lhdGlvbmA6IE93bmVyc2hpcCBieSBhIGNvcnBvcmF0aW9uLCBwYXJ0bmVyc2hpcCwgb3IgdW5pbmNvcnBvcmF0ZWQgYXNzb2NpYXRpb24sIGluY2x1ZGluZyBmb3ItcHJvZml0IGFuZCBub3QtZm9yLXByb2ZpdCBvcmdhbml6YXRpb25zLiBgaW5kaXZpZHVhbGA6IE93bmVyc2hpcCBieSBhbiBpbmRpdmlkdWFsLiBgam9pbnRgOiBKb2ludCBvd25lcnNoaXAgYnkgbXVsdGlwbGUgcGFydGllcy4gYHRydXN0YDogT3duZXJzaGlwIGJ5IGEgcmV2b2NhYmxlIG9yIGlycmV2b2NhYmxlIHRydXN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3duZXJzaGlwVHlwZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBJbmRpdmlkdWFsID0gJ2luZGl2aWR1YWwnLFxuICAgIEpvaW50ID0gJ2pvaW50JyxcbiAgICBBc3NvY2lhdGlvbiA9ICdhc3NvY2lhdGlvbicsXG4gICAgVHJ1c3QgPSAndHJ1c3QnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYSBwb3N0IG9mZmljZSBib3guIFdpbGwgYmUgYHllc2Agd2hlbiBhIFAuTy4gYm94IGlzIGRldGVjdGVkLCBgbm9gIHdoZW4gUGxhaWQgY29uZmlybWVkIHRoZSBhZGRyZXNzIGlzIG5vdCBhIFAuTy4gYm94LCBhbmQgYG5vX2RhdGFgIHdoZW4gUGxhaWQgd2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBhIFAuTy4gYm94LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUE9Cb3hTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgc3R1ZGVudFxcJ3MgZWxpZ2liaWxpdHkgaW4gdGhlIFB1YmxpYyBTZXJ2aWNlIExvYW4gRm9yZ2l2ZW5lc3MgcHJvZ3JhbS4gVGhpcyBpcyBvbmx5IHJldHVybmVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBGZWRMb2FuIChgaW5zXzExNjUyN2ApLiBTaW5jZSBGZWRMb2FuIG5vIGxvbmdlciBzZXJ2aWNlcyBzdHVkZW50IGxvYW5zLCB0aGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXR1cm5lZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBTTEZTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXN0aW1hdGVkIGRhdGUgYm9ycm93ZXIgd2lsbCBoYXZlIGNvbXBsZXRlZCAxMjAgcXVhbGlmeWluZyBtb250aGx5IHBheW1lbnRzLiBSZXR1cm5lZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBlc3RpbWF0ZWRfZWxpZ2liaWxpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gbWFkZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfbWFkZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgcmVtYWluaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBwYXltZW50c19yZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PFBhcnR5Pjtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlbmQgY3VzdG9tZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0bmVyIGhhcyBjb21wbGV0ZWQgYXR0ZXN0YXRpb24gb2YgZGlsaWdlbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19kaWxpZ2VuY2VfYXR0ZXN0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIElmIHlvdSByZXF1aXJlIHRoZSBhYmlsaXR5IHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGVuZCBjdXN0b21lcnMgdXNpbmcgbXVsdGlwbGUgZGlmZmVyZW50IExpbmsgY3VzdG9taXphdGlvbiBwcm9maWxlcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBmb3IgYXNzaXN0YW5jZS4gIEltcG9ydGFudDogRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nIChEVE0pIHVzZSBjYXNlcyB3aWxsIG5vdCBiZSBjb3BpZWQgdG8gdGhlIGVuZCBjdXN0b21lclxcJ3MgTGluayBjdXN0b21pemF0aW9uIHVubGVzcyB0aGUgKipQdWJsaXNoIGNoYW5nZXMqKiBidXR0b24gaXMgY2xpY2tlZCBhZnRlciB0aGUgdXNlIGNhc2VzIGFyZSBhcHBsaWVkLiBMaW5rIHdpbGwgbm90IHdvcmsgaW4gUHJvZHVjdGlvbiB1bmxlc3MgdGhlIGVuZCBjdXN0b21lclxcJ3MgRFRNIHVzZSBjYXNlcyBhcmUgY29uZmlndXJlZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuIFRoZSBhcHBsaWNhdGlvbiBuYW1lIG11c3QgYmUgdW5pcXVlIGFuZCBjYW5ub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYW5vdGhlciBhcHBsaWNhdGlvbiBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVjaG5pY2FsX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJpbGxpbmdfY29udGFjdD86IFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tZXJfc3VwcG9ydF9pbmZvPzogUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mbztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSBwYXJ0bmVyIGhhcyBmb3J3YXJkZWQgdGhlIFBsYWlkIGJhbmsgYWRkZW5kdW0gdG8gdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2JhbmtfYWRkZW5kdW1fY29tcGxldGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldHNfdW5kZXJfbWFuYWdlbWVudD86IFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgVVJJcyBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbihzKSB3aGVyZSBhIHVzZXIgY2FuIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24sIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIG1vZGlmeSByZWRpcmVjdCBVUklzIGZvciBhbiBlbmQgY3VzdG9tZXIgYWZ0ZXIgY3JlYXRpbmcgdGhlbSwgZ28gdG8gdGhlIGVuZCBjdXN0b21lclxcJ3MgW0FQSSBwYWdlXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gYSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYnkgcmVndWxhdG9yeSBhdXRob3JpdGllcywgaWYgYXBwbGljYWJsZS4gRm9yIGJhbmtzLCB0aGlzIGlzIHRoZSBGRElDIENlcnRpZmljYXRlIE51bWJlci4gRm9yIGNyZWRpdCB1bmlvbnMsIHRoaXMgaXMgdGhlIENyZWRpdCBVbmlvbiBDaGFydGVyIE51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVnaXN0cmF0aW9uX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2R1Y3Rpb25fc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IFBhcnRuZXJFbmRDdXN0b21lcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJGbG93ZG93blN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZsb3dkb3duX3N0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcXVlc3Rpb25uYWlyZV9zdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBPQXV0aCBpbnN0aXR1dGlvbnMgd2l0aCB3aGljaCB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbiBpcyBiZWluZyByZWdpc3RlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9ucz86IEFycmF5PFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIHJlbW92ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIGFuIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9pZGAgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0cyB1bmRlciBtYW5hZ2VtZW50IGZvciB0aGUgZ2l2ZW4gZW5kIGN1c3RvbWVyLiBSZXF1aXJlZCBmb3IgZW5kIGN1c3RvbWVycyB3aXRoIG1vbnRobHkgc2VydmljZSBjb21taXRtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYmFuayBhZGRlbmR1bSBhY2NlcHRhbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCYW5rQWRkZW5kdW1BY2NlcHRhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQmFua0FkZGVuZHVtQWNjZXB0YW5jZSB7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSBlbmQgY3VzdG9tZXIgaGFzIGFjY2VwdGVkIHRoZSBiYW5rIGFkZGVuZHVtIHRlcm1zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCYW5rQWRkZW5kdW1BY2NlcHRhbmNlXG4gICAgICovXG4gICAgY3VzdG9tZXJfYWNjZXB0ZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBlbmQgY3VzdG9tZXIgd2hlbiB0aGV5IGFjY2VwdGVkIHRoZSBiYW5rIGFkZGVuZHVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJhbmtBZGRlbmR1bUFjY2VwdGFuY2VcbiAgICAgKi9cbiAgICBjdXN0b21lcl9pcF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgZW5kIGN1c3RvbWVyIGFjY2VwdGVkIHRoZSBiYW5rIGFkZGVuZHVtIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmFua0FkZGVuZHVtQWNjZXB0YW5jZVxuICAgICAqL1xuICAgIGN1c3RvbWVyX2FncmVlbWVudF90aW1lc3RhbXA/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBiaWxsaW5nIGNvbnRhY3QgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGJpbGxpbmcgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIG1hcCBvZiBwZXJtaXNzaWJsZSBwdXJwb3NlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHVzZSBjYXNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFQdXJwb3NlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFQdXJwb3Nlc1xuICAgICAqL1xuICAgIFdSSVRURU5fSU5TVFJVQ1RJT04/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzXG4gICAgICovXG4gICAgRVhURU5TSU9OX09GX0NSRURJVF9PUl9BQ0NPVU5UX1JFVklFVz86IFBhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXNcbiAgICAgKi9cbiAgICBFTVBMT1lNRU5UPzogUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFQdXJwb3Nlc1xuICAgICAqL1xuICAgIElOU1VSQU5DRV9VTkRFUldSSVRJTkc/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzXG4gICAgICovXG4gICAgTElDRU5TRV9FTElHSUJJTElUWT86IFBhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXNcbiAgICAgKi9cbiAgICBSSVNLX0FTU0VTU01FTlQ/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzXG4gICAgICovXG4gICAgQlVTSU5FU1NfTkVFRF9UUkFOU0FDVElPTj86IFBhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXNcbiAgICAgKi9cbiAgICBCVVNJTkVTU19ORUVEX0FDQ09VTlRfUkVWSUVXPzogUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXM7XG59XG4vKipcbiAqIFRoZSBDUkEgcXVlc3Rpb25uYWlyZSBmb3IgdGhlIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ1JBUXVlc3Rpb25uYWlyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckNSQVF1ZXN0aW9ubmFpcmUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFQdXJwb3Nlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUXVlc3Rpb25uYWlyZVxuICAgICAqL1xuICAgIHB1cnBvc2VzPzogUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXM7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSB0aGlyZCBwYXJ0eSBpcyBpbnZvbHZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUXVlc3Rpb25uYWlyZVxuICAgICAqL1xuICAgIGlzX3RoaXJkX3BhcnR5X2ludm9sdmVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgdGhlIHRlY2huaWNhbCBzZXJ2aWNlIHByb3ZpZGVyIGlzIGludm9sdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFRdWVzdGlvbm5haXJlXG4gICAgICovXG4gICAgaXNfdGVjaG5pY2FsX3NlcnZpY2VfcHJvdmlkZXJfaW52b2x2ZWQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBIENSQSB1c2UgY2FzZSB1bmRlciBhIHBlcm1pc3NpYmxlIHB1cnBvc2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlIHtcbiAgICBDcmVkaXRVbmRlcndyaXRpbmcgPSAnQ1JFRElUX1VOREVSV1JJVElORycsXG4gICAgVGVuYW50U2NyZWVuaW5nID0gJ1RFTkFOVF9TQ1JFRU5JTkcnLFxuICAgIEludmVzdG9yT3JTZXJ2aWNlck9mQ3JlZGl0ID0gJ0lOVkVTVE9SX09SX1NFUlZJQ0VSX09GX0NSRURJVCcsXG4gICAgVXRpbGl0aWVzID0gJ1VUSUxJVElFUycsXG4gICAgQmFua0FjY291bnRPcGVuaW5nID0gJ0JBTktfQUNDT1VOVF9PUEVOSU5HJyxcbiAgICBJZGVudGl0eVZlcmlmaWNhdGlvbkZyYXVkUHJldmVudGlvbiA9ICdJREVOVElUWV9WRVJJRklDQVRJT05fRlJBVURfUFJFVkVOVElPTicsXG4gICAgQ29sbGVjdGlvbnNEZWJ0UmVjb3ZlcnkgPSAnQ09MTEVDVElPTlNfREVCVF9SRUNPVkVSWSdcbn1cblxuLyoqXG4gKiBUaGUgbGlzdCBvZiB1c2UgY2FzZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcGVybWlzc2libGUgcHVycG9zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlcyB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB1c2UgY2FzZXMgZm9yIHRoZSBnaXZlbiBwZXJtaXNzaWJsZSBwdXJwb3NlLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXNcbiAgICAgKi9cbiAgICB1c2VfY2FzZXM/OiBBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlPjtcbn1cbi8qKlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyBwdWJsaWMuIFVzZXJzIG9mIHlvdXIgYXBwIHdpbGwgc2VlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBtYW5hZ2luZyBjb25uZWN0aW9ucyBiZXR3ZWVuIHlvdXIgYXBwIGFuZCB0aGVpciBiYW5rIGFjY291bnRzIGluIFBsYWlkIFBvcnRhbC4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgY3VzdG9tZXIgc3VwcG9ydCBpbmZvIGlmIG9taXR0ZWQuIFRoaXMgZmllbGQgaXMgbWFuZGF0b3J5IGZvciBwYXJ0bmVycyB3aG9zZSBQbGFpZCBhY2NvdW50cyB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgTm92ZW1iZXIgMjYsIDIwMjQgYW5kIHdpbGwgYmUgbWFuZGF0b3J5IGZvciBhbGwgcGFydG5lcnMgYnkgdGhlIDEwMzMgY29tcGxpYW5jZSBkZWFkbGluZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm8ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgbWFuZGF0b3J5IGZvciBwYXJ0bmVycyB3aG9zZSBQbGFpZCBhY2NvdW50cyB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgTm92ZW1iZXIgMjYsIDIwMjQgYW5kIHdpbGwgYmUgbWFuZGF0b3J5IGZvciBhbGwgcGFydG5lcnMgYnkgdGhlIDEwMzMgY29tcGxpYW5jZSBkZWFkbGluZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgY29udGFjdF91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGxpbmtfdXBkYXRlX3VybD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgYWRkZW5kdW0gdG8gdGhlIFBsYWlkIE1TQSAoXFxcImZsb3dkb3duXFxcIikgZm9yIHRoZSBlbmQgY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJGbG93ZG93blN0YXR1cyB7XG4gICAgTm90U3RhcnRlZCA9ICdOT1RfU1RBUlRFRCcsXG4gICAgSW5SZXZpZXcgPSAnSU5fUkVWSUVXJyxcbiAgICBOZWdvdGlhdGlvbiA9ICdORUdPVElBVElPTicsXG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnXG59XG5cbi8qKlxuICogVGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudHM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIHdhcyBhcHByb3ZlZCBieSB0aGUgaW5zdGl0dXRpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVpciBhcHBsaWNhdGlvbiBoYXMgbm90IHlldCBiZWVuIGFwcHJvdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uX2VuYWJsZW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggbm9uLU9BdXRoIEl0ZW0gYWRkcyB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgZm9yIHRoaXMgaW5zdGl0dXRpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBzdWNoIGRhdGUgaGFzIGJlZW4gc2V0IGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgY2xhc3NpY19kaXNhYmxlbWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIHJlZ2lzdGVyaW5nIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIHdpdGggdGhlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGxhaWRFcnJvcj59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBlcnJvcnM/OiBBcnJheTxQbGFpZEVycm9yPjtcbn1cbi8qKlxuICogVGhlIHJlZ2lzdHJhdGlvbiBzdGF0dXMgZm9yIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BST0NFU1NJTkcnLFxuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBFbmFibGVkID0gJ0VOQUJMRUQnLFxuICAgIEF0dGVudGlvblJlcXVpcmVkID0gJ0FUVEVOVElPTl9SRVFVSVJFRCdcbn1cblxuLyoqXG4gKiBSZWdpc3RyYXRpb24gc3RhdHVzZXMgYnkgZW52aXJvbm1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gICAgICovXG4gICAgZGV2ZWxvcG1lbnQ/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICAgICAqL1xuICAgIHByb2R1Y3Rpb24/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFRoZSBPQXV0aCBzdGF0dXMgb2YgdGhlIHVwZGF0ZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzIHtcbiAgICBOb3RTdGFydGVkID0gJ25vdC1zdGFydGVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBFbmFibGVkID0gJ2VuYWJsZWQnLFxuICAgIEF0dGVudGlvblJlcXVpcmVkID0gJ2F0dGVudGlvbi1yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBUaGUgd2ViaG9vayBvZiB0eXBlIGBQQVJUTkVSYCBhbmQgY29kZSBgRU5EX0NVU1RPTUVSX09BVVRIX1NUQVRVU19VUERBVEVEYCB3aWxsIGJlIGZpcmVkIHdoZW4gYSBwYXJ0bmVyXFwncyBlbmQgY3VzdG9tZXIgaGFzIGFuIHVwZGF0ZSBvbiB0aGVpciBPQXV0aCByZWdpc3RyYXRpb24gc3RhdHVzIHdpdGggYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVORF9DVVNUT01FUl9PQVVUSF9TVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gSURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3VyaXR5IHF1ZXN0aW9ubmFpcmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBSZWNlaXZlZCA9ICdSRUNFSVZFRCcsXG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnXG59XG5cbi8qKlxuICogVGhlIHF1ZXN0aW9ubmFpcmVzIGZvciB0aGUgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBUXVlc3Rpb25uYWlyZX1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZXNcbiAgICAgKi9cbiAgICBjcmE/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFRdWVzdGlvbm5haXJlO1xufVxuLyoqXG4gKiBBIGZpZWxkIHRoYXQgbWF5IGJlIHJlcXVpcmVkIHRvIGJlIHN1Ym1pdHRlZCBmb3IgZW5hYmxlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclJlcXVpcmVtZW50RHVlIHtcbiAgICBMZWdhbEVudGl0eU5hbWUgPSAnbGVnYWxfZW50aXR5X25hbWUnLFxuICAgIFdlYnNpdGUgPSAnd2Vic2l0ZScsXG4gICAgQXBwbGljYXRpb25OYW1lID0gJ2FwcGxpY2F0aW9uX25hbWUnLFxuICAgIElzRGlsaWdlbmNlQXR0ZXN0ZWQgPSAnaXNfZGlsaWdlbmNlX2F0dGVzdGVkJyxcbiAgICBUZWNobmljYWxDb250YWN0ID0gJ3RlY2huaWNhbF9jb250YWN0JyxcbiAgICBCaWxsaW5nQ29udGFjdCA9ICdiaWxsaW5nX2NvbnRhY3QnLFxuICAgIEFkZHJlc3MgPSAnYWRkcmVzcycsXG4gICAgQmFua0FkZGVuZHVtQWNjZXB0YW5jZSA9ICdiYW5rX2FkZGVuZHVtX2FjY2VwdGFuY2UnLFxuICAgIFF1ZXN0aW9ubmFpcmVzQ3JhID0gJ3F1ZXN0aW9ubmFpcmVzLmNyYSdcbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0cyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqL1xuICAgIHNhbmRib3g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LiBUaGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gVGhlIGVuZCBjdXN0b21lciB3aWxsIGJlIHByb3ZpZGVkIHdpdGggYSBsaW1pdGVkIG51bWJlciBvZiBjcmVkaXRzIHRvIHRlc3QgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYmVmb3JlIGZ1bGwgZW5hYmxlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZW5kIGN1c3RvbWVyLiAgYFVOREVSX1JFVklFV2A6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVGhlIGVuZCBjdXN0b21lciBtdXN0IGJlIG1hbnVhbGx5IHJldmlld2VkIGJ5IHRoZSBQbGFpZCB0ZWFtIGJlZm9yZSBpdCBjYW4gYmUgZW5hYmxlZCBpbiBQcm9kdWN0aW9uLCBhdCB3aGljaCBwb2ludCBpdHMgc3RhdHVzIHdpbGwgYXV0b21hdGljYWxseSB0cmFuc2l0aW9uIHRvIGBQRU5ESU5HX0VOQUJMRU1FTlRgIG9yIGBERU5JRURgLiAgYFBFTkRJTkdfRU5BQkxFTUVOVGA6IFRoZSBlbmQgY3VzdG9tZXIgaXMgcmVhZHkgdG8gYmUgZnVsbHkgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gQ2FsbCB0aGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgdG8gZW5hYmxlIHRoZSBlbmQgY3VzdG9tZXIgaW4gZnVsbCBQcm9kdWN0aW9uLiAgYEFDVElWRWA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gZnVsbHkgZW5hYmxlZCBpbiBhbGwgZW52aXJvbm1lbnRzLiAgYERFTklFRGA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnV0IGl0IGRpZCBub3QgcGFzcyByZXZpZXcgYnkgdGhlIFBsYWlkIHRlYW0gYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgZW5hYmxlZCBmb3IgUHJvZHVjdGlvbiBhY2Nlc3MuIFRhbGsgdG8geW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXMge1xuICAgIFVuZGVyUmV2aWV3ID0gJ1VOREVSX1JFVklFVycsXG4gICAgUGVuZGluZ0VuYWJsZW1lbnQgPSAnUEVORElOR19FTkFCTEVNRU5UJyxcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBEZW5pZWQgPSAnREVOSUVEJyxcbiAgICBNb3JlSW5mb3JtYXRpb25OZWVkZWQgPSAnTU9SRV9JTkZPUk1BVElPTl9ORUVERUQnXG59XG5cbi8qKlxuICogVGhlIHRlY2huaWNhbCBjb250YWN0IGZvciB0aGUgZW5kIGN1c3RvbWVyLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyB0ZWNobmljYWwgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVuZCBjdXN0b21lciwgaW5jbHVkaW5nIHNlY3JldHMgZm9yIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZlxuICAgICAqL1xuICAgIHNlY3JldHM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcGFydHkgdG8gYSB0cmFuc2FjdGlvbi4gSW5jbHVkZWQgZGlyZWN0IHBhcnRpY2lwYW50cyBsaWtlIHRoZSBib3Jyb3dlciBhbmQgc2VsbGVyIGFzIHdlbGwgYXMgaW5kaXJlY3QgcGFydGljaXBhbnRzIHN1Y2ggYXMgdGhlIGZsb29kIGNlcnRpZmljYXRlIHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydHlJbmRpdmlkdWFsfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIElORElWSURVQUw6IFBhcnR5SW5kaXZpZHVhbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5XG4gICAgICovXG4gICAgUk9MRVM6IFJvbGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVJTOiBUYXhwYXllcklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnR5SW5kaXZpZHVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnR5SW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZGl2aWR1YWxOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eUluZGl2aWR1YWxcbiAgICAgKi9cbiAgICBOQU1FOiBJbmRpdmlkdWFsTmFtZTtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gZGVmaW5lZCBsaXN0IHRoYXQgaWRlbnRpZmllcyB0aGUgcm9sZSB0aGF0IHRoZSBwYXJ0eSBwbGF5cyBpbiB0aGUgdHJhbnNhY3Rpb24uIFBhcnRpZXMgbWF5IGJlIGVpdGhlciBhIHBlcnNvbiBvciBsZWdhbCBlbnRpdHkuIEEgcGFydHkgbWF5IHBsYXkgbXVsdGlwbGUgcm9sZXMgaW4gYSB0cmFuc2FjdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnR5Um9sZVR5cGUge1xuICAgIEJvcnJvd2VyID0gJ0JvcnJvd2VyJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtb25ldGFyeSBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheSB7XG4gICAgLyoqXG4gICAgICogQSBudW1lcmljYWwgYW1vdW50IG9mIGEgc3BlY2lmaWMgY3VycmVuY3kuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW5jeSBjb2RlLCBlLmcuIFVTRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5RnJlcXVlbmN5VmFsdWV9XG4gICAgICogQG1lbWJlcm9mIFBheUZyZXF1ZW5jeVxuICAgICAqL1xuICAgIHZhbHVlOiBQYXlGcmVxdWVuY3lWYWx1ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlGcmVxdWVuY3lWYWx1ZSB7XG4gICAgTW9udGhseSA9ICdtb250aGx5JyxcbiAgICBTZW1pbW9udGhseSA9ICdzZW1pbW9udGhseScsXG4gICAgV2Vla2x5ID0gJ3dlZWtseScsXG4gICAgQml3ZWVrbHkgPSAnYml3ZWVrbHknLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd24/OiBBcnJheTxEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwYXlfZGF5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBzdGFydCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeSB7XG4gICAgUGF5RnJlcXVlbmN5VW5rbm93biA9ICdQQVlfRlJFUVVFTkNZX1VOS05PV04nLFxuICAgIFBheUZyZXF1ZW5jeVdlZWtseSA9ICdQQVlfRlJFUVVFTkNZX1dFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5Qml3ZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9CSVdFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5U2VtaW1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9TRU1JTU9OVEhMWScsXG4gICAgUGF5RnJlcXVlbmN5TW9udGhseSA9ICdQQVlfRlJFUVVFTkNZX01PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlYXJuaW5ncyBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgdGhlIGVhcm5pbmdzIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd246IEFycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgcGVyaW9kIGVuZGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5nczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgc3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2Jhc2lzPzogQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBzdGFydGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEIHtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgcGF5bWVudC4gRm9yIHN0YW5kaW5nIG9yZGVycyBhbmQgcGF5bWVudCBjb25zZW50cywgYFxcXCJHQlBcXFwiYCBtdXN0IGJlIHVzZWQuIEZvciBQb2xhbmQsIERlbm1hcmssIFN3ZWRlbiBhbmQgTm9yd2F5LCBvbmx5IHRoZSBsb2NhbCBjdXJyZW5jeSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEFtb3VudEN1cnJlbmN5IHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJyxcbiAgICBQbG4gPSAnUExOJyxcbiAgICBTZWsgPSAnU0VLJyxcbiAgICBEa2sgPSAnREtLJyxcbiAgICBOb2sgPSAnTk9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q2hhbm5lbCB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogTWF4aW11bSBhbW91bnQgb2YgYSBzaW5nbGUgcGF5bWVudCBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBXaGVyZSB0aGUgcGF5bWVudCBjb25zZW50IHBlcmlvZCBzaG91bGQgc3RhcnQuICBJZiB0aGUgaW5zdGl0dXRpb24gaXMgTW9uem8sIG9ubHkgYENPTlNFTlRgIGFsaWdubWVudHMgYXJlIHN1cHBvcnRlZC4gIGBDQUxFTkRBUmA6IGxpbmUgdXAgd2l0aCBhIGNhbGVuZGFyLiAgYENPTlNFTlRgOiBvbiB0aGUgZGF0ZSBvZiBjb25zZW50IGNyZWF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0FsaWdubWVudCB7XG4gICAgQ2FsZW5kYXIgPSAnQ0FMRU5EQVInLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGNvbnNlbnQgcGF5bWVudHMgbGltaXRhdGlvbnMgcGVyIHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50O1xufVxuLyoqXG4gKiBNYXhpbXVtIGN1bXVsYXRpdmUgYW1vdW50IGZvciBhbGwgcGF5bWVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHBlcmlvZGljIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsIHtcbiAgICBEYXkgPSAnREFZJyxcbiAgICBXZWVrID0gJ1dFRUsnLFxuICAgIE1vbnRoID0gJ01PTlRIJyxcbiAgICBZZWFyID0gJ1lFQVInXG59XG5cbi8qKlxuICogTGlmZSBzcGFuIGZvciB0aGUgcGF5bWVudCBjb25zZW50LiBBZnRlciB0aGUgYHRvYCBkYXRlIHRoZSBwYXltZW50IGNvbnNlbnQgZXhwaXJlcyBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGZvciBwYXltZW50IGluaXRpYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgZnJvbSB3aGljaCB0aGUgY29uc2VudCBzaG91bGQgYmUgYWN0aXZlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gICAgICovXG4gICAgZnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIGNvbnNlbnQgZXhwaXJlcywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIHRvPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG9wdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIHBheW1lbnQgcmVjaXBpZW50XFwncyBiYW5rIGFjY291bnQuIFJlcXVpcmVkIGJ5IG1vc3QgaW5zdGl0dXRpb25zIG91dHNpZGUgb2YgdGhlIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxlbmd0aCAxLTIgcmVwcmVzZW50aW5nIHRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgNzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAzNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDE2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLCB1c2UgdGhlIFxcJ3R5cGVcXCcgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogTGltaXRhdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gcGF5bWVudHMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgdmFsaWRfZGF0ZV90aW1lPzogUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIG1heF9wYXltZW50X2Ftb3VudDogUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbW91bnQgbGltaXRhdGlvbnMgcGVyIHBlcmlvZCBvZiB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICBwZXJpb2RpY19hbW91bnRzOiBBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pjtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuIFRoZSBjcmVhdGVkIGNvbnNlbnQgY2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgZnVuZHMgdG8gdGhpcyByZWNpcGllbnQgb25seS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge1NldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IFNldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlPzogUGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQ29uc2VudCBjcmVhdGlvbiB0aW1lc3RhbXAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLCB1c2UgdGhlIFxcJ3R5cGVcXCcgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2NvcGVzPzogQXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHR5cGU/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBheW1lbnQgY29uc2VudCBwYXllciBkZXRhaWxzLiBQYXllciBgbmFtZWAgYW5kIGFjY291bnQgYG51bWJlcnNgIGFyZSByZXF1aXJlZCB0byBsb2NrIHRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBjb25zZW50IGNhbiBiZSBjcmVhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXllciBhcyBpdCBhcHBlYXJzIGluIHRoZWlyIGJhbmsgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBiaXJ0aGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBwaG9uZSBudW1iZXJzIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfVxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCYWNzIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0lCQU5OdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzXG4gICAgICovXG4gICAgaWJhbj86IE51bWJlcnNJQkFOTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgY29uc2VudCBwYXltZW50LiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIGNvbnNlbnQgcGF5bWVudCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBwYXltZW50IGlzIGNyZWF0ZWQuIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBpdCB3aWxsIHByZXZlbnQgYW55IHBheW1lbnQgdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gNDggaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSWYgbm90IHByb3ZpZGVkLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIHRvIHRoZSByZWZlcmVuY2UgZnJvbSBjb25zZW50LiBJbiBvcmRlciB0byB0cmFjayBzZXR0bGVtZW50IHZpYSBQYXltZW50IENvbmZpcm1hdGlvbiwgZWFjaCBwYXltZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSByZWZlcmVuY2UuIElmIHRoZSByZWZlcmVuY2UgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQVBJIGlzIG5vdCB1bmlxdWUsIFBsYWlkIHdpbGwgYWRqdXN0IGl0LiBTb21lIGluc3RpdHV0aW9ucyBtYXkgbGltaXQgdGhlIHJlZmVyZW5jZSB0byBsZXNzIHRoYW4gMTggY2hhcmFjdGVycy4gSWYgbmVjZXNzYXJ5LCBQbGFpZCB3aWxsIGFkanVzdCB0aGUgcmVmZXJlbmNlIGJ5IHRydW5jYXRpbmcgaXQgdG8gZml0IHRoZSBpbnN0aXR1dGlvblxcJ3MgcmVxdWlyZW1lbnRzLiBCb3RoIHRoZSBvcmlnaW5hbGx5IHByb3ZpZGVkIGFuZCBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHJlZmVyZW5jZXMgKGlmIGFueSkgY2FuIGJlIGZvdW5kIGluIHRoZSBgcmVmZXJlbmNlYCBhbmQgYGFkanVzdGVkX3JlZmVyZW5jZWAgZmllbGRzLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUgJiBzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2NvcGU/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZSAmIHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UHJvY2Vzc2luZ01vZGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NpbmdfbW9kZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogRGVjaWRlcyB0aGUgbW9kZSB1bmRlciB3aGljaCB0aGUgcGF5bWVudCBwcm9jZXNzaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQsIHVzaW5nIGBJTU1FRElBVEVgIGFzIGRlZmF1bHQuICBgSU1NRURJQVRFYDogV2lsbCBpbW1lZGlhdGVseSBleGVjdXRlIHRoZSBwYXltZW50LCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIEFTUFNQIGJlZm9yZSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgcGF5bWVudCBpbml0aWF0aW9uLiBUaGlzIGlzIGlkZWFsIGZvciB1c2VyLXByZXNlbnQgZmxvd3MuICAgYEFTWU5DYDogV2lsbCBhY2NlcHQgYSBwYXltZW50IGV4ZWN1dGlvbiByZXF1ZXN0IGFuZCBzY2hlZHVsZSBpdCBmb3IgcHJvY2Vzc2luZywgaW1tZWRpYXRlbHkgcmV0dXJuaW5nIHRoZSBuZXcgYHBheW1lbnRfaWRgLiBMaXN0ZW4gZm9yIHdlYmhvb2tzIHRvIG9idGFpbiByZWFsLXRpbWUgdXBkYXRlcyBvbiB0aGUgcGF5bWVudCBzdGF0dXMuIFRoaXMgaXMgaWRlYWwgZm9yIG5vbiB1c2VyLXByZXNlbnQgZmxvd3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQcm9jZXNzaW5nTW9kZSB7XG4gICAgQXN5bmMgPSAnQVNZTkMnLFxuICAgIEltbWVkaWF0ZSA9ICdJTU1FRElBVEUnXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBjb25zZW50IGB0eXBlYCBmaWVsZC4gQ29uc2VudHMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgYSBzaW5nbGUgdHlwZS4gIFBheW1lbnQgY29uc2VudCBzY29wZS4gRGVmaW5lcyBwb3NzaWJsZSBkaXJlY3Rpb25zIGZvciBwYXltZW50cyBtYWRlIHdpdGggdGhlIGdpdmVuIGNvbnNlbnQuICBgTUVfVE9fTUVgOiBBbGxvd3MgbW92aW5nIG1vbmV5IGJldHdlZW4gYWNjb3VudHMgb3duZWQgYnkgdGhlIHNhbWUgdXNlci4gIGBFWFRFUk5BTGA6IEFsbG93cyBpbml0aWF0aW5nIHBheW1lbnRzIGZyb20gdGhlIHVzZXJcXCdzIGFjY291bnQgdG8gdGhpcmQgcGFydGllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlIHtcbiAgICBNZVRvTWUgPSAnTUVfVE9fTUUnLFxuICAgIEV4dGVybmFsID0gJ0VYVEVSTkFMJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHBheW1lbnQgY29uc2VudC4gIGBVTkFVVEhPUklTRURgOiBDb25zZW50IGNyZWF0ZWQsIGJ1dCByZXF1aXJlcyB1c2VyIGF1dGhvcmlzYXRpb24uICBgUkVKRUNURURgOiBDb25zZW50IGF1dGhvcmlzYXRpb24gd2FzIHJlamVjdGVkIGJ5IHRoZSBiYW5rLiAgYEFVVEhPUklTRURgOiBDb25zZW50IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gYmUgdXNlZC4gIGBSRVZPS0VEYDogQ29uc2VudCBoYXMgYmVlbiByZXZva2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICBgRVhQSVJFRGA6IENvbnNlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzIHtcbiAgICBVbmF1dGhvcmlzZWQgPSAnVU5BVVRIT1JJU0VEJyxcbiAgICBBdXRob3Jpc2VkID0gJ0FVVEhPUklTRUQnLFxuICAgIFJldm9rZWQgPSAnUkVWT0tFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUkVKRUNURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ09OU0VOVF9TVEFUVVNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCBmb3IgdGhlIGNvbnNlbnQgYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQYXltZW50IGNvbnNlbnQgdHlwZS4gRGVmaW5lcyBwb3NzaWJsZSB1c2UgY2FzZSBmb3IgcGF5bWVudHMgbWFkZSB3aXRoIHRoZSBnaXZlbiBjb25zZW50LiAgYFNXRUVQSU5HYDogQWxsb3dzIG1vdmluZyBtb25leSBiZXR3ZWVuIGFjY291bnRzIG93bmVkIGJ5IHRoZSBzYW1lIHVzZXIuICBgQ09NTUVSQ0lBTGA6IEFsbG93cyBpbml0aWF0aW5nIHBheW1lbnRzIGZyb20gdGhlIHVzZXJcXCdzIGFjY291bnQgdG8gdGhpcmQgcGFydGllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGUge1xuICAgIFN3ZWVwaW5nID0gJ1NXRUVQSU5HJyxcbiAgICBDb21tZXJjaWFsID0gJ0NPTU1FUkNJQUwnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyB3aGF0IHNwZWNpZmljIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMgd2hlbiBtYWtpbmcgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnRzIGZyb20gYSBkaWZmZXJlbnQgY291bnRyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX2ludGVybmF0aW9uYWxfcGF5bWVudHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIFNFUEEgSW5zdGFudCBwYXltZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3NlcGFfaW5zdGFudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIG1hcHBpbmcgb2YgY3VycmVuY3kgdG8gbWF4aW11bSBwYXltZW50IGFtb3VudCAoZGVub21pbmF0ZWQgaW4gdGhlIHNtYWxsZXN0IHVuaXQgb2YgY3VycmVuY3kpIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBFeGFtcGxlOiBge1xcXCJHQlBcXFwiOiBcXFwiMTAwMDBcXFwifWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4aW11bV9wYXltZW50X2Ftb3VudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHJldHVybmluZyByZWZ1bmQgZGV0YWlscyB3aGVuIGluaXRpYXRpbmcgYSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfcmVmdW5kX2RldGFpbHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhbmRpbmdfb3JkZXJfbWV0YWRhdGE6IFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcGF5bWVudCBjb25zZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3BheW1lbnRfY29uc2VudHM6IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB1c2VkIHRvIHJlc3RyaWN0IHRoZSBhY2NvdW50cyB1c2VkIGZvciBwYXltZW50cy4gSWYgcHJvdmlkZWQsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50UmVmdW5kZWR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgUGxhaWQgdG8gZWFjaCBwYXltZW50IGZvciB0cmFja2luZyBhbmQgcmVjb25jaWxpYXRpb24gcHVycG9zZXMuICBOb3RlOiBOb3QgYWxsIGJhbmtzIGhhbmRsZSBgZW5kX3RvX2VuZF9pZGAgY29uc2lzdGVudGx5LiBUbyBlbnN1cmUgYWNjdXJhdGUgbWF0Y2hpbmcsIGNsaWVudHMgc2hvdWxkIGNvbnZlcnQgYm90aCB0aGUgaW5jb21pbmcgYGVuZF90b19lbmRfaWRgIGFuZCB0aGUgb25lIHByb3ZpZGVkIGJ5IFBsYWlkIHRvIHRoZSBzYW1lIGNhc2UgKGVpdGhlciBsb3dlciBvciB1cHBlcikgYmVmb3JlIGNvbXBhcmlzb24uIEZvciB2aXJ0dWFsIGFjY291bnQgcGF5bWVudHMsIFBsYWlkIG1hbmFnZXMgdGhpcyBmaWVsZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGVuZF90b19lbmRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSW4gb3JkZXIgdG8gdHJhY2sgc2V0dGxlbWVudCB2aWEgUGF5bWVudCBDb25maXJtYXRpb24sIGVhY2ggcGF5bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIHRocm91Z2ggdGhlIEFQSSBpcyBub3QgdW5pcXVlLCBQbGFpZCB3aWxsIGFkanVzdCBpdC4gU29tZSBpbnN0aXR1dGlvbnMgbWF5IGxpbWl0IHRoZSByZWZlcmVuY2UgdG8gbGVzcyB0aGFuIDE4IGNoYXJhY3RlcnMuIElmIG5lY2Vzc2FyeSwgUGxhaWQgd2lsbCBhZGp1c3QgdGhlIHJlZmVyZW5jZSBieSB0cnVuY2F0aW5nIGl0IHRvIGZpdCB0aGUgaW5zdGl0dXRpb25cXCdzIHJlcXVpcmVtZW50cy4gQm90aCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBhbmQgYXV0b21hdGljYWxseSBhZGp1c3RlZCByZWZlcmVuY2VzIChpZiBhbnkpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYHJlZmVyZW5jZWAgYW5kIGBhZGp1c3RlZF9yZWZlcmVuY2VgIGZpZWxkcywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZvciBhIHBheW1lbnQgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCwgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUgdmFsdWU6ICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhlIGluaXRpYWwgcGhhc2Ugb2YgdGhlIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cyB7XG4gICAgUGF5bWVudFN0YXR1c0lucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgcGF5bWVudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFkanVzdGVkX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9kZXRhaWxzPzogRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbmRlckJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfaWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRSZWZ1bmRlZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCBieSBQbGFpZCB0byBlYWNoIHBheW1lbnQgZm9yIHRyYWNraW5nIGFuZCByZWNvbmNpbGlhdGlvbiBwdXJwb3Nlcy4gIE5vdGU6IE5vdCBhbGwgYmFua3MgaGFuZGxlIGBlbmRfdG9fZW5kX2lkYCBjb25zaXN0ZW50bHkuIFRvIGVuc3VyZSBhY2N1cmF0ZSBtYXRjaGluZywgY2xpZW50cyBzaG91bGQgY29udmVydCBib3RoIHRoZSBpbmNvbWluZyBgZW5kX3RvX2VuZF9pZGAgYW5kIHRoZSBvbmUgcHJvdmlkZWQgYnkgUGxhaWQgdG8gdGhlIHNhbWUgY2FzZSAoZWl0aGVyIGxvd2VyIG9yIHVwcGVyKSBiZWZvcmUgY29tcGFyaXNvbi4gRm9yIHZpcnR1YWwgYWNjb3VudCBwYXltZW50cywgUGxhaWQgbWFuYWdlcyB0aGlzIGZpZWxkIGF1dG9tYXRpY2FsbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfdG9fZW5kX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW1lbnRzIHRvIHJldHVybi4gSWYgYGNvdW50YCBpcyBub3Qgc3BlY2lmaWVkLCBhIG1heGltdW0gb2YgMTAgcGF5bWVudHMgd2lsbCBiZSByZXR1cm5lZCwgYmVnaW5uaW5nIHdpdGggdGhlIG1vc3QgcmVjZW50IHBheW1lbnQgYmVmb3JlIHRoZSBjdXJzb3IgKGlmIHNwZWNpZmllZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIFxcXCIyMDE5LTEyLTA2VDIyOjM1OjQ5WlxcXCIpLiBPbmx5IHBheW1lbnRzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjdXJzb3Igd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuIElmIHNwZWNpZmllZCwgb25seSBwYXltZW50cywgZXhlY3V0ZWQgdXNpbmcgdGhpcyBjb25zZW50LCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfaWRgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblBheW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhhdCwgd2hlbiB1c2VkIGFzIHRoZSBvcHRpb25hbCBgY3Vyc29yYCBwYXJhbWV0ZXIgdG8gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCwgd2lsbCByZXR1cm4gdGhlIG5leHQgdW5yZXR1cm5lZCBwYXltZW50IGFzIGl0cyBmaXJzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudCB0byByZXZlcnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSByZWZ1bmQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRUb1JlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBQYXltZW50QW1vdW50VG9SZWZ1bmQ7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5X2RhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5X2FkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlZnVuZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBwYXltZW50LiAgQ29yZSBsaWZlY3ljbGUgc3RhdHVzZXM6ICAqKmBQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERURgKio6IFRyYW5zaXRpb25hbC4gVGhlIHBheW1lbnQgaXMgYXdhaXRpbmcgdXNlciBpbnB1dCB0byBjb250aW51ZSBwcm9jZXNzaW5nLiBJdCBtYXkgcmUtZW50ZXIgdGhpcyBzdGF0ZSBpZiBhZGRpdGlvbmFsIGlucHV0IGlzIHJlcXVpcmVkLiAgKipgUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkdgOioqIFRyYW5zaXRpb25hbC4gVGhlIHBheW1lbnQgaXMgYmVpbmcgYXV0aG9yaXNlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgbW92ZSBvbiBvbmNlIGF1dGhvcmlzYXRpb24gY29tcGxldGVzLiAgKipgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYDoqKiBUaGUgcGF5bWVudCBoYXMgYmVlbiBhdXRob3Jpc2VkIGFuZCBhY2NlcHRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJbiBtYW55IEVVIG1hcmtldHMsIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGAgaXMgbm90IHN1cHBvcnRlZCwgYW5kIGEgcGF5bWVudCB3aWxsIHJlbWFpbiBpbiBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYCB1bnRpbCB0aGUgZnVuZHMgc2V0dGxlLCBtYWtpbmcgdGhpcyBhIHRlcm1pbmFsIHN1Y2Nlc3Mgc3RhdGUgaW4gdGhvc2UgY2FzZXMuIEEgcGF5bWVudCBpbiBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgcGF5bWVudDsgZG8gbm90IGdhdGUgZG93bnN0cmVhbSBwcm9jZXNzaW5nIG9uIHJlYWNoaW5nIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGAuIEZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2YgcGF5bWVudCBzdGF0dXNlcyBhbmQgaG93IHRvIGhhbmRsZSBlYWNoLCBzZWUgdGhlIFtQYXltZW50IFN0YXR1cyBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9wYXltZW50LWluaXRpYXRpb24vcGF5bWVudC1zdGF0dXMvKS4gICoqYFBBWU1FTlRfU1RBVFVTX0VYRUNVVEVEYDogVGVybWluYWwuKiogVGhlIGZ1bmRzIGhhdmUgbGVmdCB0aGUgcGF5ZXJcXCdzIGFjY291bnQgYW5kIHRoZSBwYXltZW50IGlzIGVuIHJvdXRlIHRvIHNldHRsZW1lbnQuIE5vdGUgdGhhdCB0aGlzIHN0YXR1cyBkb2VzIG5vdCBjb25maXJtIHRoYXQgZnVuZHMgaGF2ZSBhcnJpdmVkIGluIHRoZSByZWNpcGllbnRcXCdzIGFjY291bnQ7IGRvIG5vdCB1c2UgaXQgYXMgcHJvb2Ygb2YgZnVuZCByZWNlaXB0LiBTdXBwb3J0IGlzIG1vcmUgY29tbW9uIGluIHRoZSBVSyB0aGFuIGluIHRoZSBFVTsgd2hlcmUgdW5zdXBwb3J0ZWQsIGEgc3VjY2Vzc2Z1bCBwYXltZW50IHJlbWFpbnMgaW4gYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGAgYmVmb3JlIHNldHRsaW5nLiBXaGVuIHVzaW5nIFBsYWlkIFZpcnR1YWwgQWNjb3VudHMsIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGAgaXMgbm90IHRlcm1pbmFsIC0tIHRoZSBwYXltZW50IHdpbGwgY29udGludWUgdG8gYFBBWU1FTlRfU1RBVFVTX1NFVFRMRURgIG9uY2UgZnVuZHMgYXJlIGF2YWlsYWJsZS4gICoqYFBBWU1FTlRfU1RBVFVTX1NFVFRMRURgOiBUZXJtaW5hbC4qKiBUaGUgZnVuZHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgcmVjaXBpZW50XFwncyBhY2NvdW50LiBPbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgdXNpbmcgW1BsYWlkIFZpcnR1YWwgQWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcGF5bWVudC1pbml0aWF0aW9uL3ZpcnR1YWwtYWNjb3VudHMvKS4gIEZhaWx1cmUgc3RhdHVzZXM6ICAqKmBQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFNgOiBUZXJtaW5hbC4qKiBUaGUgcGF5bWVudCBmYWlsZWQgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gTm8gZnVydGhlciByZXRyaWVzIHdpbGwgc3VjY2VlZCB1bnRpbCB0aGUgcGF5ZXJcXCdzIGJhbGFuY2UgaXMgcmVwbGVuaXNoZWQuICAqKmBQQVlNRU5UX1NUQVRVU19GQUlMRURgOiBUZXJtaW5hbCAocmV0cnlhYmxlKS4qKiBUaGUgcGF5bWVudCBjb3VsZCBub3QgYmUgaW5pdGlhdGVkIGR1ZSB0byBhIHN5c3RlbSBlcnJvciBvciBvdXRhZ2UuIFJldHJ5IG9uY2UgdGhlIHJvb3QgY2F1c2UgaXMgcmVzb2x2ZWQuICAqKmBQQVlNRU5UX1NUQVRVU19CTE9DS0VEYDogVGVybWluYWwgKHJldHJ5YWJsZSkuKiogVGhlIHBheW1lbnQgd2FzIGJsb2NrZWQgYnkgUGxhaWQgKGUuZy4sIGZsYWdnZWQgYXMgcmlza3kpLiBSZXNvbHZlIGFueSBjb21wbGlhbmNlIG9yIHJpc2sgaXNzdWVzIGFuZCByZXRyeS4gICoqYFBBWU1FTlRfU1RBVFVTX1JFSkVDVEVEYDogVGVybWluYWwuKiogVGhlIHBheW1lbnQgd2FzIHJlamVjdGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE5vIGF1dG9tYXRpYyByZXRyeSBpcyBwb3NzaWJsZS4gICoqYFBBWU1FTlRfU1RBVFVTX0NBTkNFTExFRGA6IFRlcm1pbmFsLioqIFRoZSBlbmQgdXNlciBjYW5jZWxsZWQgdGhlIHBheW1lbnQgZHVyaW5nIGF1dGhvcmlzYXRpb24uICBTdGFuZGluZy1vcmRlciBzdGF0dXNlczogICoqYFBBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEYDogVGVybWluYWwuKiogQSByZWN1cnJpbmcvc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuICBEZXByZWNhdGVkICh0byBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UpOiAgYFBBWU1FTlRfU1RBVFVTX1VOS05PV05gOiBUaGUgcGF5bWVudCBzdGF0dXMgaXMgdW5rbm93bi4gIGBQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIGBQQVlNRU5UX1NUQVRVU19DT01QTEVURURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzIHtcbiAgICBJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lORycsXG4gICAgSW5pdGlhdGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRCcsXG4gICAgQ29tcGxldGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRCcsXG4gICAgSW5zdWZmaWNpZW50RnVuZHMgPSAnUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTJyxcbiAgICBGYWlsZWQgPSAnUEFZTUVOVF9TVEFUVVNfRkFJTEVEJyxcbiAgICBCbG9ja2VkID0gJ1BBWU1FTlRfU1RBVFVTX0JMT0NLRUQnLFxuICAgIFVua25vd24gPSAnUEFZTUVOVF9TVEFUVVNfVU5LTk9XTicsXG4gICAgRXhlY3V0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfRVhFQ1VURUQnLFxuICAgIFNldHRsZWQgPSAnUEFZTUVOVF9TVEFUVVNfU0VUVExFRCcsXG4gICAgQXV0aG9yaXNpbmcgPSAnUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkcnLFxuICAgIENhbmNlbGxlZCA9ICdQQVlNRU5UX1NUQVRVU19DQU5DRUxMRUQnLFxuICAgIEVzdGFibGlzaGVkID0gJ1BBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEJyxcbiAgICBSZWplY3RlZCA9ICdQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYHBheW1lbnRfdG9rZW5gIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgdGhlIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgdG9rZW4gd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgcGF5bWVudF90b2tlbmAgZXhwaXJlcyBhZnRlciAxNSBtaW51dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Rva2VuX2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHJlY2lwaWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdlIHJlY29tbWVuZCB1c2luZyBzdHJpbmdzIG9mIGxlbmd0aCAxOCBvciBsZXNzIGFuZCBhdm9pZCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBhbGwgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC4gSWYgQmFjcyBkYXRhIGlzIG5vdCBwcm92aWRlZCwgYW4gSUJBTiBpcyByZXF1aXJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2ZcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVjaXBpZW50cyB0byByZXR1cm4uIElmIGBjb3VudGAgaXMgbm90IHNwZWNpZmllZCwgYSBtYXhpbXVtIG9mIDEwMCByZWNpcGllbnRzIHdpbGwgYmUgcmV0dXJuZWQsIGJlZ2lubmluZyB3aXRoIHRoZSByZWNpcGllbnQgYXQgdGhlIGN1cnNvciAoaWYgc3BlY2lmaWVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgcmVjaXBpZW50IHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZS4gU2V0IHRoaXMgZnJvbSBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIHRoYXQgcmVjaXBpZW50IGFuZCByZWNpcGllbnRzIGNyZWF0ZWQgYmVmb3JlIGl0LiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHJlY2lwaWVudHMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IHJlY2lwaWVudHMgY3JlYXRlZCBmb3IgUGF5bWVudCBJbml0aWF0aW9uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSB0aGF0LCB3aGVuIHVzZWQgYXMgdGhlIG9wdGlvbmFsIGBjdXJzb3JgIHBhcmFtZXRlciB0byBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAsIHdpbGwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlY2lwaWVudCBhcyBpdHMgZmlyc3QgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHZhbGlkIFBheW1lbnQgSW5pdGlhdGlvbiBzdGFuZGluZyBvcmRlciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgY2xvc2VkLWVuZGVkIHN0YW5kaW5nIG9yZGVycyBieSBwcm92aWRpbmcgYW4gZW5kIGRhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfZW5kX2RhdGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVycy4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIG5lZ2F0aXZlIGludGVnZXJzICgtMSB0byAtNSkgZm9yIHNldHRpbmcgdXAgYSBgTU9OVEhMWWAgc3RhbmRpbmcgb3JkZXIgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfbmVnYXRpdmVfZXhlY3V0aW9uX2RheXM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSB2YWxpZCBzdGFuZGluZyBvcmRlciBpbnRlcnZhbHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHZhbGlkX3N0YW5kaW5nX29yZGVyX2ludGVydmFsczogQXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBpbnRlci1iYW5rIHRyYW5zZmVycy4gSWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBub3QgYW4gaW50ZXItYmFuayB0cmFuc2ZlciwgYWxsIGZpZWxkcyB3aWxsIGJlIGBudWxsYC4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhlIGBwYXltZW50X21ldGFgIGtleSB3aWxsIGFsd2F5cyBhcHBlYXIsIGJ1dCBubyBkYXRhIGVsZW1lbnRzIGFyZSBndWFyYW50ZWVkLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50TWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRNZXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIG51bWJlciBzdXBwbGllZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVmZXJlbmNlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIFBQRCBJRCBmb3IgdGhlIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcHBkX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHJlY2VpdmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydHkgaW5pdGlhdGluZyBhIHdpcmUgdHJhbnNmZXIuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgYSB3aXJlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgYnlfb3JkZXJfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHRyYW5zZmVycywgdGhlIHBhcnR5IHRoYXQgaXMgcGF5aW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLCBlLmcuIFxcJ0FDSFxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheW1lbnQgcHJvY2Vzc29yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2Nlc3Nvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyB1cGRhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGNyZWF0ZWQgYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgZGVsZXRlZCBhdC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgUGF5bWVudCBQcm9maWxlIGhhcyBub3QgYmVlbiBkZWxldGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRlbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRQcm9maWxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50UHJvZmlsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSBkYXRhIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gIGBSRUFEWWA6IFRoaXMgUGF5bWVudCBQcm9maWxlIGlzIHJlYWR5IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLiAgYFBFTkRJTkdgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBpcyBub3QgcmVhZHkgdG8gYmUgdXNlZC4gWW91XFwnbGwgbmVlZCB0byBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQgdG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLiAgYFJFTU9WRURgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBoYXMgYmVlbiByZW1vdmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFByb2ZpbGVTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAnUEVORElORycsXG4gICAgUmVhZHkgPSAnUkVBRFknLFxuICAgIFJlbW92ZWQgPSAnUkVNT1ZFRCdcbn1cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGludGVydmFsIG9mIHRoZSBwYXltZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWwge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBQYXltZW50IHNjaGVtZS4gSWYgbm90IHNwZWNpZmllZCAtIHRoZSBkZWZhdWx0IGluIHRoZSByZWdpb24gd2lsbCBiZSB1c2VkIChlLmcuIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmAgZm9yIEVVKS4gSW4gcmVzcG9uc2VzLCBpZiB0aGUgc2NoZW1lIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC4gVXNpbmcgdW5zdXBwb3J0ZWQgdmFsdWVzIHdpbGwgcmVzdWx0IGluIGEgZmFpbGVkIHBheW1lbnQuICBgTE9DQUxfREVGQVVMVGA6IFRoZSBkZWZhdWx0IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQuICBgTE9DQUxfSU5TVEFOVGA6IFRoZSBpbnN0YW50IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQgKGlmIGFwcGxpY2FibGUpLiBGZWVzIG1heSBiZSBhcHBsaWVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gTWF5IGludm9sdmUgYWRkaXRpb25hbCBmZWVzIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSBhdCBzb21lIGJhbmtzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBMb2NhbERlZmF1bHQgPSAnTE9DQUxfREVGQVVMVCcsXG4gICAgTG9jYWxJbnN0YW50ID0gJ0xPQ0FMX0lOU1RBTlQnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgaGFzIGNoYW5nZWQuIEZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2YgcGF5bWVudCBzdGF0dXNlcyBhbmQgaG93IHRvIGhhbmRsZSBlYWNoLCBzZWUgdGhlIFtQYXltZW50IFN0YXR1cyBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9wYXltZW50LWluaXRpYXRpb24vcGF5bWVudC1zdGF0dXMvKS4gIE5vdGU6IFBsYWlkIHBheW1lbnQgc3RhdHVzZXMgZG8gbm90IGNvbnN0aXR1dGUgcHJvb2YgdGhhdCBmdW5kcyBoYXZlIGFycml2ZWQgaW4gdGhlIHJlY2lwaWVudFxcJ3MgYWNjb3VudC4gRG8gbm90IHVzZSBgbmV3X3BheW1lbnRfc3RhdHVzYCB0byBjb25maXJtIGZ1bmQgc2V0dGxlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfSU5JVElBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVlNRU5UX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIGZvciB0aGUgcGF5bWVudCBiZWluZyB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfcGF5bWVudF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9sZF9wYXltZW50X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHdoZW4gY3JlYXRpbmcgdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9yZWZlcmVuY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGBzdGFydF9kYXRlYCBwcm92aWRlZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIGEgc3RhbmRpbmcgb3JkZXIuIElmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYWxfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCBvciBpZiB0aGUgcGF5bWVudCBpcyBub3QgYSBzdGFuZGluZyBvcmRlciwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgdXBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGFjY291bnQgbGV2ZWwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEluY29tZUFjY291bnREYXRhIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXJvbGxJbmNvbWVSYXRlT2ZQYXl9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIHJhdGVfb2ZfcGF5OiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5O1xuICAgIC8qKlxuICAgICAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgcGF5cm9sbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEluY29tZU9iamVjdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXkgc3R1YnMgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRQYXlTdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIHBheV9zdHViczogQXJyYXk8Q3JlZGl0UGF5U3R1Yj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdGF4IGZvcm0gVy0ycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0VzI+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgdzJzOiBBcnJheTxDcmVkaXRXMj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdGF4IGZvcm0gMTA5OXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdDEwOTk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgZm9ybTEwOTlzOiBBcnJheTxDcmVkaXQxMDk5Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmF0ZSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmF0ZSBhdCB3aGljaCBhbiBlbXBsb3llZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAgICAgKi9cbiAgICBwYXlfcmF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBhdCB3aGljaCBhbiBlbXBsb3llZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAgICAgKi9cbiAgICBwYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBheXJvbGwgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlyb2xsSW5jb21lQWNjb3VudERhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxQYXlyb2xsSW5jb21lQWNjb3VudERhdGE+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlyb2xsSW5jb21lT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBwYXlyb2xsX2luY29tZTogQXJyYXk8UGF5cm9sbEluY29tZU9iamVjdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXJvbGxJdGVtU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5cm9sbEl0ZW1TdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhhdCB0aGUgSXRlbSB3YXMgdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgcGF5cm9sbCBpdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSXRlbVN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJdGVtU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHRoZSBwcm9jZXNzaW5nIHN0YXR1cyBmb3IgdGhlIHZlcmlmaWNhdGlvbi4gIGBVTktOT1dOYDogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkIGFuZCB0aGUgdXNlciBoYXMgYXBwcm92ZWQgZm9yIHNoYXJpbmcuIFRoZSBkYXRhIGlzIGF2YWlsYWJsZSB0byBiZSByZXRyaWV2ZWQuICBgUFJPQ0VTU0lOR2A6IFRoZSB2ZXJpZmljYXRpb24gaXMgc3RpbGwgcHJvY2Vzc2luZy4gVGhlIGRhdGEgaXMgbm90IGF2YWlsYWJsZSB5ZXQuICBgRkFJTEVEYDogVGhlIHByb2Nlc3NpbmcgZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4gIGBBUFBST1ZBTF9TVEFUVVNfUEVORElOR2A6IFRoZSBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQgYnV0IHRoZSB1c2VyIGhhcyBub3QgeWV0IGFwcHJvdmVkIHRoZSBzaGFyaW5nIG9mIHRoZSBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtU3RhdHVzXG4gICAgICovXG4gICAgcHJvY2Vzc2luZ19zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmcmF1ZCByaXNrIGRhdGEgcGVydGFpbmluZyB0byB0aGUgSXRlbSBsaW5rZWQgYXMgcGFydCBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbFJpc2tTaWduYWxzSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcGF5cm9sbCBpbmNvbWUgZG9jdW1lbnQgYXV0aGVudGljaXR5IGRhdGEgcmV0cmlldmVkIGZvciBlYWNoIG9mIHRoZSB1c2VyXFwncyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdD59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW1cbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fcmlza19zaWduYWxzOiBBcnJheTxEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZWR1Y3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZGVkdWN0aW9uczogRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZG9jX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vhcm5pbmdzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZWFybmluZ3M6IEVhcm5pbmdzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95ZXI6IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95bWVudERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfZGV0YWlscz86IEVtcGxveW1lbnREZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXRQYXl9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBuZXRfcGF5OiBOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2RldGFpbHM6IFBheVBlcmlvZERldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwYXlzdHViX2RldGFpbHM/OiBQYXlzdHViRGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX2JyZWFrZG93bj86IEFycmF5PEluY29tZUJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJZVEREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB5dGRfZWFybmluZ3M/OiBQYXlzdHViWVRERGV0YWlscztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgcGF5c3R1YlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RyZWV0IGFkZHJlc3MgbGluZSAxLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsaW5lMT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RyZWV0IGFkZHJlc3MgbGluZSAyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsaW5lMj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3RhdGVfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZHVjdGlvbiBvbiB0aGUgcGF5c3R1YlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRGVkdWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWR1Y3Rpb24sIGFzIHByb3ZpZGVkIG9uIHRoZSBwYXlzdHViLiBGb3IgZXhhbXBsZTogYFxcXCI0MDEoaylcXFwiYCwgYFxcXCJGSUNBIE1FRCBUQVhcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGRlZHVjdGlvbiBpcyBwcmUtdGF4OyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIGlzX3ByZXRheDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkZXRhaWxzIHRoYXQgY2FuIGJlIGZvdW5kIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBCZWdpbm5pbmcgZGF0ZSBvZiB0aGUgcGF5IHBlcmlvZCBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX3N0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZGluZyBkYXRlIG9mIHRoZSBwYXkgcGVyaW9kIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBheSBkYXRlIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciB0aGF0IGdlbmVyYXRlZCB0aGUgcGF5c3R1YiwgZS5nLiBBRFBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheXN0dWJfcHJvdmlkZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlzdHViUGF5RnJlcXVlbmN5IHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5c3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGF0YSBmcm9tIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbXBsb3llZT86IFBheXN0dWJPdmVycmlkZUVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV9icmVha2Rvd24/OiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVOZXRQYXl9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIG5ldF9wYXk/OiBQYXlzdHViT3ZlcnJpZGVOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZURlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM/OiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZWFybmluZ3M/OiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzPzogUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlscztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBicmVha2Rvd24/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw/OiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbCB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgdG90YWwgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50cyB0aGF0IHRoZSBwYXltZW50IHdhcyBkaXN0cmlidXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYmFua19uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXlzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsPzogUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWwge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBob3VycyB3b3JrZWQgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3Vycz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgZm9yIHRoZSB0b3RhbCBlYXJuaW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGVtcGxveWVlIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYHNpbmdsZWAgb3IgYG1hcnJpZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkPzogUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBvZiB0aGUgZW1wbG95ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDUgZGlnaXQgcG9zdGFsIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50cnkgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZU5ldFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZU5ldFBheSB7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5XG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd24/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwYXlfZGF5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBzdGFydCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRheHBheWVyIElEIG9mIHRoZSBpbmRpdmlkdWFsIHJlY2VpdmluZyB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVRheHBheWVySUQge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgSUQsIGUuZy4gXFwnU1NOXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG1hc2s7IGkuZS4gbGFzdCA0IGRpZ2l0cyBvZiB0aGUgdGF4cGF5ZXIgSURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfbWFzaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggdGhlIGVtcGxveWVlIGlzIHBhaWQuIFBvc3NpYmxlIHZhbHVlczogYE1PTlRITFlgLCBgQkktV0VFS0xZYCwgYFdFRUtMWWAsIGBTRU1JLU1PTlRITFlgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5c3R1YlBheUZyZXF1ZW5jeSB7XG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBCaVdlZWtseSA9ICdCSS1XRUVLTFknLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUktTU9OVEhMWScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgb2YgaW5jb21lIGVhcm5lZCB5ZWFyIHRvIGRhdGUsIGFzIGJhc2VkIG9uIHBheXN0dWIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YllURERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogWWVhci10by1kYXRlIGdyb3NzIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBuZXQgKHRha2UgaG9tZSkgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YllURERldGFpbHNcbiAgICAgKi9cbiAgICBuZXRfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaXMgZXhwZWN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkLiBUaGUgd2ViaG9vayB3aWxsIGN1cnJlbnRseSBiZSBmaXJlZCA3IGRheXMgYmVmb3JlIHRoZSBleGlzdGluZyBJdGVtIGlzIHNjaGVkdWxlZCBmb3IgZGlzY29ubmVjdGlvbi4gVGhpcyBjYW4gYmUgcmVzb2x2ZWQgYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBDdXJyZW50bHksIHRoaXMgd2ViaG9vayBpcyBmaXJlZCBvbmx5IGZvciBVUyBvciBDYW5hZGlhbiBpbnN0aXR1dGlvbnM7IGluIHRoZSBVSyBvciBFVSwgeW91IHNob3VsZCBjb250aW51ZSB0byBsaXN0ZW4gZm9yIHRoZSBbYFBFTkRJTkdfRVhQSVJBVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNwZW5kaW5nX2V4cGlyYXRpb24pIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEVORElOR19ESVNDT05ORUNUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIHJlYXNvbjogUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rUmVhc29uO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBJdGVtIGlzIHNjaGVkdWxlZCB0byBkaXNjb25uZWN0LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgZGlzY29ubmVjdF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVhc29uIHdoeSB0aGUgSXRlbSBpcyBhYm91dCB0byBiZSBkaXNjb25uZWN0ZWQuIGBJTlNUSVRVVElPTl9NSUdSQVRJT05gOiBUaGUgaW5zdGl0dXRpb24gaXMgbW92aW5nIHRvIEFQSSBvciB0byBhIGRpZmZlcmVudCBpbnRlZ3JhdGlvbi4gRm9yIGV4YW1wbGUsIHRoaXMgY2FuIG9jY3VyIHdoZW4gYW4gaW5zdGl0dXRpb24gbW92ZXMgZnJvbSBhIG5vbi1PQXV0aCBpbnRlZ3JhdGlvbiB0byBhbiBPQXV0aCBpbnRlZ3JhdGlvbi4gYElOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT05gOiBUaGUgY29uc2VudCBvbiBhbiBJdGVtIGFzc29jaWF0ZWQgd2l0aCBhIFVTIG9yIENBIGluc3RpdHV0aW9uIGlzIGFib3V0IHRvIGV4cGlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1JlYXNvbiB7XG4gICAgTWlncmF0aW9uID0gJ0lOU1RJVFVUSU9OX01JR1JBVElPTicsXG4gICAgVG9rZW5FeHBpcmF0aW9uID0gJ0lOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT04nXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBhY2Nlc3MgY29uc2VudCBpcyBleHBpcmluZyBpbiA3IGRheXMuIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmtcXCdzIHVwZGF0ZSBtb2RlLiBUaGlzIHdlYmhvb2sgaXMgZmlyZWQgb25seSBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgKGluY2x1ZGluZyB0aGUgVUspOyBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgb3IgQ2FuYWRhLCBzZWUgW2BQRU5ESU5HX0RJU0NPTk5FQ1RgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jcGVuZGluZ19kaXNjb25uZWN0KSBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQRU5ESU5HX0VYUElSQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBwZXJzb25hbCBmaW5hbmNlIHVzZSBjYXNlcywgYnV0IG5vdCBsaW1pdGVkIHRvIHN1Y2ggdXNlIGNhc2VzLiAgU2VlIHRoZSBbdGF4b25vbXkgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wZmMtdGF4b25vbXktYWxsLmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gSWYgeW91IGFyZSBtaWdyYXRpbmcgdG8gcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGZyb20gdGhlIGxlZ2FjeSBjYXRlZ29yaWVzLCBhbHNvIHJlZmVyIHRvIHRoZSBbbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9wZmMtbWlncmF0aW9uLykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkge1xuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgcHJpbWFyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZ3JhbnVsYXIgY2F0ZWdvcnkgY29udmV5aW5nIHRoZSB0cmFuc2FjdGlvblxcJ3MgaW50ZW50LiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgZGV0YWlsZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNhdGVnb3JpZXMgYWNjdXJhdGVseSBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24gaW50ZW50LiAgYFZFUllfSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTglIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBISUdIYDogV2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBMT1dgOiBUaGlzIGNhdGVnb3J5IG1heSByZWZsZWN0IHRoZSBpbnRlbnQsIGJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgY2F0ZWdvcmllcyB0aGF0IGFyZSBtb3JlIGFjY3VyYXRlLiBgVU5LTk9XTmA6IFdlIGRvblxcJ3Qga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgdmVyc2lvbj86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoaWNoIHZlcnNpb24gb2YgdGhlIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdGF4b25vbXkgaXMgYmVpbmcgdXNlZC4gW1ZpZXcgUEZDdjIgYW5kIFBGQ3YxIHRheG9ub21pZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wZmMtdGF4b25vbXktYWxsLmNzdikuICBJZiB5b3UgZW5hYmxlZCBUcmFuc2FjdGlvbnMgb3IgRW5yaWNoIGJlZm9yZSBEZWNlbWJlciAyMDI1IHlvdSB3aWxsIHJlY2VpdmUgdGhlIGB2MWAgdGF4b25vbXkgYnkgZGVmYXVsdCBhbmQgbWF5IHJlcXVlc3QgYHYyYCBieSBleHBsaWNpdGx5IHNldHRpbmcgdGhpcyBmaWVsZCB0byBgdjJgIGluIHRoZSByZXF1ZXN0LiAgSWYgeW91IGVuYWJsZWQgVHJhbnNhY3Rpb25zIG9yIEVucmljaCBvbiBvciBhZnRlciBEZWNlbWJlciAyMDI1LCB5b3UgbWF5IG9ubHkgcmVjZWl2ZSB0aGUgYHYyYCB0YXhvbm9teS4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb24ge1xuICAgIFYxID0gJ3YxJyxcbiAgICBWMiA9ICd2Midcbn1cblxuLyoqXG4gKiBBIHBob25lIG51bWJlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBwaG9uZSBudW1iZXIgYXMgdGhlIHByaW1hcnkgbnVtYmVyIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBQaG9uZU51bWJlclR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFBob25lTnVtYmVyVHlwZUVudW0ge1xuICAgIEhvbWUgPSAnaG9tZScsXG4gICAgV29yayA9ICd3b3JrJyxcbiAgICBPZmZpY2UgPSAnb2ZmaWNlJyxcbiAgICBNb2JpbGUgPSAnbW9iaWxlJyxcbiAgICBNb2JpbGUxID0gJ21vYmlsZTEnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIHBob25lIG51bWJlciBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIHBob25lIG51bWJlciBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaG9uZU51bWJlck1hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIHBob25lIG51bWJlci4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktNzAgaXMgYSBwYXJ0aWFsIG1hdGNoIChtYXRjaGluZyB0aGUgc2FtZSBwaG9uZSBudW1iZXIgd2l0aCBleHRlbnNpb24gYWdhaW5zdCBvbmUgd2l0aG91dCBleHRlbnNpb24sIGV0Yy4pLCBhbnl0aGluZyBiZWxvdyA3MCBpcyBjb25zaWRlcmVkIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgcGhvbmUgbnVtYmVyIGlzIGEgcGhvbmUgbGluZSBvciBhIGZheCBsaW5lLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGhvbmVUeXBlIHtcbiAgICBQaG9uZSA9ICdwaG9uZScsXG4gICAgRmF4ID0gJ2ZheCdcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpZGVudGl0eSBkb2N1bWVudCBkZXRlY3RlZCBpbiB0aGUgaW1hZ2VzIHByb3ZpZGVkLiBXaWxsIGFsd2F5cyBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgIGBkcml2ZXJzX2xpY2Vuc2VgIC0gQSBkcml2ZXJcXCdzIGxpY2Vuc2UgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnksIGVzdGFibGlzaGluZyBpZGVudGl0eSB3aXRob3V0IGFueSBndWFyYW50ZWUgYXMgdG8gY2l0aXplbnNoaXAsIGFuZCBncmFudGluZyBkcml2aW5nIHByaXZpbGVnZXMgICAgYGlkX2NhcmRgIC0gQSBnZW5lcmFsIG5hdGlvbmFsIGlkZW50aWZpY2F0aW9uIGNhcmQsIGRpc3RpbmN0IGZyb20gZHJpdmVyXFwncyBsaWNlbnNlcyBhcyBpdCBvbmx5IGVzdGFibGlzaGVzIGlkZW50aXR5ICAgIGBwYXNzcG9ydGAgLSBBIHRyYXZlbCBwYXNzcG9ydCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBmb3Igb25lIG9mIGl0cyBjaXRpemVucyAgICBgcmVzaWRlbmNlX3Blcm1pdF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnRlbXBvcmFyaWx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGByZXNpZGVudF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnBlcm1hbmVudGx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGB2aXNhYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gZW50cnkgZm9yIGEgc2hvcnQgZHVyYXRpb24gYW5kIGZvciBhIHNwZWNpZmljIHB1cnBvc2UsIHR5cGljYWxseSBubyBsb25nZXIgdGhhbiA2IG1vbnRocyAgTm90ZTogVGhpcyB2YWx1ZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIElEIHR5cGUgdGhhdCB0aGUgdXNlciBzZWxlY3RzIHdpdGhpbiBMaW5rLiBGb3IgZXhhbXBsZSwgaWYgdGhleSBzZWxlY3QgXFxcIkRyaXZlclxcJ3MgTGljZW5zZVxcXCIgYnV0IHRoZW4gc3VibWl0IGEgcGljdHVyZSBvZiBhIHBhc3Nwb3J0LCB0aGlzIGZpZWxkIHdpbGwgc2F5IGBwYXNzcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeSB7XG4gICAgRHJpdmVyc0xpY2Vuc2UgPSAnZHJpdmVyc19saWNlbnNlJyxcbiAgICBJZENhcmQgPSAnaWRfY2FyZCcsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFJlc2lkZW5jZVBlcm1pdENhcmQgPSAncmVzaWRlbmNlX3Blcm1pdF9jYXJkJyxcbiAgICBSZXNpZGVudENhcmQgPSAncmVzaWRlbnRfY2FyZCcsXG4gICAgVmlzYSA9ICd2aXNhJ1xufVxuXG4vKipcbiAqIERhdGEgZXh0cmFjdGVkIGZyb20gYSB1c2VyLXN1Ym1pdHRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB7XG4gICAgLyoqXG4gICAgICogQWxwaGEtbnVtZXJpYyBJRCBudW1iZXIgZXh0cmFjdGVkIHZpYSBPQ1IgZnJvbSB0aGUgdXNlclxcJ3MgZG9jdW1lbnQgaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogUGh5c2ljYWxEb2N1bWVudENhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgb2YgdGhlIGRvY3VtZW50IGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpc3N1ZSBkYXRlIG9mIHRoZSBkb2N1bWVudCBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZS4gXFxcIlN1YmRpdmlzaW9uXFxcIiBpcyBhIGdlbmVyaWMgdGVybSBmb3IgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIGV0Yy4gRm9yIHRoZSBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpc3N1aW5nX3JlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBzdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnROYW1lTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogRG9jdW1lbnROYW1lTWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXhwaXJhdGlvbkRhdGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IEV4cGlyYXRpb25EYXRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1aW5nQ291bnRyeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogSXNzdWluZ0NvdW50cnk7XG59XG4vKipcbiAqIFVSTHMgZm9yIGRvd25sb2FkaW5nIG9yaWdpbmFsIGFuZCBjcm9wcGVkIGltYWdlcyBmb3IgdGhpcyBkb2N1bWVudCBzdWJtaXNzaW9uLiBUaGUgVVJMcyBhcmUgZGVzaWduZWQgdG8gb25seSBhbGxvdyBkb3dubG9hZGluZywgbm90IGhvdCBsaW5raW5nLCBzbyB0aGUgVVJMIHdpbGwgb25seSBzZXJ2ZSB0aGUgZG9jdW1lbnQgaW1hZ2UgZm9yIDYwIHNlY29uZHMgYmVmb3JlIGV4cGlyaW5nLiBUaGUgZXhwaXJhdGlvbiB0aW1lIGlzIDYwIHNlY29uZHMgYWZ0ZXIgdGhlIGBHRVRgIHJlcXVlc3QgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiBBIG5ldyBleHBpcmluZyBVUkwgaXMgZ2VuZXJhdGVkIHdpdGggZWFjaCByZXF1ZXN0LCBzbyB5b3UgY2FuIGFsd2F5cyByZXJlcXVlc3QgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlmIG9uZSBvZiB5b3VyIFVSTHMgZXhwaXJlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXMge1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIHRoZSB1bmNyb3BwZWQgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGZyb250IG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgb3JpZ2luYWxfZnJvbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgdGhlIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudC4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQgd2FzIG5vdCBjb2xsZWN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIG9yaWdpbmFsX2JhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wcGVkIGltYWdlIGNvbnRhaW5pbmcganVzdCB0aGUgZnJvbnQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBjcm9wcGVkX2Zyb250OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcHBlZCBpbWFnZSBjb250YWluaW5nIGp1c3QgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50LiBNaWdodCBiZSBudWxsIGlmIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudCB3YXMgbm90IGNvbGxlY3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgY3JvcHBlZF9iYWNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcCBvZiBqdXN0IHRoZSB1c2VyXFwncyBmYWNlIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLiBNaWdodCBiZSBudWxsIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGEgZmFjZSBwaG90by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgZmFjZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRXJyb3JzIGFyZSBpZGVudGlmaWVkIGJ5IGBlcnJvcl9jb2RlYCBhbmQgY2F0ZWdvcml6ZWQgYnkgYGVycm9yX3R5cGVgLiBVc2UgdGhlc2UgaW4gcHJlZmVyZW5jZSB0byBIVFRQIHN0YXR1cyBjb2RlcyB0byBpZGVudGlmeSBhbmQgaGFuZGxlIHNwZWNpZmljIGVycm9ycy4gSFRUUCBzdGF0dXMgY29kZXMgYXJlIHNldCBhbmQgcHJvdmlkZSB0aGUgYnJvYWRlc3QgY2F0ZWdvcml6YXRpb24gb2YgZXJyb3JzOiA0eHggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBlcnJvcnMsIGFuZCA1eHggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGVycm9ycywgYW5kIHRoZSBzdGF0dXMgd2lsbCBiZSAyeHggaW4gbm9uLWVycm9yIGNhc2VzLiBBbiBJdGVtIHdpdGggYSBub24tYG51bGxgIGVycm9yIG9iamVjdCB3aWxsIG9ubHkgYmUgcGFydCBvZiBhbiBBUEkgcmVzcG9uc2Ugd2hlbiBjYWxsaW5nIGAvaXRlbS9nZXRgIHRvIHZpZXcgSXRlbSBzdGF0dXMuIE90aGVyd2lzZSwgZXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZDsgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCBhbiBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhaWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYWlkRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBPQXV0aC1iYXNlZCBpdGVtIGVycm9yczsgYG51bGxgIHdpbGwgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiAgUG9zc2libGUgdmFsdWVzOiBgT0FVVEhfSU5WQUxJRF9UT0tFTmA6IFRoZSB1c2VyXFwncyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICBgT0FVVEhfQ09OU0VOVF9FWFBJUkVEYDogVGhlIHVzZXJcXCdzIGFjY2VzcyBjb25zZW50IGZvciB0aGlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgZXhwaXJlZC4gIGBPQVVUSF9VU0VSX1JFVk9LRURgOiBUaGUgdXNlclxcJ3MgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdXNlciByZXZva2VkIHRoZWlyIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGVfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uICBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGlzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAgb3IgYENIRUNLX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGNhdXNlcz86IEFycmF5PGFueT47XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4gVGhpcyB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgd2hlbiB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgdmlhIGEgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgUGxhaWQgZG9jdW1lbnRhdGlvbiBwYWdlIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHN1Z2dlc3RlZF9hY3Rpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHdlcmUgcmVxdWVzdGVkIHZpYSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIGluIGAvbGluay90b2tlbi9jcmVhdGVgLiBDdXJyZW50bHkgb25seSBwb3B1bGF0ZWQgZm9yIGBOT19BQ0NPVU5UU2AgZXJyb3JzIGZyb20gSXRlbXMgd2l0aCBgaW52ZXN0bWVudHNfYXV0aGAgYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHJlcXVpcmVkX2FjY291bnRfc3VidHlwZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHdlcmUgZXh0cmFjdGVkIGJ1dCBkaWQgbm90IG1hdGNoIHRoZSByZXF1ZXN0ZWQgc3VidHlwZXMgdmlhIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIEN1cnJlbnRseSBvbmx5IHBvcHVsYXRlZCBmb3IgYE5PX0FDQ09VTlRTYCBlcnJvcnMgZnJvbSBJdGVtcyB3aXRoIGBpbnZlc3RtZW50c19hdXRoYCBhcyBhbiBlbmFibGVkIHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgcHJvdmlkZWRfYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGxhaWRFcnJvclR5cGUge1xuICAgIEludmFsaWRSZXF1ZXN0ID0gJ0lOVkFMSURfUkVRVUVTVCcsXG4gICAgSW52YWxpZFJlc3VsdCA9ICdJTlZBTElEX1JFU1VMVCcsXG4gICAgSW52YWxpZElucHV0ID0gJ0lOVkFMSURfSU5QVVQnLFxuICAgIEluc3RpdHV0aW9uRXJyb3IgPSAnSU5TVElUVVRJT05fRVJST1InLFxuICAgIFJhdGVMaW1pdEV4Y2VlZGVkID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgIEFwaUVycm9yID0gJ0FQSV9FUlJPUicsXG4gICAgSXRlbUVycm9yID0gJ0lURU1fRVJST1InLFxuICAgIEFzc2V0UmVwb3J0RXJyb3IgPSAnQVNTRVRfUkVQT1JUX0VSUk9SJyxcbiAgICBCYXNlUmVwb3J0RXJyb3IgPSAnQkFTRV9SRVBPUlRfRVJST1InLFxuICAgIFJlY2FwdGNoYUVycm9yID0gJ1JFQ0FQVENIQV9FUlJPUicsXG4gICAgT2F1dGhFcnJvciA9ICdPQVVUSF9FUlJPUicsXG4gICAgUGF5bWVudEVycm9yID0gJ1BBWU1FTlRfRVJST1InLFxuICAgIEJhbmtUcmFuc2ZlckVycm9yID0gJ0JBTktfVFJBTlNGRVJfRVJST1InLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbkVycm9yID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fRVJST1InLFxuICAgIE1pY3JvZGVwb3NpdHNFcnJvciA9ICdNSUNST0RFUE9TSVRTX0VSUk9SJyxcbiAgICBTYW5kYm94RXJyb3IgPSAnU0FOREJPWF9FUlJPUicsXG4gICAgUGFydG5lckVycm9yID0gJ1BBUlRORVJfRVJST1InLFxuICAgIFNpZ25hbEVycm9yID0gJ1NJR05BTF9FUlJPUicsXG4gICAgVHJhbnNhY3Rpb25zRXJyb3IgPSAnVFJBTlNBQ1RJT05TX0VSUk9SJyxcbiAgICBUcmFuc2FjdGlvbkVycm9yID0gJ1RSQU5TQUNUSU9OX0VSUk9SJyxcbiAgICBUcmFuc2ZlckVycm9yID0gJ1RSQU5TRkVSX0VSUk9SJyxcbiAgICBDaGVja1JlcG9ydEVycm9yID0gJ0NIRUNLX1JFUE9SVF9FUlJPUicsXG4gICAgQ29uc3VtZXJSZXBvcnRFcnJvciA9ICdDT05TVU1FUl9SRVBPUlRfRVJST1InLFxuICAgIFVzZXJFcnJvciA9ICdVU0VSX0VSUk9SJyxcbiAgICBJZGVtcG90ZW5jeUVycm9yID0gJ0lERU1QT1RFTkNZX0VSUk9SJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBMZW5kU2NvcmUgdG8gdXNlLiBSZXF1aXJlZCBpZiB1c2luZyBMZW5kU2NvcmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQbGFpZExlbmRTY29yZVZlcnNpb24ge1xuICAgIFYxMCA9ICd2MS4wJyxcbiAgICBWMjAgPSAndjIuMCcsXG4gICAgTHMxID0gJ0xTMSdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBpZHMgcmVsYXRlZCB0byBhbiBlbXBsb3llZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQbGF0Zm9ybUlkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtSWRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIGVtcGxveWVlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgcGF5cm9sbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1wbG95ZWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBvc2l0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRhdGEgZnJvbSB0aGUgQ2FzaFNjb3Jlwq4gcHJvZHVjdCByZXR1cm5lZCBieSBQcmlzbSBEYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbUNhc2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtQ2FzaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBjYXNoIHNjb3JlIG1vZGVsIHVzZWQuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgbW9kZWxfdmVyc2lvbmAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBjYXNoIHNjb3JlIG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVcbiAgICAgKi9cbiAgICBtb2RlbF92ZXJzaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSBQcmlzbSBEYXRhLiBSYW5nZXMgZnJvbSAxLTk5OSwgd2l0aCBoaWdoZXIgc2NvcmUgaW5kaWNhdGluZyBsb3dlciByaXNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbnMgZm9yIGFuIGluZGl2aWR1YWwgaGF2aW5nIHJpc2sgYWNjb3JkaW5nIHRvIHRoZSBjYXNoIHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgcHJvdmlkZWQgdHJhbnNhY3Rpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmVNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4X2FnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBsYXRlc3QgY3JlZGl0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlX2NyZWRpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGF0ZXN0IGRlYml0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlX2RlYml0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgZGViaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1heF9hZ2VfZGViaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCBjcmVkaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1heF9hZ2VfY3JlZGl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBudW1fdHJ4bl9jcmVkaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRlYml0IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbnVtX3RyeG5fZGViaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbDFtX2NyZWRpdF92YWx1ZV9jbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCAzMCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsMW1fZGViaXRfdmFsdWVfY250OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBDYXNoU2NvcmUuIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB2My5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtQ2FzaFNjb3JlVmVyc2lvbiB7XG4gICAgXzQxID0gJzQuMScsXG4gICAgXzQgPSAnNCcsXG4gICAgXzNMaXRlID0gJzNfbGl0ZScsXG4gICAgXzMgPSAnMycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIENhc2hTY29yZcKuIERldGVjdCBwcm9kdWN0IHJldHVybmVkIGJ5IFByaXNtIERhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtRGV0ZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21EZXRlY3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIENhc2hTY29yZcKuIERldGVjdCBtb2RlbCB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRGV0ZWN0XG4gICAgICovXG4gICAgbW9kZWxfdmVyc2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSBQcmlzbSBEYXRhLiBSYW5nZXMgZnJvbSAxLTk5OSwgd2l0aCBoaWdoZXIgc2NvcmUgaW5kaWNhdGluZyBsb3dlciByaXNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRGV0ZWN0XG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbnMgZm9yIGFuIGluZGl2aWR1YWwgaGF2aW5nIHJpc2sgYWNjb3JkaW5nIHRvIHRoZSBDYXNoU2NvcmXCriBEZXRlY3Qgc2NvcmUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFByaXNtRGV0ZWN0XG4gICAgICovXG4gICAgcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmVNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21EZXRlY3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IFByaXNtQ2FzaFNjb3JlTWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIHJldHVybmVkIGJ5IFByaXNtIGZvciB0aGlzIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21EZXRlY3RcbiAgICAgKi9cbiAgICBlcnJvcl9yZWFzb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERldGVjdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJpc21EZXRlY3RWZXJzaW9uIHtcbiAgICBfNDEgPSAnNC4xJyxcbiAgICBfNCA9ICc0JyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGRhdGEgZnJvbSB0aGUgQ2FzaFNjb3Jlwq4gRXh0ZW5kIHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21FeHRlbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbUV4dGVuZCB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgQ2FzaFNjb3Jlwq4gRXh0ZW5kIG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21FeHRlbmRcbiAgICAgKi9cbiAgICBtb2RlbF92ZXJzaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIHJldHVybmVkIGJ5IFByaXNtIERhdGEuIFJhbmdlcyBmcm9tIDEtOTk5LCB3aXRoIGhpZ2hlciBzY29yZSBpbmRpY2F0aW5nIGxvd2VyIHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21FeHRlbmRcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29ucyBmb3IgYW4gaW5kaXZpZHVhbCBoYXZpbmcgcmlzayBhY2NvcmRpbmcgdG8gdGhlIENhc2hTY29yZcKuIEV4dGVuZCBzY29yZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21FeHRlbmRcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUNhc2hTY29yZU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUV4dGVuZFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogUHJpc21DYXNoU2NvcmVNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgcmV0dXJuZWQgYnkgUHJpc20gZm9yIHRoaXMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUV4dGVuZFxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgUHJpc20gRXh0ZW5kXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbUV4dGVuZFZlcnNpb24ge1xuICAgIF80MSA9ICc0LjEnLFxuICAgIF80ID0gJzQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgZGF0YSBmcm9tIHRoZSBGaXJzdERldGVjdCBwcm9kdWN0IHJldHVybmVkIGJ5IFByaXNtIERhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtRmlyc3REZXRlY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbUZpcnN0RGV0ZWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBGaXJzdERldGVjdCBtb2RlbCB1c2VkLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYG1vZGVsX3ZlcnNpb25gLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBGaXJzdERldGVjdCBtb2RlbCB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBtb2RlbF92ZXJzaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSBQcmlzbSBEYXRhLiBSYW5nZXMgZnJvbSAxLTk5OSwgd2l0aCBoaWdoZXIgc2NvcmUgaW5kaWNhdGluZyBsb3dlciByaXNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29ucyBmb3IgYW4gaW5kaXZpZHVhbCBoYXZpbmcgcmlzayBhY2NvcmRpbmcgdG8gdGhlIEZpcnN0RGV0ZWN0IHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUZpcnN0RGV0ZWN0XG4gICAgICovXG4gICAgcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmVNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogUHJpc21DYXNoU2NvcmVNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgcmV0dXJuZWQgYnkgUHJpc20gZm9yIHRoaXMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUZpcnN0RGV0ZWN0XG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBGaXJzdERldGVjdC4gSWYgbm90IHNwZWNpZmllZCwgd2lsbCBkZWZhdWx0IHRvIHYzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJpc21GaXJzdERldGVjdFZlcnNpb24ge1xuICAgIF8zID0gJzMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgZGF0YSBmcm9tIHRoZSBJbnNpZ2h0cyBwcm9kdWN0IHJldHVybmVkIGJ5IFByaXNtIERhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBpbnNpZ2h0cyBtb2RlbCB1c2VkLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYG1vZGVsX3ZlcnNpb25gLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtSW5zaWdodHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBpbnNpZ2h0cyBtb2RlbCB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtSW5zaWdodHNcbiAgICAgKi9cbiAgICBtb2RlbF92ZXJzaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnNpZ2h0cyBSZXN1bHQgb2JqZWN0IGlzIGEgbWFwIG9mIGNhc2ggZmxvdyBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQgb3Igc3RyaW5nLiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXR0cmlidXRlcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci4gVGhlIGF0dHJpYnV0ZXMgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBQcmlzbSB2ZXJzaW9uIHVzZWQuXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21JbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlc3VsdD86IG9iamVjdDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgcmV0dXJuZWQgYnkgUHJpc20gZm9yIHRoaXMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUluc2lnaHRzXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBJbnNpZ2h0cy4gSWYgbm90IHNwZWNpZmllZCwgd2lsbCBkZWZhdWx0IHRvIHYzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJpc21JbnNpZ2h0c1ZlcnNpb24ge1xuICAgIF80MSA9ICc0LjEnLFxuICAgIF80ID0gJzQnLFxuICAgIF8zID0gJzMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbnMgb2YgUHJpc20gcHJvZHVjdHMgdG8gZXZhbHVhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21WZXJzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtVmVyc2lvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUZpcnN0RGV0ZWN0VmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc1xuICAgICAqL1xuICAgIGZpcnN0ZGV0ZWN0PzogUHJpc21GaXJzdERldGVjdFZlcnNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbURldGVjdFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNcbiAgICAgKi9cbiAgICBkZXRlY3Q/OiBQcmlzbURldGVjdFZlcnNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUNhc2hTY29yZVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNcbiAgICAgKi9cbiAgICBjYXNoc2NvcmU/OiBQcmlzbUNhc2hTY29yZVZlcnNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUV4dGVuZFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNcbiAgICAgKi9cbiAgICBleHRlbmQ/OiBQcmlzbUV4dGVuZFZlcnNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUluc2lnaHRzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc1xuICAgICAqL1xuICAgIGluc2lnaHRzPzogUHJpc21JbnNpZ2h0c1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZXByZWNhdGVkLCB1c2UgYHBhcnRuZXJfaW5zaWdodHMucHJpc21fdmVyc2lvbnNgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtVmVyc2lvbnNEZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUZpcnN0RGV0ZWN0VmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBmaXJzdGRldGVjdD86IFByaXNtRmlyc3REZXRlY3RWZXJzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21EZXRlY3RWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zRGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGRldGVjdD86IFByaXNtRGV0ZWN0VmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXNoc2NvcmU/OiBQcmlzbUNhc2hTY29yZVZlcnNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUV4dGVuZFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNEZXByZWNhdGVkXG4gICAgICovXG4gICAgZXh0ZW5kPzogUHJpc21FeHRlbmRWZXJzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21JbnNpZ2h0c1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNEZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hY2NvdW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgaW4gTGlua1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3Nvck51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogUHJvY2Vzc29yTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG59XG4vKipcbiAqIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFRoaXMgZmllbGQgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSksICphbmQqIG9uZSBvciBtb3JlIGFjY291bnQgdHlwZXMgYmVpbmcgcmVxdWVzdGVkIGlzIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCAoc3VjaCBhcyBhIGNyZWRpdCBjYXJkKSBhcyBDYXBpdGFsIE9uZSBkb2VzIG5vdCBwcm92aWRlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gSW4gdGhpcyBjYXNlLCBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIGFzIHdlbGwgYXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMgYXQgQ2FwaXRhbCBPbmUgKGluY2x1ZGluZyBhbGwgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMpIHRoaXMgZmllbGQgaXMgaWdub3JlZCBhbmQgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24gd2lsbCBiZSBmZXRjaGVkLiAgSWYgdGhpcyBmaWVsZCBpcyBub3QgaWdub3JlZCwgYW5kIG5vIGFjY2VwdGFibGUgYmFsYW5jZSBpcyBhdmFpbGFibGUsIGFuIGBJTlZBTElEX1JFU1VMVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBiYW5rIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgYmFuayB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBiYW5rIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50IC0gc2hvdWxkIGJlIHNldCB0byBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgZGVzY3JpcHRpb24uIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogQW4gYXJiaXRyYXJ5IHN0cmluZyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGZvciBzdG9yYWdlIHdpdGggdGhlIGJhbmsgdHJhbnNmZXIuIE1heSBiZSB1cCB0byAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tX3RhZz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyB0cmFuc2Zlci4gSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBvcmlnaW5hdGlvbiBhY2NvdW50LCB0aGlzIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9uIGRhdGEgaXMgYXZhaWxhYmxlIGZvciBhbiBJdGVtLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGRldGVjdGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZCBhbmQgUGxhaWQgaGFzIHByZXBhcmVkIGFzIG11Y2ggaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBkYXRhIGFzIHBvc3NpYmxlIGZvciB0aGUgSXRlbS4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgYmV5b25kIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gVGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudElkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudElkZW50aXR5O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eU1hdGNoVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogSWRlbnRpdHlNYXRjaFVzZXI7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBpbml0aWFsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBUaGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byB0aGUgaW52ZXN0bWVudCBhY2NvdW50LiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVycyBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRzQXV0aE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PEludmVzdG1lbnRzQXV0aE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYXRhX3NvdXJjZXM6IEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGFjY291bnRzIG9mIDQwMWsgc3VidHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2RldGFpbHNfNDAxaz86IEFycmF5PEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxaz47XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBJbnZlc3RtZW50QWNjb3VudDtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIGludmVzdG1lbnQgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogT2JqZWN0cyBkZXNjcmliaW5nIHRoZSBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgSXRlbVxcJ3MgcG9ydGZvbGlvIHdhcyBtYW51YWxseSBjcmVhdGVkIHdpdGggdGhlIEludmVzdG1lbnRzIEZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50QWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEludmVzdG1lbnRBY2NvdW50O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gSW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaWRlbnRpZnlpbmcgbnVtYmVycyB1c2VkIGZvciBtYWtpbmcgZWxlY3Ryb25pYyB0cmFuc2ZlcnMgdG8gYW5kIGZyb20gdGhlIGBhY2NvdW50YC4gVGhlIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIChBQ0gsIEVGVCwgSUJBTiwgb3IgQmFjcykgdXNlZCB3aWxsIGRlcGVuZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgYWNjb3VudC4gQW4gYWNjb3VudCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIG51bWJlciB0eXBlLiBJZiBhIHBhcnRpY3VsYXIgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgaXMgbm90IHVzZWQgYnkgdGhlIGBhY2NvdW50YCBmb3Igd2hpY2ggYXV0aCBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCwgYSBudWxsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNBQ0hOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgYWNoPzogTnVtYmVyc0FDSE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0VGVE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBlZnQ/OiBOdW1iZXJzRUZUTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGJhY3M/OiBOdW1iZXJzQkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YSBpcyB1cGRhdGVkLiBUaGlzIGluY2x1ZGVzIHdoZW4gYSBuZXcgcmVjdXJyaW5nIHN0cmVhbSBpcyBkZXRlY3RlZCBvciB3aGVuIGEgbmV3IHRyYW5zYWN0aW9uIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHJlY3VycmluZyBzdHJlYW0uIFRoZSBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgIHdlYmhvb2sgd2lsbCBhbHNvIGZpcmUgd2hlbiBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWN1cnJpbmcgc3RyZWFtIGNoYW5nZXMsIHdoaWNoIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uLCB1cGRhdGUsIG9yIHJlbW92YWwgb2YgdHJhbnNhY3Rpb25zIHRvIHRoZSBzdHJlYW0uICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIHVwZGF0ZWQgZGF0YSBjYW4gYmUgZmV0Y2hlZCBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICoqdHJ1ZSoqIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gaXMgYSByZWN1cnJpbmcgdHJhbnNhY3Rpb247ICoqZmFsc2UqKiBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBvciBub24tQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCBieSBOYWNoYS4gVGhlIGRlYml0IHRyYW5zYWN0aW9uIGlzIHByb2Nlc3NlZCBhbmQgc2V0dGxlZCBvbiB0aGUgc2FtZSBkYXkuIGBTVEFOREFSRF9BQ0hgOiBTdGFuZGFyZCBBQ0ggYnkgTmFjaGEuIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBJZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcy4gUG9zc2libGUgdmFsdWVzOiAgYFNBTUVfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgcnVsZXNldCB0byB1c2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFlvdSBjYW4gY29uZmlndXJlIGEgcnVsZXNldCB1c2luZyB0aGUgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciBbU2lnbmFsLT5SdWxlc10oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3NpZ25hbC9yaXNrLXByb2ZpbGVzKS4gSWYgbm90IHByb3ZpZGVkLCBmb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGJlZm9yZSBPY3RvYmVyIDE1LCAyMDI1LCBieSBkZWZhdWx0LCBubyBydWxlc2V0IHdpbGwgYmUgdXNlZDsgZm9yIGN1c3RvbWVycyB3aG8gYmVnYW4gdXNpbmcgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBhZnRlciB0aGF0IGRhdGUsIG9yIGZvciBCYWxhbmNlIGN1c3RvbWVycywgdGhlIGBkZWZhdWx0YCBydWxlc2V0IHdpbGwgYmUgdXNlZC4gRm9yIG1vcmUgZGV0YWlscywgb3IgdG8gb3B0IG91dCBvZiB1c2luZyBhIHJ1bGVzZXQsIHNlZSBbU2lnbmFsIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBydWxlc2V0X2tleT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsU2NvcmVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2NvcmVzOiBTaWduYWxTY29yZXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29yZV9hdHRyaWJ1dGVzPzogU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UnVsZXNldH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGVzZXQ/OiBSdWxlc2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBiYW5rIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlIHRvIGJlIHVzZWQgaW4gdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2Ygc2NvcmVzIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgYmFuayBkYXRhLCBmaWxlIGEgc3VwcG9ydCB0aWNrZXQgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2lnbmFsV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4geW91IHJlY2VpdmUgdGhlIHJldHVybnMgZnJvbSB5b3VyIHBheW1lbnQgcHJvY2Vzc29ycywgaW4gSVNPIDg2MDEgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2VudCB0byBTdHJpcGUgZm9yIHVzZSBpbiBtYWtpbmcgQVBJIGNhbGxzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyaXBlX2JhbmtfYWNjb3VudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB0aGUgb2xkZXIgd2ViaG9va3MgYElOSVRJQUxfVVBEQVRFYCwgYEhJU1RPUklDQUxfVVBEQVRFYCwgYERFRkFVTFRfVVBEQVRFYCwgYW5kIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGAsIHdoaWNoIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3IgYW4gSXRlbSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIHRyYW5zYWN0aW9ucyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgeW91IGFyZSBpbnRlZ3JhdGluZyB3aXRoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NvcjogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0UHJvY2Vzc29yRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtIHtcbiAgICBEd29sbGEgPSAnZHdvbGxhJyxcbiAgICBHYWxpbGVvID0gJ2dhbGlsZW8nLFxuICAgIE1vZGVyblRyZWFzdXJ5ID0gJ21vZGVybl90cmVhc3VyeScsXG4gICAgT2Nyb2x1cyA9ICdvY3JvbHVzJyxcbiAgICBWZXN0YSA9ICd2ZXN0YScsXG4gICAgRHJpdmV3ZWFsdGggPSAnZHJpdmV3ZWFsdGgnLFxuICAgIFZvcGF5ID0gJ3ZvcGF5JyxcbiAgICBBY2hxID0gJ2FjaHEnLFxuICAgIENoZWNrID0gJ2NoZWNrJyxcbiAgICBDaGVja2Jvb2sgPSAnY2hlY2tib29rJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaWxhTW9uZXkgPSAnc2lsYV9tb25leScsXG4gICAgUml6ZSA9ICdyaXplJyxcbiAgICBTdmJBcGkgPSAnc3ZiX2FwaScsXG4gICAgVW5pdCA9ICd1bml0JyxcbiAgICBXeXJlID0gJ3d5cmUnLFxuICAgIExpdGhpYyA9ICdsaXRoaWMnLFxuICAgIEFscGFjYSA9ICdhbHBhY2EnLFxuICAgIEFzdHJhID0gJ2FzdHJhJyxcbiAgICBNb292ID0gJ21vb3YnLFxuICAgIFRyZWFzdXJ5UHJpbWUgPSAndHJlYXN1cnlfcHJpbWUnLFxuICAgIE1hcnFldGEgPSAnbWFycWV0YScsXG4gICAgQ2hlY2tvdXQgPSAnY2hlY2tvdXQnLFxuICAgIFNvbGlkID0gJ3NvbGlkJyxcbiAgICBIaWdobm90ZSA9ICdoaWdobm90ZScsXG4gICAgR2VtaW5pID0gJ2dlbWluaScsXG4gICAgQXBleENsZWFyaW5nID0gJ2FwZXhfY2xlYXJpbmcnLFxuICAgIEd1c3RvID0gJ2d1c3RvJyxcbiAgICBBZHllbiA9ICdhZHllbicsXG4gICAgQXRvbWljID0gJ2F0b21pYycsXG4gICAgSTJjID0gJ2kyYycsXG4gICAgV2VwYXkgPSAnd2VwYXknLFxuICAgIFJpc2tpZmllZCA9ICdyaXNraWZpZWQnLFxuICAgIFV0YiA9ICd1dGInLFxuICAgIEFkcFJvbGwgPSAnYWRwX3JvbGwnLFxuICAgIEZvcnRyZXNzVHJ1c3QgPSAnZm9ydHJlc3NfdHJ1c3QnLFxuICAgIEJvbmQgPSAnYm9uZCcsXG4gICAgQmFra3QgPSAnYmFra3QnLFxuICAgIFRlYWwgPSAndGVhbCcsXG4gICAgWmVyb0hhc2ggPSAnemVyb19oYXNoJyxcbiAgICBUYWJhUGF5ID0gJ3RhYmFfcGF5JyxcbiAgICBLbm90ID0gJ2tub3QnLFxuICAgIFNhcmRpbmUgPSAnc2FyZGluZScsXG4gICAgQWxsb3kgPSAnYWxsb3knLFxuICAgIEZpbml4ID0gJ2Zpbml4JyxcbiAgICBOdXZlaSA9ICdudXZlaScsXG4gICAgTGF5ZXIgPSAnbGF5ZXInLFxuICAgIEJvb20gPSAnYm9vbScsXG4gICAgUGF5bm90ZSA9ICdwYXlub3RlJyxcbiAgICBTdGFrZSA9ICdzdGFrZScsXG4gICAgV2VkYnVzaCA9ICd3ZWRidXNoJyxcbiAgICBFc3VzdSA9ICdlc3VzdScsXG4gICAgQW5zYSA9ICdhbnNhJyxcbiAgICBTY3JpYmV1cCA9ICdzY3JpYmV1cCcsXG4gICAgU3RyYWRkbGUgPSAnc3RyYWRkbGUnLFxuICAgIExvYW5wcm8gPSAnbG9hbnBybycsXG4gICAgQmxvb21DcmVkaXQgPSAnYmxvb21fY3JlZGl0JyxcbiAgICBTZm94ID0gJ3Nmb3gnLFxuICAgIEJyYWxlID0gJ2JyYWxlJyxcbiAgICBQYXJhZmluID0gJ3BhcmFmaW4nLFxuICAgIENhcmRsZXNzID0gJ2NhcmRsZXNzJyxcbiAgICBPcGVuTGVkZ2VyID0gJ29wZW5fbGVkZ2VyJyxcbiAgICBWYWxvbiA9ICd2YWxvbicsXG4gICAgR2FpbmJyaWRnZSA9ICdnYWluYnJpZGdlJyxcbiAgICBDYXJkbHl0aWNzID0gJ2NhcmRseXRpY3MnLFxuICAgIFBpbndoZWVsID0gJ3BpbndoZWVsJyxcbiAgICBUaHJlYWRCYW5rID0gJ3RocmVhZF9iYW5rJyxcbiAgICBBcnJheSA9ICdhcnJheScsXG4gICAgRmlhbnQgPSAnZmlhbnQnLFxuICAgIE9hdGZpID0gJ29hdGZpJyxcbiAgICBDdXJpbm9zID0gJ2N1cmlub3MnLFxuICAgIEZyYW1lID0gJ2ZyYW1lJyxcbiAgICBJbnRlcmNoZWNrcyA9ICdpbnRlcmNoZWNrcycsXG4gICAgSW50ZXJjaGFuZ2UgPSAnaW50ZXJjaGFuZ2UnLFxuICAgIEF0b21pY2ZpID0gJ2F0b21pY2ZpJyxcbiAgICBQYXkgPSAncGF5JyxcbiAgICBOYXR1cmFsID0gJ25hdHVyYWwnLFxuICAgIEthbm1vbiA9ICdrYW5tb24nXG59XG5cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWAgYW5kIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvY2Vzc29yX3Rva2VuYCB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgYnkgdGhlIFBsYWlkIHBhcnRuZXIgdG8gbWFrZSBBUEkgcmVxdWVzdHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhhdCB0aGUgcHJvY2Vzc29yIGhhcyBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgaW5jbHVkaW5nIGZ1dHVyZSBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3Qgd2lsbCBncmFudCBhY2Nlc3MgdG8gYWxsIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhIHByb2Nlc3NvciB1cGRhdGVzIHRoZSB3ZWJob29rIFVSTCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4gdmlhIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBgUFJPQ0VTU09SX1RPS0VOYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiBUbyByZW1vdmUgYSB3ZWJob29rIGZyb20gYSBwcm9jZXNzb3IgdG9rZW4sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDb3VudGVycGFydGllcyBhbmQgZXh0cmEgbWVyY2hhbnQgZmllbGRzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkZXBvc2l0b3J5IHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGV4cGVuc2UgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbiBzdHJlYW1zIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCB3ZXJlIHVwZGF0ZWQgb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZXRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfdmVyc2lvbj86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBJdGVtLiBOb3RlOiBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVfc3RhdHVzOiBUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb24gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGFueSBmdXR1cmUgdXBkYXRlcyBhZnRlciB0aGUgbGF0ZXN0IHVwZGF0ZSBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlLiBUaGUgY3Vyc29yIG9idGFpbmVkIGFmdGVyIGFsbCBwYWdlcyBoYXZlIGJlZW4gcHVsbGVkIChpbmRpY2F0ZWQgYnkgYGhhc19tb3JlYCBiZWluZyBgZmFsc2VgKSB3aWxsIGJlIHZhbGlkIGZvciBhdCBsZWFzdCAxIHllYXIuIFRoaXMgY3Vyc29yIHNob3VsZCBiZSBwZXJzaXN0ZWQgZm9yIGxhdGVyIGNhbGxzLiBJZiB0cmFuc2FjdGlvbnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBpZiBtb3JlIHRoYW4gcmVxdWVzdGVkIGNvdW50IG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgZXhpc3QuIElmIHRydWUsIHRoZSBhZGRpdGlvbmFsIHVwZGF0ZXMgY2FuIGJlIGZldGNoZWQgYnkgbWFraW5nIGFuIGFkZGl0aW9uYWwgcmVxdWVzdCB3aXRoIGBjdXJzb3JgIHNldCB0byBgbmV4dF9jdXJzb3JgLiBJZiBgaGFzX21vcmVgIGlzIHRydWUsIGl0XFwncyBpbXBvcnRhbnQgdG8gcHVsbCBhbGwgYXZhaWxhYmxlIHBhZ2VzLCB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IGZvciB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlcyB0byBjb25mbGljdCB3aXRoIHBhZ2luYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBwcm9kdWN0IGFjY2VzcyBiZWluZyByZXF1ZXN0ZWQuIFVzZWQgdG8gb3IgZGlzYWxsb3cgcHJvZHVjdCBhY2Nlc3MgYWNyb3NzIGFsbCBhY2NvdW50cy4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGFsbCBwcm9kdWN0cyBhbGxvd2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0QWNjZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdEFjY2VzcyB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHN0YXRlbWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gdGhlIElkZW50aXR5IHByb2R1Y3QgKG5hbWUsIGVtYWlsLCBwaG9uZSwgYWRkcmVzcykuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGFjY291bnQgbnVtYmVyIGRldGFpbHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGF1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gdHJhbnNhY3Rpb24gZGV0YWlscy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGBhY2NvdW50c19kZXRhaWxzX3RyYW5zYWN0aW9uc2AuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX2RldGFpbHNfdHJhbnNhY3Rpb25zPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGBhY2NvdW50c19yb3V0aW5nX251bWJlcmAuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3JvdXRpbmdfbnVtYmVyPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGBhY2NvdW50c19zdGF0ZW1lbnRzYC4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBgYWNjb3VudHNfdGF4X3N0YXRlbWVudHNgLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c190YXhfc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBgY3VzdG9tZXJzX3Byb2ZpbGVzYC4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgY3VzdG9tZXJzX3Byb2ZpbGVzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gYEFDQ0VTU19OT1RfR1JBTlRFRGAgZXJyb3IgaXMgaGl0IGZvciBBdXRoLiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IHB1dHRpbmcgdGhlIHVzZXIgdGhyb3VnaCB1cGRhdGUgbW9kZSB3aXRoIGBhdXRoYCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgYXMgd2VsbCBhcyB0aHJvdWdoIHRoZSBsaW1pdGVkIGJldGEgZm9yIHVwZGF0ZSBtb2RlIEF1dGhlbnRpY2F0aW9uIHByb2R1Y3QgdmFsaWRhdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUEVSTUlTU0lPTlNfUkVRVUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGBBQ0NFU1NfTk9UX0dSQU5URURgIGVycm9yIGlzIGhpdCBmb3IgSWRlbnRpdHkuIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgcHV0dGluZyB0aGUgdXNlciB0aHJvdWdoIHVwZGF0ZSBtb2RlIHdpdGggYGlkZW50aXR5YCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgYXMgd2VsbCBhcyB0aHJvdWdoIHRoZSBsaW1pdGVkIGJldGEgZm9yIHVwZGF0ZSBtb2RlIElkZW50aXR5IHByb2R1Y3QgdmFsaWRhdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1BFUk1JU1NJT05TX1JFUVVJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdHVzIGhlYWx0aCBvZiBhIHJlcXVlc3QgdHlwZS4gQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBMaWFiaWxpdGllcyByZXF1ZXN0cywgVHJhbnNhY3Rpb25zIHVwZGF0ZXMsIEludmVzdG1lbnRzIHVwZGF0ZXMsIExpYWJpbGl0aWVzIHVwZGF0ZXMsIGFuZCBJdGVtIGxvZ2lucyBlYWNoIGhhdmUgdGhlaXIgb3duIHN0YXR1cyBvYmplY3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIGBicmVha2Rvd25gIG9iamVjdCwgd2hpY2ggcHJvdmlkZXMgbW9yZSBncmFudWxhciBpbnN0aXR1dGlvbiBoZWFsdGggZGF0YS4gIGBIRUFMVEhZYDogdGhlIG1ham9yaXR5IG9mIHJlcXVlc3RzIGFyZSBzdWNjZXNzZnVsIGBERUdSQURFRGA6IG9ubHkgc29tZSByZXF1ZXN0cyBhcmUgc3VjY2Vzc2Z1bCBgRE9XTmA6IGFsbCByZXF1ZXN0cyBhcmUgZmFpbGluZ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN0YXR1czogUHJvZHVjdFN0YXR1c1N0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0dGVkIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdGF0dXMgY2hhbmdlIGZvciB0aGUgaW5zdGl0dXRpb24uIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c19jaGFuZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c0JyZWFrZG93bn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogUHJvZHVjdFN0YXR1c0JyZWFrZG93bjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzU3RhdHVzRW51bSB7XG4gICAgSGVhbHRoeSA9ICdIRUFMVEhZJyxcbiAgICBEZWdyYWRlZCA9ICdERUdSQURFRCcsXG4gICAgRG93biA9ICdET1dOJ1xufVxuXG4vKipcbiAqIEEgZGV0YWlsZWQgYnJlYWtkb3duIG9mIHRoZSBpbnN0aXR1dGlvblxcJ3MgcGVyZm9ybWFuY2UgZm9yIGEgcmVxdWVzdCB0eXBlLiBUaGUgdmFsdWVzIGZvciBgc3VjY2Vzc2AsIGBlcnJvcl9wbGFpZGAsIGFuZCBgZXJyb3JfaW5zdGl0dXRpb25gIHN1bSB0byAxLiBUaGUgdGltZSByYW5nZSB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUgYnJlYWtkb3duIG1heSByYW5nZSBmcm9tIHRoZSBtb3N0IHJlY2VudCBmZXcgbWludXRlcyB0byB0aGUgcGFzdCBzaXggaG91cnMuIEluIGdlbmVyYWwsIHNtYWxsZXIgaW5zdGl0dXRpb25zIHdpbGwgc2hvdyBzdGF0dXMgdGhhdCB3YXMgY2FsY3VsYXRlZCBvdmVyIGEgbG9uZ2VyIHBlcmlvZCBvZiB0aW1lLiBGb3IgSW52ZXN0bWVudCB1cGRhdGVzLCB3aGljaCBhcmUgcmVmcmVzaGVkIGxlc3MgZnJlcXVlbnRseSwgdGhlIHBlcmlvZCBhc3Nlc3NlZCBtYXkgYmUgMjQgaG91cnMgb3IgbW9yZS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtJbnN0aXR1dGlvbiBzdGF0dXMgZGV0YWlsc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyNpbnN0aXR1dGlvbi1zdGF0dXMtZGV0YWlscykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBzdWNjZXNzZnVsLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBzdWNjZXNzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGludGVybmFsIFBsYWlkIGlzc3VlLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgZXJyb3JfcGxhaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBsb2dpbnMgdGhhdCBhcmUgZmFpbGluZyBkdWUgdG8gYW4gaXNzdWUgaW4gdGhlIGluc3RpdHV0aW9uXFwncyBzeXN0ZW0sIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX2luc3RpdHV0aW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSG93IGZyZXF1ZW50bHkgZGF0YSBmb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzIGxpa2UgSW52ZXN0bWVudHMsIFRyYW5zYWN0aW9ucywgYW5kIExpYWJpbGl0aWVzLCBpcyBiZWluZyByZWZyZXNoZWQsIHJlbGF0aXZlIHRvIHRoZSBpbnN0aXR1dGlvblxcJ3Mgbm9ybWFsIHNjaGVkdWxpbmcuIFRoZSBgcmVmcmVzaF9pbnRlcnZhbGAgbWF5IGJlIGBERUxBWUVEYCBvciBgU1RPUFBFRGAgZXZlbiB3aGVuIHRoZSBzdWNjZXNzIHJhdGUgaXMgaGlnaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmVmcmVzaF9pbnRlcnZhbD86IFByb2R1Y3RTdGF0dXNCcmVha2Rvd25SZWZyZXNoSW50ZXJ2YWxFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25SZWZyZXNoSW50ZXJ2YWxFbnVtIHtcbiAgICBOb3JtYWwgPSAnTk9STUFMJyxcbiAgICBEZWxheWVkID0gJ0RFTEFZRUQnLFxuICAgIFN0b3BwZWQgPSAnU1RPUFBFRCdcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBhbiBpbnN0aXR1dGlvbiBjYW4gc3VwcG9ydC4gQWxsIEl0ZW1zIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gVGhlIEJhbGFuY2UgcHJvZHVjdCBpcyBhbHdheXMgYXZhaWxhYmxlIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNwZWNpZmllZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm9kdWN0cyB7XG4gICAgQXNzZXRzID0gJ2Fzc2V0cycsXG4gICAgQXV0aCA9ICdhdXRoJyxcbiAgICBCYWxhbmNlID0gJ2JhbGFuY2UnLFxuICAgIEJhbGFuY2VQbHVzID0gJ2JhbGFuY2VfcGx1cycsXG4gICAgQmVhY29uID0gJ2JlYWNvbicsXG4gICAgSWRlbnRpdHkgPSAnaWRlbnRpdHknLFxuICAgIElkZW50aXR5TWF0Y2ggPSAnaWRlbnRpdHlfbWF0Y2gnLFxuICAgIEludmVzdG1lbnRzID0gJ2ludmVzdG1lbnRzJyxcbiAgICBJbnZlc3RtZW50c0F1dGggPSAnaW52ZXN0bWVudHNfYXV0aCcsXG4gICAgTGlhYmlsaXRpZXMgPSAnbGlhYmlsaXRpZXMnLFxuICAgIFBheW1lbnRJbml0aWF0aW9uID0gJ3BheW1lbnRfaW5pdGlhdGlvbicsXG4gICAgSWRlbnRpdHlWZXJpZmljYXRpb24gPSAnaWRlbnRpdHlfdmVyaWZpY2F0aW9uJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAndHJhbnNhY3Rpb25zJyxcbiAgICBDcmVkaXREZXRhaWxzID0gJ2NyZWRpdF9kZXRhaWxzJyxcbiAgICBJbmNvbWUgPSAnaW5jb21lJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb24gPSAnaW5jb21lX3ZlcmlmaWNhdGlvbicsXG4gICAgU3RhbmRpbmdPcmRlcnMgPSAnc3RhbmRpbmdfb3JkZXJzJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgRW1wbG95bWVudCA9ICdlbXBsb3ltZW50JyxcbiAgICBSZWN1cnJpbmdUcmFuc2FjdGlvbnMgPSAncmVjdXJyaW5nX3RyYW5zYWN0aW9ucycsXG4gICAgVHJhbnNhY3Rpb25zUmVmcmVzaCA9ICd0cmFuc2FjdGlvbnNfcmVmcmVzaCcsXG4gICAgU2lnbmFsID0gJ3NpZ25hbCcsXG4gICAgU3RhdGVtZW50cyA9ICdzdGF0ZW1lbnRzJyxcbiAgICBQcm9jZXNzb3JQYXltZW50cyA9ICdwcm9jZXNzb3JfcGF5bWVudHMnLFxuICAgIFByb2Nlc3NvcklkZW50aXR5ID0gJ3Byb2Nlc3Nvcl9pZGVudGl0eScsXG4gICAgUHJvZmlsZSA9ICdwcm9maWxlJyxcbiAgICBDcmFCYXNlUmVwb3J0ID0gJ2NyYV9iYXNlX3JlcG9ydCcsXG4gICAgQ3JhSW5jb21lSW5zaWdodHMgPSAnY3JhX2luY29tZV9pbnNpZ2h0cycsXG4gICAgQ3JhUGFydG5lckluc2lnaHRzID0gJ2NyYV9wYXJ0bmVyX2luc2lnaHRzJyxcbiAgICBDcmFOZXR3b3JrSW5zaWdodHMgPSAnY3JhX25ldHdvcmtfaW5zaWdodHMnLFxuICAgIENyYUNhc2hmbG93SW5zaWdodHMgPSAnY3JhX2Nhc2hmbG93X2luc2lnaHRzJyxcbiAgICBDcmFNb25pdG9yaW5nID0gJ2NyYV9tb25pdG9yaW5nJyxcbiAgICBDcmFMZW5kU2NvcmUgPSAnY3JhX2xlbmRfc2NvcmUnLFxuICAgIENyYVBsYWlkQ3JlZGl0U2NvcmUgPSAnY3JhX3BsYWlkX2NyZWRpdF9zY29yZScsXG4gICAgQ3JhUXVhbGlmeSA9ICdjcmFfcXVhbGlmeScsXG4gICAgTGF5ZXIgPSAnbGF5ZXInLFxuICAgIFBheUJ5QmFuayA9ICdwYXlfYnlfYmFuaycsXG4gICAgUHJvdGVjdExpbmtlZEJhbmsgPSAncHJvdGVjdF9saW5rZWRfYmFuaycsXG4gICAgUHJvdGVjdFRyYW5zYWN0aW9ucyA9ICdwcm90ZWN0X3RyYW5zYWN0aW9ucydcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGZvciB0ZXJtaW5hdGluZyBwcm9kdWN0cy4gIGBGUkFVRF9GSVJTVF9QQVJUWWA6IFRoZSBlbmQgdXNlciB3aG8gb3ducyB0aGUgY29ubmVjdGVkIGJhbmsgYWNjb3VudCBjb21taXR0ZWQgZnJhdWQgYEZSQVVEX0ZBTFNFX0lERU5USVRZYDogVGhlIGVuZCB1c2VyIGNyZWF0ZWQgdGhlIGNvbm5lY3Rpb24gdXNpbmcgZmFsc2UgaWRlbnRpdHkgaW5mb3JtYXRpb24gb3Igc3RvbGVuIGNyZWRlbnRpYWxzIGBGUkFVRF9BQlVTRWA6IFRoZSBlbmQgdXNlciBpcyBhYnVzaW5nIHRoZSBjbGllbnRcXCdzIHNlcnZpY2Ugb3IgcGxhdGZvcm0gdGhyb3VnaCB0aGVpciBjb25uZWN0ZWQgYWNjb3VudCBgRlJBVURfT1RIRVJgOiBPdGhlciBmcmF1ZC1yZWxhdGVkIHJlYXNvbnMgaW52b2x2aW5nIHRoZSBlbmQgdXNlciBub3QgY292ZXJlZCBieSB0aGUgc3BlY2lmaWMgZnJhdWQgY2F0ZWdvcmllcyBgRlJBVURfVFJBTlNBQ1RJT05gOiBGcmF1ZCBvY2N1cnJlZCBhdCB0aGUgdHJhbnNhY3Rpb24gbGV2ZWwsIHN1Y2ggYXMgYW4gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9uLCBjYXJkIHRlc3RpbmcsIGNoYXJnZWJhY2ssIEFDSCByZXR1cm4sIG9yIGRpc3B1dGUgYENPTlNVTUVSX0xPQU5fUEFJRF9PRkZgOiBUaGUgZW5kIHVzZXIgcGFpZCBvZmYgdGhlaXIgbG9hbiBhbmQgbm8gbG9uZ2VyIG5lZWRzIHRoZSBwcm9kdWN0IGBDT05TVU1FUl9BQ0NPVU5UX0NMT1NFRGA6IFRoZSBlbmQgdXNlciBjbG9zZWQgdGhlaXIgYWNjb3VudCB3aXRoIHRoZSBjbGllbnQgYW5kIG5vIGxvbmdlciBuZWVkcyB0aGUgcHJvZHVjdCBgQ09OU1VNRVJfQ0hBUkdFX09GRmA6IFRoZSBlbmQgdXNlclxcJ3MgYWNjb3VudCBoYXMgYmVlbiBjaGFyZ2VkIG9mZiBgQ09OU1VNRVJfUEFZTUVOVF9NRVRIT0RfU1dJVENIRURgOiBUaGUgZW5kIHVzZXIgc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgcGF5bWVudCBtZXRob2QgYW5kIG5vIGxvbmdlciBuZWVkcyB0aGUgcHJvZHVjdCBgVVNFUl9PRkZCT0FSRElOR2A6IFRoZSB1c2VyIGlzIG9mZmJvYXJkaW5nIGZyb20gdGhlIHNlcnZpY2Ugb3IgcGxhdGZvcm0gYERVUExJQ0FURV9JVEVNYDogVGhlIGNvbm5lY3Rpb24gaXMgYSBkdXBsaWNhdGUgb2YgYW5vdGhlciBleGlzdGluZyBjb25uZWN0aW9uIGZvciB0aGUgc2FtZSB1c2VyIGBCSUxMSU5HX1RFUk1JTkFUSU9OYDogVGhlIHVzZXJcXCdzIGJpbGxpbmcgb3Igc3Vic2NyaXB0aW9uIHJlbGF0aW9uc2hpcCBoYXMgZW5kZWQgYE9USEVSYDogQW55IG90aGVyIHJlYXNvbiBmb3IgdGVybWluYXRpbmcgcHJvZHVjdHMgbm90IGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNhdGVnb3JpZXMgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm9kdWN0c1Rlcm1pbmF0ZVJlYXNvbkNvZGUge1xuICAgIEZyYXVkRmlyc3RQYXJ0eSA9ICdGUkFVRF9GSVJTVF9QQVJUWScsXG4gICAgRnJhdWRGYWxzZUlkZW50aXR5ID0gJ0ZSQVVEX0ZBTFNFX0lERU5USVRZJyxcbiAgICBGcmF1ZEFidXNlID0gJ0ZSQVVEX0FCVVNFJyxcbiAgICBGcmF1ZE90aGVyID0gJ0ZSQVVEX09USEVSJyxcbiAgICBGcmF1ZFRyYW5zYWN0aW9uID0gJ0ZSQVVEX1RSQU5TQUNUSU9OJyxcbiAgICBDb25zdW1lckxvYW5QYWlkT2ZmID0gJ0NPTlNVTUVSX0xPQU5fUEFJRF9PRkYnLFxuICAgIENvbnN1bWVyQWNjb3VudENsb3NlZCA9ICdDT05TVU1FUl9BQ0NPVU5UX0NMT1NFRCcsXG4gICAgQ29uc3VtZXJDaGFyZ2VPZmYgPSAnQ09OU1VNRVJfQ0hBUkdFX09GRicsXG4gICAgQ29uc3VtZXJQYXltZW50TWV0aG9kU3dpdGNoZWQgPSAnQ09OU1VNRVJfUEFZTUVOVF9NRVRIT0RfU1dJVENIRUQnLFxuICAgIFVzZXJPZmZib2FyZGluZyA9ICdVU0VSX09GRkJPQVJESU5HJyxcbiAgICBEdXBsaWNhdGVJdGVtID0gJ0RVUExJQ0FURV9JVEVNJyxcbiAgICBCaWxsaW5nVGVybWluYXRpb24gPSAnQklMTElOR19URVJNSU5BVElPTicsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBOZXR3b3JrU3RhdHVzR2V0VXNlcjtcbn1cbi8qKlxuICogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvZmlsZS9uZXR3b3JrX3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTmV0d29ya1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5ldHdvcmtfc3RhdHVzOiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdmFsaWQgbmFtZSBtYXRjaGluZyBzZW5zaXRpdml0eSBjb25maWd1cmF0aW9ucyBmb3IgYSBzY3JlZW5pbmcgcHJvZ3JhbS4gTm90ZSB0aGF0IHdoaWxlIGNlcnRhaW4gbWF0Y2hpbmcgdGVjaG5pcXVlcyBtYXkgYmUgbW9yZSBwcmV2YWxlbnQgb24gbGVzcyBzdHJpY3Qgc2V0dGluZ3MsIGFsbCBtYXRjaGluZyBhbGdvcml0aG1zIGFyZSBlbmFibGVkIGZvciBldmVyeSBzZW5zaXRpdml0eS4gIGBjb2Fyc2VgIC0gU2VlIG1vcmUgcG90ZW50aWFsIG1hdGNoZXMuIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCBzZWUgbW9yZSBicm9hZCBwaG9uZXRpYyBtYXRjaGVzIGFjcm9zcyBhbHBoYWJldHMgdGhhdCBtYWtlIG1pc3NpbmcgYSBwb3RlbnRpYWwgaGl0IHZlcnkgdW5saWtlbHkuIFRoaXMgc2V0dGluZyBpcyBub2lzaWVyIGFuZCB3aWxsIHJlcXVpcmUgbW9yZSBtYW51YWwgcmV2aWV3LiAgYGJhbGFuY2VkYCAtIEEgZ29vZCBkZWZhdWx0IGZvciBtb3N0IGNvbXBhbmllcy4gVGhpcyBzZW5zaXRpdml0eSBpcyBiYWxhbmNlZCB0byBzaG93IGhpZ2ggcXVhbGl0eSBoaXRzIHdpdGggcmVkdWNlZCBub2lzZS4gIGBzdHJpY3RgIC0gQWdncmVzc2l2ZSBmYWxzZSBwb3NpdGl2ZSByZWR1Y3Rpb24uIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCByZXF1aXJlIG5hbWVzIHRvIGJlIG1vcmUgc2ltaWxhciB0aGFuIGBjb2Fyc2VgIGFuZCBgYmFsYW5jZWRgIHNldHRpbmdzLCByZWx5aW5nIGxlc3Mgb24gcGhvbmV0aWNzLCB3aGlsZSBzdGlsbCBhY2NvdW50aW5nIGZvciBjaGFyYWN0ZXIgdHJhbnNwb3NpdGlvbnMsIG1pc3NpbmcgdG9rZW5zLCBhbmQgb3RoZXIgY29tbW9uIHBlcm11dGF0aW9ucy4gIGBleGFjdGAgLSBNYXRjaGVzIG11c3QgYmUgbmVhcmx5IGV4YWN0LiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgb25seSBzaG93IGhpdHMgd2l0aCBleGFjdCBvciBuZWFybHkgZXhhY3QgbmFtZSBtYXRjaGVzIHdpdGggb25seSBiYXNpYyBjb3JyZWN0aW9uIHN1Y2ggYXMgZXh0cmFuZW91cyBzeW1ib2xzIGFuZCBjYXBpdGFsaXphdGlvbi4gVGhpcyBzZXR0aW5nIGlzIGdlbmVyYWxseSBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdSBoYXZlIGEgdmVyeSBzcGVjaWZpYyB1c2UgY2FzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb2dyYW1OYW1lU2Vuc2l0aXZpdHkge1xuICAgIENvYXJzZSA9ICdjb2Fyc2UnLFxuICAgIEJhbGFuY2VkID0gJ2JhbGFuY2VkJyxcbiAgICBTdHJpY3QgPSAnc3RyaWN0JyxcbiAgICBFeGFjdCA9ICdleGFjdCdcbn1cblxuLyoqXG4gKiBUaGUgZW1wbG95ZWVcXCdzIGVzdGltYXRlZCBhbm51YWwgc2FsYXJ5LCBhcyBkZXJpdmVkIGZyb20gaW5mb3JtYXRpb24gcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5jaWRlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RCYW5rQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RCYW5rQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0QmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGdWxsIGFjY291bnQgbnVtYmVyIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgbnVtYmVyIG9mIHRoZSBiYW5rIGFjY291bnQuIE11c3QgYmUgcHJlc2VudCBpZiBgYWNjb3VudF9udW1iZXJgIGlzIHByZXNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IG9iamVjdCBmb3IgL3Byb3RlY3QvY29tcHV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0Q29tcHV0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0Q29tcHV0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIFRydXN0IEluZGV4IG1vZGVsIHRvIHVzZSBmb3Igc2NvcmluZywgd2l0aCBhIG1ham9yLm1pbm9yIHZlcnNpb24gc3VmZml4LiBFeGFtcGxlczogYHRpLWxpbmstc2Vzc2lvbi0yLjBgIChsaW5rLXNlc3Npb24gZnJhdWQpLCBgdGktaWRlbnRpdHktMi4wYCAoaWRlbnRpdHkgZnJhdWQpLCBgY2FzaC1hZHZhbmNlLW9uYm9hcmRpbmctMS4wYCAoZmlyc3QgY2FzaCBhZHZhbmNlKSwgYW5kIGBjYXNoLWFkdmFuY2Utb25nb2luZy0xLjBgIChzdWJzZXF1ZW50IGNhc2ggYWR2YW5jZXMpLiBUaGUgbW9kZWwgc3BlY2lmaWVkIG1heSByZXF1aXJlIGNlcnRhaW4gZmllbGRzIHdpdGhpbiBgbW9kZWxfaW5wdXRzYDsgZm9yIGV4YW1wbGUsIGB0aS1saW5rLXNlc3Npb24tMi4wYCByZXF1aXJlcyB0aGUgYGxpbmtgIGZpZWxkLiBDYXNoLWFkdmFuY2UgbW9kZWxzIGRvIG5vdCB1c2UgYG1vZGVsX2lucHV0c2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgbW9kZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFByb3RlY3RVc2VyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0TW9kZWxJbnB1dHN9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1vZGVsX2lucHV0cz86IFByb3RlY3RNb2RlbElucHV0cyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3BvbnNlIG9iamVjdCBmb3IgL3Byb3RlY3QvY29tcHV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdENvbXB1dGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFRydXN0IEluZGV4IHNjb3JlLCBvbiBhIDAtMTAwIHNjYWxlIHdoZXJlIGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgcmlzay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uZWQgbmFtZSBvZiB0aGUgVHJ1c3QgSW5kZXggbW9kZWwgdXNlZCBmb3Igc2NvcmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXZlbnQgZnJhdWQgYXR0cmlidXRlcyBhcyBhbiBhcmJpdHJhcnkgc2V0IG9mIGtleS12YWx1ZSBwYWlycy4gVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHJldHVybmVkIHZhcmllcyBieSBtb2RlbC5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0Q29tcHV0ZVN1YnNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN1YnNjb3Jlcz86IFByb3RlY3RDb21wdXRlU3Vic2NvcmVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGVyLWJ1Y2tldCBzdWJzY29yZXMgcmV0dXJuZWQgYWxvbmdzaWRlIHRoZSBvdmVyYWxsIFRydXN0IEluZGV4IHNjb3JlLiBGb3IgY2FzaC1hZHZhbmNlIG1vZGVscywgZWFjaCBrZXkgbWFwcyB0byBhbiBhbW91bnQtYnVja2V0IHN1YnNjb3JlICgwLTEwMCk7IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgZnJhdWQgcmlzay4gT25seSBidWNrZXRzIHRoYXQgd2VyZSBzY29yZWQgYXJlIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0Q29tcHV0ZVN1YnNjb3JlcyB7XG4gICAgLyoqXG4gICAgICogU3Vic2NvcmUgZm9yIGNhc2ggYWR2YW5jZSBhbW91bnRzIGluIHRoZSByYW5nZSAkMC0kMjUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzBfMjU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1YnNjb3JlIGZvciBjYXNoIGFkdmFuY2UgYW1vdW50cyBpbiB0aGUgcmFuZ2UgJDI1LSQ1MC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVN1YnNjb3Jlc1xuICAgICAqL1xuICAgIGNhc2hfYWR2YW5jZV9idWNrZXRfMjVfNTA/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1YnNjb3JlIGZvciBjYXNoIGFkdmFuY2UgYW1vdW50cyBpbiB0aGUgcmFuZ2UgJDUwLSQxMDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzUwXzEwMD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3Vic2NvcmUgZm9yIGNhc2ggYWR2YW5jZSBhbW91bnRzIGluIHRoZSByYW5nZSAkMTAwLSQyMDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzEwMF8yMDA/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1YnNjb3JlIGZvciBjYXNoIGFkdmFuY2UgYW1vdW50cyBpbiB0aGUgcmFuZ2UgJDIwMC0kMzAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlU3Vic2NvcmVzXG4gICAgICovXG4gICAgY2FzaF9hZHZhbmNlX2J1Y2tldF8yMDBfMzAwPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdWJzY29yZSBmb3IgY2FzaCBhZHZhbmNlIGFtb3VudHMgaW4gdGhlIHJhbmdlICQzMDAtJDQwMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVN1YnNjb3Jlc1xuICAgICAqL1xuICAgIGNhc2hfYWR2YW5jZV9idWNrZXRfMzAwXzQwMD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3Vic2NvcmUgZm9yIGNhc2ggYWR2YW5jZSBhbW91bnRzIGluIHRoZSByYW5nZSAkNDAwLSQ1MDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzQwMF81MDA/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBFdmVudCBkYXRhIGZvciBQcm90ZWN0IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBldmVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBwcmVzZW50LCBjb250YWlucyB0aGUgY3VycmVudCBQcm90ZWN0IFNlc3Npb24gSUQgZnJvbSB0aGUgUGxhaWQgUGl4ZWwgU0RLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIHByb3RlY3Rfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IHR5cGUgcmVwcmVzZW50cyBhIHVzZXIgdmlzaXRpbmcgdGhlIGNsaWVudCBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIGFwcF92aXNpdD86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IHR5cGUgcmVwcmVzZW50cyBhIHVzZXIgc2lnbmluZyBpbiB0byB0aGUgYXBwbGljYXRpb24uXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRcbiAgICAgKi9cbiAgICB1c2VyX3NpZ25faW4/OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCB0eXBlIHJlcHJlc2VudHMgYSB1c2VyIHNpZ25pbmcgdXAgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIHVzZXJfc2lnbl91cD86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBvYmplY3QgZm9yIC9wcm90ZWN0L2V2ZW50L2dldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBJRCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIG9iamVjdCBmb3IgL3Byb3RlY3QvZXZlbnQvZ2V0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RFdmVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgZXZlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJ1c3RJbmRleH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cnVzdF9pbmRleD86IFRydXN0SW5kZXggfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGZyYXVkIGF0dHJpYnV0ZXMgYXMgYW4gYXJiaXRyYXJ5IHNldCBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZSBzZXQgb2YgYXR0cmlidXRlcyByZXR1cm5lZCB2YXJpZXMgYnkgbW9kZWwuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2F0dHJpYnV0ZXM/OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IG9iamVjdCBmb3IgL3Byb3RlY3QvZXZlbnQvc2VuZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0RXZlbnRTZW5kUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRTZW5kUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRTZW5kUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgb2YgdGhlIGV2ZW50LiBNaWdodCBiZSB0aGUgY3VycmVudCBtb21lbnQgb3IgYSB0aW1lIGluIHRoZSBwYXN0LiBJbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0XG4gICAgICovXG4gICAgdGltZXN0YW1wPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0RXZlbnR9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnQ6IFByb3RlY3RFdmVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJvdGVjdCBTZXNzaW9uIElEIHNob3VsZCBiZSBwcm92aWRlZCBmb3IgYW55IGV2ZW50IGNvcnJlbGF0ZWQgd2l0aCBhIGZyb250ZW5kIHVzZXIgc2Vzc2lvbiBzdGFydGVkIHZpYSB0aGUgUHJvdGVjdCBTREsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0X3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIGV2ZW50IHNob3VsZCBiZSBzY29yZWQgd2l0aCBUcnVzdCBJbmRleC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWVzdF90cnVzdF9pbmRleD86IGJvb2xlYW47XG59XG4vKipcbiAqIFJlc3BvbnNlIG9iamVjdCBmb3IgL3Byb3RlY3QvZXZlbnQvc2VuZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0RXZlbnRTZW5kUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0RXZlbnRTZW5kUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjb3JkZWQgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJ1c3RJbmRleH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJ1c3RfaW5kZXg/OiBUcnVzdEluZGV4IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFdmVudCBmcmF1ZCBhdHRyaWJ1dGVzIGFzIGFuIGFyYml0cmFyeSBzZXQgb2Yga2V5LXZhbHVlIHBhaXJzLiBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgcmV0dXJuZWQgdmFyaWVzIGJ5IG1vZGVsLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfYXR0cmlidXRlcz86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbW9uZXRhcnkgYW1vdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5jaWRlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RJbmNpZGVudEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RJbmNpZGVudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGluY2lkZW50IGFtb3VudC4gRGVmYXVsdHMgdG8gYFVTRGAgaWYgbm90IHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbmV0YXJ5IHZhbHVlIG9mIHRoZSBpbmNpZGVudCBhbW91bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50QW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgaW5jaWRlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEluY2lkZW50RXZlbnQge1xuICAgIC8qKlxuICAgICAqIEEgZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIGEgUHJvdGVjdCBldmVudCB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIHByb3RlY3RfZXZlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgTGluayBzZXNzaW9uIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gc2Vzc2lvbiB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIGlkdl9zZXNzaW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHVzZWQgdG8gcmVmZXIgdG8gYSBTaWduYWwgdHJhbnNhY3Rpb24gZXZhbHVhdGlvbiB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIHNpZ25hbF9jbGllbnRfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgaW5jaWRlbnQgaW4geW91ciBzeXN0ZW0uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIGludGVybmFsX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBpbmNpZGVudCBvY2N1cnJlZCwgaW4gSVNPIDg2MDEgZm9ybWF0IChlLmcuLCBcXCcyMDIwLTA3LTI0VDAzOjI2OjAyWlxcJykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRcbiAgICAgKi9cbiAgICB0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdEluY2lkZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIGFtb3VudD86IFByb3RlY3RJbmNpZGVudEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSByZWxhdGVkIHRvIHRoaXMgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYGl0ZW1faWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSByZWxhdGVkIHRvIHRoaXMgaW5jaWRlbnQuIFRvIGlkZW50aWZ5IGFuIEl0ZW0gd2hlbiBjcmVhdGluZyBhIHJlcG9ydCwgcHJvdmlkZSBgYWNjZXNzX3Rva2VuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBpbmNpZGVudCBldmVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIGEgUHJvdGVjdCBldmVudCB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvdGVjdF9ldmVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBMaW5rIHNlc3Npb24gdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHNlc3Npb24gdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkdl9zZXNzaW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHVzZWQgdG8gcmVmZXIgdG8gYSBTaWduYWwgdHJhbnNhY3Rpb24gZXZhbHVhdGlvbiB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlXG4gICAgICovXG4gICAgc2lnbmFsX2NsaWVudF90cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBpbmNpZGVudCBpbiB5b3VyIHN5c3RlbS4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnRlcm5hbF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgaW5jaWRlbnQgb2NjdXJyZWQsIGluIElTTyA4NjAxIGZvcm1hdCAoZS5nLiwgXFwnMjAyMC0wNy0yNFQwMzoyNjowMlpcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdEluY2lkZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50PzogUHJvdGVjdEluY2lkZW50QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSByZWxhdGVkIHRvIHRoaXMgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnB1dHMgZm9yIGxpbmsgc2Vzc2lvbiBUcnVzdCBJbmRleCBtb2RlbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RMaW5rTW9kZWxJbnB1dHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0TGlua01vZGVsSW5wdXRzIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uLCB1c2VkIHRvIGNvbXB1dGUgYSBUcnVzdCBJbmRleCBzY29yZSBhbmQgZnJhdWQgYXR0cmlidXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0TGlua01vZGVsSW5wdXRzXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0cmFuc2FjdGlvbiBleHRyYWN0aW9uIG11c3QgYmUgY29tcGxldGUgYmVmb3JlIHNjb3JpbmcuIElmIGBmYWxzZWAgKGRlZmF1bHQpLCByZXR1cm5zIGEgc2NvcmUgd2hldGhlciBvciBub3QgdHJhbnNhY3Rpb24gZXh0cmFjdGlvbiBpcyBjb21wbGV0ZSwgYXMgbG9uZyBhcyB0aGUgbGluayBzZXNzaW9uIGlzIGZpbmlzaGVkOyBpZiBkYXRhIGhhcyBiZWVuIGV4dHJhY3RlZCBpdCB3aWxsIHN0aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzY29yZSBjb21wdXRhdGlvbi4gSWYgYHRydWVgLCByZXR1cm5zIEhUVFAgNDAwIHdpdGggYGVycm9yX3R5cGVgID0gYElOVkFMSURfUkVRVUVTVGAgYW5kIGBlcnJvcl9jb2RlYCA9IGBGQUlMRURfUFJFQ09ORElUSU9OYCBpZiBleHRyYWN0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzOyBvbmNlIGRhdGEgaXMgcmVhZHkgYSBzY29yZSB3aWxsIGJlIHJldHVybmVkIG5vcm1hbGx5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0TGlua01vZGVsSW5wdXRzXG4gICAgICovXG4gICAgcmVxdWlyZV9leHRyYWN0ZWRfZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIElucHV0cyByZXF1aXJlZCBieSBjZXJ0YWluIFRydXN0IEluZGV4IG1vZGVscy4gVGhlIGBsaW5rYCBmaWVsZCBpcyByZXF1aXJlZCBmb3IgbGluay1zZXNzaW9uIG1vZGVscy4gT3RoZXIgbW9kZWwgZmFtaWxpZXMgKGluY2x1ZGluZyBjYXNoLWFkdmFuY2UpIGFyZSBpZGVudGlmaWVkIGJ5IGB1c2VyYCBhbG9uZSBhbmQgZG8gbm90IHVzZSB0aGlzIG9iamVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdE1vZGVsSW5wdXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdE1vZGVsSW5wdXRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdExpbmtNb2RlbElucHV0c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdE1vZGVsSW5wdXRzXG4gICAgICovXG4gICAgbGluaz86IFByb3RlY3RMaW5rTW9kZWxJbnB1dHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0U0RLTW9kZWxJbnB1dHN9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RNb2RlbElucHV0c1xuICAgICAqL1xuICAgIHNkaz86IFByb3RlY3RTREtNb2RlbElucHV0cyB8IG51bGw7XG59XG4vKipcbiAqIEEgUHJvdGVjdCByZXBvcnQgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci4gQ29udGFpbnMgZGV0YWlscyBhYm91dCBkb2N1bWVudGVkIGluY2lkZW50cywgd2hpY2ggbWF5IGluY2x1ZGUgZnJhdWQsIGludmVzdGlnYXRpb24gb3V0Y29tZXMsIG9yIG90aGVyIHJpc2sgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0UmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgdGhlIHN1Ym1pdHRlZCByZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0XG4gICAgICovXG4gICAgaW5jaWRlbnRfZXZlbnQ6IFByb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0UmVwb3J0Q29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9jb25maWRlbmNlOiBQcm90ZWN0UmVwb3J0Q29uZmlkZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdFJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUHJvdGVjdFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RSZXBvcnRTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfc291cmNlOiBQcm90ZWN0UmVwb3J0U291cmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0QmFua0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRcbiAgICAgKi9cbiAgICBiYW5rX2FjY291bnQ6IFByb3RlY3RCYW5rQWNjb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQUNIIHJldHVybiBjb2RlIGlmIHRoZSByZXBvcnQgdHlwZSBpcyBgQUNIX1JFVFVSTmAgKGUuZy4gYFIwMWApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBjb250ZXh0IG9yIGRldGFpbHMgYWJvdXQgdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0XG4gICAgICovXG4gICAgbm90ZXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSByZXBvcnQgd2FzIGNyZWF0ZWQsIGluIElTTyA4NjAxIGZvcm1hdCAoZS5nLiwgXFwnMjAyMC0wNy0yNFQwMzoyNjowMlpcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb25maWRlbmNlIGxldmVsIG9mIHRoZSBpbmNpZGVudCByZXBvcnQuIGBDT05GSVJNRURgIGluZGljYXRlcyB0aGUgaW5jaWRlbnQgaGFzIGJlZW4gdmVyaWZpZWQgYW5kIGRlZmluaXRpdmVseSBvY2N1cnJlZC4gIGBTVVNQRUNURURgIGluZGljYXRlcyB0aGUgaW5jaWRlbnQgaXMgYmVsaWV2ZWQgdG8gaGF2ZSBvY2N1cnJlZCBidXQgaGFzIG5vdCBiZWVuIGZ1bGx5IHZlcmlmaWVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvdGVjdFJlcG9ydENvbmZpZGVuY2Uge1xuICAgIENvbmZpcm1lZCA9ICdDT05GSVJNRUQnLFxuICAgIFN1c3BlY3RlZCA9ICdTVVNQRUNURUQnXG59XG5cbi8qKlxuICogUmVxdWVzdCBvYmplY3QgZm9yIGAvcHJvdGVjdC9yZXBvcnQvY3JlYXRlYC4gWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYHVzZXJfaWRgLCBvciBhbiBgaW5jaWRlbnRfZXZlbnRgIHdpdGggYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBpZGVudGlmaWVyOiBgbGlua19zZXNzaW9uX2lkYCwgYGlkdl9zZXNzaW9uX2lkYCwgYHByb3RlY3RfZXZlbnRfaWRgLCBgc2lnbmFsX2NsaWVudF90cmFuc2FjdGlvbl9pZGAsIG9yIGBhY2Nlc3NfdG9rZW5gLiBDb250ZXh0IGZpZWxkcyBzdWNoIGFzIGBpbnRlcm5hbF9yZWZlcmVuY2VgLCBgdGltZWAsIGBhbW91bnRgLCBhbmQgYGJhbmtfYWNjb3VudGAgZG8gbm90IHNhdGlzZnkgdGhpcyBpZGVudGlmaWVyIHJlcXVpcmVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgVXNlciBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RJbmNpZGVudEV2ZW50fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluY2lkZW50X2V2ZW50PzogUHJvdGVjdEluY2lkZW50RXZlbnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0UmVwb3J0Q29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfY29uZmlkZW5jZTogUHJvdGVjdFJlcG9ydENvbmZpZGVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBQcm90ZWN0UmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdFJlcG9ydFNvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfc291cmNlOiBQcm90ZWN0UmVwb3J0U291cmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0QmFua0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50PzogUHJvdGVjdEJhbmtBY2NvdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIGBSMDFgKSwgcmVxdWlyZWQgaWYgYHJlcG9ydF90eXBlYCBpcyBgQUNIX1JFVFVSTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgY29udGV4dCBvciBkZXRhaWxzIGFib3V0IHRoZSByZXBvcnQsIHJlcXVpcmVkIGlmIGByZXBvcnRfdHlwZWAgaXMgYE9USEVSYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5vdGVzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciAvcHJvdGVjdC9yZXBvcnQvY3JlYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgdGhlIHN1Ym1pdHRlZCByZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNvdXJjZSB0aGF0IGlkZW50aWZpZWQgb3IgcmVwb3J0ZWQgdGhlIGluY2lkZW50LiAgYElOVEVSTkFMX1JFVklFV2AgLSBJbmNpZGVudCB3YXMgaWRlbnRpZmllZCB0aHJvdWdoIGludGVybmFsIGZyYXVkIGludmVzdGlnYXRpb25zIG9yIHJldmlldyBwcm9jZXNzZXMuICBgVVNFUl9TRUxGX1JFUE9SVEVEYCAtIEluY2lkZW50IHdhcyByZXBvcnRlZCBkaXJlY3RseSBieSB0aGUgYWZmZWN0ZWQgdXNlci4gIGBCQU5LX0ZFRURCQUNLYCAtIEluY2lkZW50IHdhcyBpZGVudGlmaWVkIHRocm91Z2ggYmFuayBmZWVkYmFjaywgaW5jbHVkaW5nIEFDSCByZXR1cm5zIGFuZCBjb25uZWN0aW9uIHJldm9jYXRpb25zLiAgYE5FVFdPUktfRkVFREJBQ0tgIC0gSW5jaWRlbnQgd2FzIGlkZW50aWZpZWQgdGhyb3VnaCBjYXJkIG5ldHdvcmsgYWxlcnRzIG9yIGNoYXJnZWJhY2tzLiAgYEFVVE9NQVRFRF9TWVNURU1gIC0gSW5jaWRlbnQgd2FzIGRldGVjdGVkIGJ5IGF1dG9tYXRlZCBzeXN0ZW1zIHN1Y2ggYXMgZnJhdWQgbW9kZWxzIG9yIHJ1bGUgZW5naW5lcy4gIGBUSElSRF9QQVJUWV9BTEVSVGAgLSBJbmNpZGVudCB3YXMgaWRlbnRpZmllZCB0aHJvdWdoIGV4dGVybmFsIHZlbmRvciBvciBjb25zb3J0aXVtIGFsZXJ0cy4gIGBPVEhFUmAgLSBJbmNpZGVudCB3YXMgaWRlbnRpZmllZCB0aHJvdWdoIGEgc291cmNlIG5vdCBjb3ZlcmVkIGJ5IG90aGVyIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm90ZWN0UmVwb3J0U291cmNlIHtcbiAgICBJbnRlcm5hbFJldmlldyA9ICdJTlRFUk5BTF9SRVZJRVcnLFxuICAgIFVzZXJTZWxmUmVwb3J0ZWQgPSAnVVNFUl9TRUxGX1JFUE9SVEVEJyxcbiAgICBCYW5rRmVlZGJhY2sgPSAnQkFOS19GRUVEQkFDSycsXG4gICAgTmV0d29ya0ZlZWRiYWNrID0gJ05FVFdPUktfRkVFREJBQ0snLFxuICAgIEF1dG9tYXRlZFN5c3RlbSA9ICdBVVRPTUFURURfU1lTVEVNJyxcbiAgICBUaGlyZFBhcnR5QWxlcnQgPSAnVEhJUkRfUEFSVFlfQUxFUlQnLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGluY2lkZW50IGJlaW5nIHJlcG9ydGVkLiAgYFVTRVJfQUNDT1VOVF9UQUtFT1ZFUmAgLSBJbmRpY2F0ZXMgdGhhdCBhIGxlZ2l0aW1hdGUgdXNlclxcJ3MgYWNjb3VudCB3YXMgYWNjZXNzZWQgb3IgY29udHJvbGxlZCBieSBhbiB1bmF1dGhvcml6ZWQgcGFydHkuICBgRkFMU0VfSURFTlRJVFlgIC0gSW5kaWNhdGVzIHRoYXQgYSB1c2VyIGNyZWF0ZWQgYW4gYWNjb3VudCB1c2luZyBzdG9sZW4gb3IgZmFicmljYXRlZCBpZGVudGl0eSBpbmZvcm1hdGlvbi4gIGBTVE9MRU5fSURFTlRJVFlgIC0gSW5kaWNhdGVzIHRoYXQgYSB1c2VyIGNyZWF0ZWQgYW4gYWNjb3VudCB1c2luZyBpZGVudGl0eSBpbmZvcm1hdGlvbiBiZWxvbmdpbmcgdG8gYSByZWFsIGluZGl2aWR1YWwgd2l0aG91dCB0aGVpciBjb25zZW50LiAgYFNZTlRIRVRJQ19JREVOVElUWWAgLSBJbmRpY2F0ZXMgdGhhdCBhIHVzZXIgY3JlYXRlZCBhbiBhY2NvdW50IHVzaW5nIGEgZmFrZSBvciBwYXJ0aWFsbHkgZmFicmljYXRlZCBpZGVudGl0eSAoZS5nLiwgY29tYmluaW5nIHJlYWwgYW5kIGZha2UgaW5mb3JtYXRpb24gdG8gZm9ybSBhIG5ldyBwZXJzb25hKS4gIGBNVUxUSVBMRV9VU0VSX0FDQ09VTlRTYCAtIEluZGljYXRlcyB0aGF0IHRoZSBzYW1lIGluZGl2aWR1YWwgaXMgb3BlcmF0aW5nIG11bHRpcGxlIGFjY291bnRzIGluIHZpb2xhdGlvbiBvZiBwb2xpY3kuICBgU0NBTV9WSUNUSU1gIC0gSW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgd2FzIHRyaWNrZWQgaW50byBhdXRob3JpemluZyBvciBzZW5kaW5nIGZ1bmRzIGFzIHBhcnQgb2YgYSBzY2FtLiAgYEJBTktfQUNDT1VOVF9UQUtFT1ZFUmAgLSBJbmRpY2F0ZXMgdGhhdCBhIHVzZXJcXCdzIGxpbmtlZCBiYW5rIGFjY291bnQgd2FzIGFjY2Vzc2VkIG9yIG1pc3VzZWQgYnkgYW4gdW5hdXRob3JpemVkIHBhcnR5LiAgYEJBTktfQ09OTkVDVElPTl9SRVZPS0VEYCAtIEluZGljYXRlcyB0aGF0IGEgbGlua2VkIGJhbmsgYWNjb3VudCBjb25uZWN0aW9uIHdhcyByZXZva2VkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIG9mdGVuIGR1ZSB0byBzdXNwZWN0ZWQgbWlzdXNlLCBmcmF1ZCwgb3Igc2VjdXJpdHkgY29uY2VybnMuICBgQ0FSRF9URVNUSU5HYCAtIEluZGljYXRlcyB0aGF0IGEgY2FyZCB3YXMgdXNlZCBpbiBzbWFsbCBvciByZXBlYXRlZCB0cmFuc2FjdGlvbnMgdG8gdGVzdCBpdHMgdmFsaWRpdHkuICBgVU5BVVRIT1JJWkVEX1RSQU5TQUNUSU9OYCAtIEluZGljYXRlcyB0aGF0IGEgdHJhbnNhY3Rpb24gd2FzIG1hZGUgd2l0aG91dCB0aGUgdXNlclxcJ3MgY29uc2VudCBvciBhdXRob3JpemF0aW9uLiAgYENBUkRfQ0hBUkdFQkFDS2AgLSBJbmRpY2F0ZXMgdGhhdCBhIGNhcmQgdHJhbnNhY3Rpb24gd2FzIHJldmVyc2VkIHZpYSBhIGNoYXJnZWJhY2sgY2xhaW0uICBgQUNIX1JFVFVSTmAgLSBJbmRpY2F0ZXMgdGhhdCBhbiBBQ0ggdHJhbnNhY3Rpb24gd2FzIHJldHVybmVkIG9yIHJldmVyc2VkIGJ5IHRoZSBiYW5rLiAgYERJU1BVVEVgIC0gSW5kaWNhdGVzIHRoYXQgYSB1c2VyIGZpbGVkIGEgZGlzcHV0ZSByZWdhcmRpbmcgYSB0cmFuc2FjdGlvbiBvciBhY2NvdW50IGFjdGl2aXR5LiAgYEZJUlNUX1BBUlRZX0ZSQVVEYCAtIEluZGljYXRlcyB0aGF0IGEgdXNlciBpbnRlbnRpb25hbGx5IG1pc3JlcHJlc2VudGVkIHRoZW1zZWx2ZXMgb3IgdGhlaXIgYWN0aW9ucyBmb3IgZmluYW5jaWFsIGdhaW4uICBgTUlTU0VEX1BBWU1FTlRgIC0gSW5kaWNhdGVzIHRoYXQgYSB1c2VyIGZhaWxlZCB0byBtYWtlIGEgcmVxdWlyZWQgcGF5bWVudCBvbiB0aW1lLiAgYExPQU5fU1RBQ0tJTkdgIC0gSW5kaWNhdGVzIHRoYXQgYSB1c2VyIGFwcGxpZWQgZm9yIG9yIHRvb2sgb3V0IG11bHRpcGxlIGxvYW5zIHNpbXVsdGFuZW91c2x5IGJleW9uZCB0aGVpciBhYmlsaXR5IHRvIHJlcGF5LiAgYE1PTkVZX0xBVU5ERVJJTkdgIC0gSW5kaWNhdGVzIHRoYXQgZnVuZHMgYXJlIGJlaW5nIG1vdmVkIHRocm91Z2ggYWNjb3VudHMgdG8gb2JzY3VyZSB0aGVpciBpbGxpY2l0IG9yaWdpbi4gIGBOT19GUkFVRGAgLSBJbmRpY2F0ZXMgdGhhdCBhbiBpbnZlc3RpZ2F0aW9uIGRldGVybWluZWQgbm8gZnJhdWR1bGVudCBhY3Rpdml0eSBvY2N1cnJlZCBvbiB1c2VyL2V2ZW50IChwb3NpdGl2ZSBsYWJlbCkuICBgT1RIRVJgIC0gSW5kaWNhdGVzIHRoYXQgdGhlIGNhc2UgaW52b2x2ZXMgZnJhdWQgb3IgZmluYW5jaWFsIHJpc2sgbm90IGNvdmVyZWQgYnkgb3RoZXIgcmVwb3J0IHR5cGVzLiBSZXF1aXJlcyBub3RlcyBkZXNjcmliaW5nIHRoZSByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm90ZWN0UmVwb3J0VHlwZSB7XG4gICAgVXNlckFjY291bnRUYWtlb3ZlciA9ICdVU0VSX0FDQ09VTlRfVEFLRU9WRVInLFxuICAgIEZhbHNlSWRlbnRpdHkgPSAnRkFMU0VfSURFTlRJVFknLFxuICAgIFN0b2xlbklkZW50aXR5ID0gJ1NUT0xFTl9JREVOVElUWScsXG4gICAgU3ludGhldGljSWRlbnRpdHkgPSAnU1lOVEhFVElDX0lERU5USVRZJyxcbiAgICBNdWx0aXBsZVVzZXJBY2NvdW50cyA9ICdNVUxUSVBMRV9VU0VSX0FDQ09VTlRTJyxcbiAgICBTY2FtVmljdGltID0gJ1NDQU1fVklDVElNJyxcbiAgICBCYW5rQWNjb3VudFRha2VvdmVyID0gJ0JBTktfQUNDT1VOVF9UQUtFT1ZFUicsXG4gICAgQmFua0Nvbm5lY3Rpb25SZXZva2VkID0gJ0JBTktfQ09OTkVDVElPTl9SRVZPS0VEJyxcbiAgICBDYXJkVGVzdGluZyA9ICdDQVJEX1RFU1RJTkcnLFxuICAgIFVuYXV0aG9yaXplZFRyYW5zYWN0aW9uID0gJ1VOQVVUSE9SSVpFRF9UUkFOU0FDVElPTicsXG4gICAgQ2FyZENoYXJnZWJhY2sgPSAnQ0FSRF9DSEFSR0VCQUNLJyxcbiAgICBBY2hSZXR1cm4gPSAnQUNIX1JFVFVSTicsXG4gICAgRGlzcHV0ZSA9ICdESVNQVVRFJyxcbiAgICBGaXJzdFBhcnR5RnJhdWQgPSAnRklSU1RfUEFSVFlfRlJBVUQnLFxuICAgIE1pc3NlZFBheW1lbnQgPSAnTUlTU0VEX1BBWU1FTlQnLFxuICAgIExvYW5TdGFja2luZyA9ICdMT0FOX1NUQUNLSU5HJyxcbiAgICBNb25leUxhdW5kZXJpbmcgPSAnTU9ORVlfTEFVTkRFUklORycsXG4gICAgTm9GcmF1ZCA9ICdOT19GUkFVRCcsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogSW5wdXRzIGZvciBQcm90ZWN0IFNESyBUcnVzdCBJbmRleCBtb2RlbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RTREtNb2RlbElucHV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RTREtNb2RlbElucHV0cyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIFByb3RlY3QgU0RLIHNlc3Npb24sIHVzZWQgdG8gY29tcHV0ZSBhIFRydXN0IEluZGV4IHNjb3JlIGFuZCBmcmF1ZCBhdHRyaWJ1dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RTREtNb2RlbElucHV0c1xuICAgICAqL1xuICAgIHNka19zZXNzaW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZW5kIHVzZXIgZm9yIGAvcHJvdGVjdC9jb21wdXRlYCByZXF1ZXN0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0VXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIFVzZXIgSUQgcmV0dXJuZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gYC91c2VyL2NyZWF0ZWAuIFRoaXMgb3IgYGNsaWVudF91c2VyX2lkYCBjYW4gYmUgcHJvdmlkZWQsIG5vdCBib3RoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLCBwcmV2aW91c2x5IHBhc3NlZCB0byBgL3VzZXIvY3JlYXRlYC4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZXJlIGhhcyBiZWVuIGEgbmV3IHVzZXIgZXZlbnQuIFRoZSB3ZWJob29rIHBheWxvYWQgY29udGFpbnMgbGltaXRlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQuIEZvciBmdWxsIGV2ZW50IGRldGFpbHMsIGNhbGwgW2AvcHJvdGVjdC9ldmVudC9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wcm90ZWN0LyNwcm90ZWN0ZXZlbnRnZXQpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0VXNlckV2ZW50V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RVc2VyRXZlbnRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIlBST1RFQ1RcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST1RFQ1RfVVNFUl9FVkVOVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckV2ZW50V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBJRCBvZiB0aGUgdXNlciBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gICAgICovXG4gICAgZXZlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB1c2VyIGV2ZW50IHRoYXQgb2NjdXJyZWQuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlIGBMSU5LX0NPTVBMRVRFYCAodGhlIExpbmsgc2Vzc2lvbiBoYXMgZmluaXNoZWQgYW5kIGEgVHJ1c3QgSW5kZXggc2NvcmUgaGFzIGJlZW4gY29tcHV0ZWQgd2l0aG91dCB3YWl0aW5nIGZvciB0cmFuc2FjdGlvbiBleHRyYWN0aW9uKSBhbmQgYFBST1RFQ1RfUlVOX0ZJTklTSGAgKGV4dHJhY3Rpb24tcmVxdWlyZWQgc2NvcmluZyBpcyBjb21wbGV0ZSwgaW5jbHVkaW5nIHRyYW5zYWN0aW9uIGV4dHJhY3Rpb247IG1heSBhcnJpdmUgMzAgc2Vjb25kcyBvciBtb3JlIGFmdGVyIExpbmsgY29tcGxldGlvbikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJFdmVudFdlYmhvb2tcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgZXZlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJFdmVudFdlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgVXNlciBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckV2ZW50V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfdXNlcl9pZGAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCB3aGVuIHRoZSB1c2VyIHdhcyBjcmVhdGVkIHZpYSBgL3VzZXIvY3JlYXRlYCBvciBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhpcyBldmVudCBvY2N1cnJlZCBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckV2ZW50V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3Qgb2JqZWN0IGZvciAvcHJvdGVjdC91c2VyL2luc2lnaHRzL2dldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgVXNlciBJRC4gRWl0aGVyIGB1c2VyX2lkYCBvciBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIuIEVpdGhlciBgdXNlcl9pZGAgb3IgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIG9iamVjdCBmb3IgL3Byb3RlY3QvdXNlci9pbnNpZ2h0cy9nZXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgVXNlciBJRC4gSWYgYSBgY2xpZW50X3VzZXJfaWRgIHdhcyBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBpbnN0ZWFkIG9mIGEgYHVzZXJfaWRgLCBhIG5ldyBgdXNlcl9pZGAgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgb25lIGRvZXNuXFwndCBhbHJlYWR5IGV4aXN0IGZvciB0aGF0IGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMYXRlc3RTY29yZWRFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGF0ZXN0X3Njb3JlZF9ldmVudDogTGF0ZXN0U2NvcmVkRXZlbnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUHJvdGVjdCByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIsIGxpbWl0ZWQgdG8gdGhlIG1vc3QgcmVjZW50IDEwMCByZXBvcnRzIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciAobmV3ZXN0IGZpcnN0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvdGVjdFJlcG9ydD59XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydHM/OiBBcnJheTxQcm90ZWN0UmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBhZGRyZXNzIGluZm9ybWF0aW9uIGZvciBhIGJ1c2luZXNzIGZyb20gZGF0YSBwcm92aWRlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm92aWRlckJ1c2luZXNzQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlLiBcXFwiU3ViZGl2aXNpb25cXFwiIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgZXRjLiBGb3IgdGhlIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdmlkZXJCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyBpcyB0aGUgcHJpbWFyeSBhZGRyZXNzIGZvciB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdmlkZXJCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBpc19wcmltYXJ5OiBib29sZWFuO1xufVxuLyoqXG4gKiBOYW1lIGFzc29jaWF0ZWQgd2l0aCBhIGJ1c2luZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3ZpZGVyQnVzaW5lc3NOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJCdXNpbmVzc05hbWUge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgdGhlIHByaW1hcnkgbmFtZSBmb3IgdGhlIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzTmFtZVxuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhbmQgYSBtYXhpbXVtIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzTmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgbmV0d29yayBwcm94eSBpcyBwcmVzZW50IGFuZCBpZiBzbyB3aGF0IHR5cGUgaXQgaXMuICBgbm9uZV9kZXRlY3RlZGAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG5vdCBvbiBhIGRldGVjdGFibGUgcHJveHkgbmV0d29yay4gIGB0b3JgIGluZGljYXRlcyB0aGUgdXNlciB3YXMgdXNpbmcgYSBUb3IgYnJvd3Nlciwgd2hpY2ggc2VuZHMgZW5jcnlwdGVkIHRyYWZmaWMgb24gYSBkZWNlbnRyYWxpemVkIG5ldHdvcmsgYW5kIGlzIHNvbWV3aGF0IHNpbWlsYXIgdG8gYSBWUE4gKFZpcnR1YWwgUHJpdmF0ZSBOZXR3b3JrKS4gIGB2cG5gIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspICBgd2ViX3Byb3h5YCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgb24gYSB3ZWIgcHJveHkgc2VydmVyLCB3aGljaCBtYXkgYWxsb3cgdGhlbSB0byBjb25jZWFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlaXIgSVAgYWRkcmVzcyBvciBvdGhlciBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gIGBwdWJsaWNfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHB1YmxpYyB3ZWIgcHJveHkgc2VydmVyLCB3aGljaCBpcyBzaW1pbGFyIHRvIGEgd2ViIHByb3h5IGJ1dCBjYW4gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIHVzZXJzLiBUaGlzIG1heSBhbGxvdyBtdWx0aXBsZSB1c2VycyB0byBhcHBlYXIgYXMgaWYgdGhleSBoYXZlIHRoZSBzYW1lIElQIGFkZHJlc3MgZm9yIGluc3RhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJveHlUeXBlIHtcbiAgICBOb25lRGV0ZWN0ZWQgPSAnbm9uZV9kZXRlY3RlZCcsXG4gICAgVG9yID0gJ3RvcicsXG4gICAgVnBuID0gJ3ZwbicsXG4gICAgV2ViUHJveHkgPSAnd2ViX3Byb3h5JyxcbiAgICBQdWJsaWNQcm94eSA9ICdwdWJsaWNfcHJveHknXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSByZWFzb24gZm9yIGNhbmNlbGxpbmcgdHJhbnNmZXIuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIFJmUCB0cmFuc2ZlcnMsIGFuZCB3aWxsIGJlIGlnbm9yZWQgZm9yIG90aGVyIG5ldHdvcmtzLiAgYFxcXCJBQzAzXFxcImAgLSBJbnZhbGlkIENyZWRpdG9yIEFjY291bnQgTnVtYmVyICBgXFxcIkFNMDlcXFwiYCAtIEluY29ycmVjdCBBbW91bnQgIGBcXFwiQ1VTVFxcXCJgIC0gUmVxdWVzdGVkIEJ5IEN1c3RvbWVyIC0gQ2FuY2VsbGF0aW9uIHJlcXVlc3RlZCAgYFxcXCJEVVBMXFxcImAgLSBEdXBsaWNhdGUgUGF5bWVudCAgYFxcXCJGUkFEXFxcImAgLSBGcmF1ZHVsZW50IFBheW1lbnQgLSBVbmF1dGhvcml6ZWQgb3IgZnJhdWR1bGVudGx5IGluZHVjZWQgIGBcXFwiVEVDSFxcXCJgIC0gVGVjaG5pY2FsIFByb2JsZW0gLSBDYW5jZWxsYXRpb24gZHVlIHRvIHN5c3RlbSBpc3N1ZXMgIGBcXFwiVVBBWVxcXCJgIC0gVW5kdWUgUGF5bWVudCAtIFBheW1lbnQgd2FzIG1hZGUgdGhyb3VnaCBhbm90aGVyIGNoYW5uZWwgIGBcXFwiQUMxNFxcXCJgIC0gSW52YWxpZCBvciBNaXNzaW5nIENyZWRpdG9yIEFjY291bnQgVHlwZSAgYFxcXCJBTTA2XFxcImAgLSBBbW91bnQgVG9vIExvdyAgYFxcXCJCRTA1XFxcImAgLSBVbnJlY29nbml6ZWQgSW5pdGlhdGluZyBQYXJ0eSAgYFxcXCJGT0NSXFxcImAgLSBGb2xsb3dpbmcgUmVmdW5kIFJlcXVlc3QgIGBcXFwiTVMwMlxcXCJgIC0gTm8gU3BlY2lmaWVkIFJlYXNvbiAtIEN1c3RvbWVyICBgXFxcIk1TMDNcXFwiYCAtIE5vIFNwZWNpZmllZCBSZWFzb24gLSBBZ2VudCAgYFxcXCJSUjA0XFxcImAgLSBSZWd1bGF0b3J5IFJlYXNvbiAgYFxcXCJSVVRBXFxcImAgLSBSZXR1cm4gVXBvbiBVbmFibGUgVG8gQXBwbHlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlYXNvbkNvZGUge1xuICAgIEFjMDMgPSAnQUMwMycsXG4gICAgQW0wOSA9ICdBTTA5JyxcbiAgICBDdXN0ID0gJ0NVU1QnLFxuICAgIER1cGwgPSAnRFVQTCcsXG4gICAgRnJhZCA9ICdGUkFEJyxcbiAgICBUZWNoID0gJ1RFQ0gnLFxuICAgIFVwYXkgPSAnVVBBWScsXG4gICAgQWMxNCA9ICdBQzE0JyxcbiAgICBBbTA2ID0gJ0FNMDYnLFxuICAgIEJlMDUgPSAnQkUwNScsXG4gICAgRm9jciA9ICdGT0NSJyxcbiAgICBNczAyID0gJ01TMDInLFxuICAgIE1zMDMgPSAnTVMwMycsXG4gICAgUnIwNCA9ICdSUjA0JyxcbiAgICBSdXRhID0gJ1JVVEEnXG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3Qgd2FzIGZsYWdnZWQgYnkgUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSBhbmQgcmVxdWlyZXMgYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gdG8gZW5zdXJlIHRoZSB1c2VyIGlzIG5vdCBhIGJvdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIGBSRUNBUFRDSEFfRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDQVBUQ0hBX1JFUVVJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA0MDBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgaHR0cF9jb2RlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogWW91ciB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8gc29sdmUgYSBHb29nbGUgcmVDQVBUQ0hBIGNoYWxsZW5nZSBpbiB0aGUgTGluayBSZWNhcHRjaGEgcGFuZS4gSWYgdGhleSBzb2x2ZSB0aGUgY2hhbGxlbmdlIHN1Y2Nlc3NmdWxseSwgdGhlIHVzZXJcXCdzIHJlcXVlc3QgaXMgcmVzdWJtaXR0ZWQgYW5kIHRoZXkgYXJlIGRpcmVjdGVkIHRvIHRoZSBuZXh0IEl0ZW0gY3JlYXRpb24gc3RlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgbGlua191c2VyX2V4cGVyaWVuY2U/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSBkZXRlY3RzIGFidXNpdmUgdHJhZmZpYyBhbmQgY29uc2lkZXJzIGEgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzIHRocm91Z2hvdXQgSXRlbSBjcmVhdGlvbiByZXF1ZXN0cy4gV2hlbiBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCByaXNreSBvciBwb3NzaWJseSBmcmF1ZHVsZW50LCBMaW5rIHByZXNlbnRzIGEgcmVDQVBUQ0hBIGZvciB0aGUgdXNlciB0byBzb2x2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgY29tbW9uX2NhdXNlcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaW5rIHdpbGwgYXV0b21hdGljYWxseSBndWlkZSB5b3VyIHVzZXIgdGhyb3VnaCByZUNBUFRDSEEgdmVyaWZpY2F0aW9uLiBBcyBhIGdlbmVyYWwgcnVsZSwgd2UgcmVjb21tZW5kIGluc3RydW1lbnRpbmcgYmFzaWMgZnJhdWQgbW9uaXRvcmluZyB0byBkZXRlY3QgYW5kIHByb3RlY3QgeW91ciB3ZWJzaXRlIGZyb20gc3BhbSBhbmQgYWJ1c2UuICBJZiB5b3VyIHVzZXIgY2Fubm90IHZlcmlmeSB0aGVpciBzZXNzaW9uLCBwbGVhc2Ugc3VibWl0IGEgc3VwcG9ydCB0aWNrZXQgd2l0aCB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOiBgbGlua19zZXNzaW9uX2lkYCBvciBgcmVxdWVzdF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgdHJvdWJsZXNob290aW5nX3N0ZXBzPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJhY3MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgeW91IG5lZWQgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQmFjcyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWNpcGllbnRCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDUyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJhY3MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgdGhpcyByZWNpcGllbnQgbmVlZHMgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQmFjcyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZWNvbW1lbmRhdGlvbiByZXN1bHQgZm9yIHRoYXQgZGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY29tbWVuZGF0aW9uU3RyaW5nIHtcbiAgICBSZWNvbW1lbmRlZCA9ICdSRUNPTU1FTkRFRCcsXG4gICAgTm90UmVjb21tZW5kZWQgPSAnTk9UX1JFQ09NTUVOREVEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjYW5jZWxsZWQgYnkgUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfQ0FOQ0VMTEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIHN0cmVhbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW0ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudC1wcm92aWRlZCByYXcgZGVzY3JpcHRpb24gb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgb3IgcHJpbWFyeSBjb3VudGVycGFydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gZWFjaCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19hcGFydDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIHRyYW5zYWN0aW9uIElEcyBiZWxvbmdpbmcgdG8gdGhlIHN0cmVhbSwgc29ydGVkIGJ5IHBvc3RlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgbmV3IHRyYW5zZmVyIG9mIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIG9yaWdpbmF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfTkVXX1RSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHdlZWsuICBgQklXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IDIgd2Vla3MuICBgU0VNSV9NT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSB0d2ljZSBwZXIgbW9udGguIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcy4gIGBNT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBtb250aC4gIGBBTk5VQUxMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgeWVhci4gIGBVTktOT1dOYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBkb2VzIG5vdCBmaXQgYW55IG9mIHRoZSBwcmUtZGVmaW5lZCBmcmVxdWVuY2llcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBlbmRwb2ludFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBpbmNvbWUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBzdWJzY3JpcHRpb25zLCBiaWxscywgbG9hbiBwYXltZW50cykuXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIGZvciBhY2NvdW50cyB0aGF0IGhhdmUgbmV3IG9yIHVwZGF0ZWQgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gIFRoZSBuZXh0IHRyYW5zZmVyIG9yaWdpbmF0aW9uIGRhdGUgYWZ0ZXIgYmFuayBob2xpZGF5IGFkanVzdG1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0ZWQgdHJhbnNmZXIgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLiBJZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWQsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlY3VycmluZyB0cmFuc2ZlciB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuICBUaGUgbmV4dCB0cmFuc2ZlciBvcmlnaW5hdGlvbiBkYXRlIGFmdGVyIGJhbmsgaG9saWRheSBhZGp1c3RtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGVkIHRyYW5zZmVyIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC4gSWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBoYXMgYmVlbiBuZXdseSBjcmVhdGVkLCB0aGlzIGFycmF5IHdpbGwgYmUgZW1wdHkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gUGxhaWQgaXMgdW5hYmxlIHRvIG9yaWdpbmF0ZSBhIG5ldyBBQ0ggdHJhbnNhY3Rpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBvbiB0aGUgcGxhbm5lZCBkYXRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TRkVSX1NLSVBQRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uX3JhdGlvbmFsZV9jb2RlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGFubmVkIGRhdGUgb24gd2hpY2ggUGxhaWQgaXMgdW5hYmxlIHRvIG9yaWdpbmF0ZSBhIG5ldyBBQ0ggdHJhbnNhY3Rpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIHNraXBwZWRfb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZWZyZXNoUmVzdWx0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBzdGF0dXMgb2YgYSB1c2VyIHJlZnJlc2ggZm9yIGEgc3BlY2lmaWMgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVmcmVzaFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZnJlc2hSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBQbGFpZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlZnJlc2hSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9kdWN0IGZvciB3aGljaCB0aGUgcmVmcmVzaCB3YXMgYXR0ZW1wdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlZnJlc2hSZXN1bHRcbiAgICAgKi9cbiAgICBwcm9kdWN0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBSZWZyZXNoUmVzdWx0XG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHJlbW92ZWQgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgb2YgdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVwb3J0IHR5cGUuIEl0IGNhbiBiZSBgYXNzZXRgLiBJbmNvbWUgcmVwb3J0IHR5cGVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlcG9ydFR5cGUge1xuICAgIEFzc2V0ID0gJ2Fzc2V0J1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0aW5nSW5mb3JtYXRpb24ge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uSWRlbnRpZmllcjogc3RyaW5nO1xufVxuLyoqXG4gKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGEgYnVzaW5lc3MuIFVzZWQgZm9yIGlucHV0IHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QnVzaW5lc3NBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEJ1c2luZXNzQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVxdWVzdEJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcXVlc3RCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcXVlc3RCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlLiBcXFwiU3ViZGl2aXNpb25cXFwiIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgZXRjLiBGb3IgdGhlIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0QnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVxdWVzdEJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcXVlc3RCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBidXNpbmVzcy4gVXNlZCBmb3IgcmVzcG9uc2Ugc2NoZW1hcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUJ1c2luZXNzQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuIElmIHByb3ZpZGVkLCBhIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDUwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZS4gXFxcIlN1YmRpdmlzaW9uXFxcIiBpcyBhIGdlbmVyaWMgdGVybSBmb3IgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIGV0Yy4gRm9yIHRoZSBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlc3BvbnNlQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXNwb25zZUJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgYmVoYXZpb3JgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjaywgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0JlaGF2aW9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrQmVoYXZpb3Ige1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrQmVoYXZpb3JcbiAgICAgKi9cbiAgICB1c2VyX2ludGVyYWN0aW9uczogUmlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrQmVoYXZpb3JcbiAgICAgKi9cbiAgICBmcmF1ZF9yaW5nX2RldGVjdGVkOiBSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yQm90RGV0ZWN0ZWRMYWJlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrQmVoYXZpb3JcbiAgICAgKi9cbiAgICBib3RfZGV0ZWN0ZWQ6IFJpc2tDaGVja0JlaGF2aW9yQm90RGV0ZWN0ZWRMYWJlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsV2l0aE5vRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrQmVoYXZpb3JcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsV2l0aE5vRGF0YTtcbn1cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3V0Y29tZSBvZiBhIGJvdCBkZXRlY3Rpb24gYmVoYXZpb3IgcmlzayBjaGVjay4gIGB5ZXNgIGluZGljYXRlcyB0aGF0IGF1dG9tYXRlZCBhY3Rpdml0eSB3YXMgZGV0ZWN0ZWQuICBgbm9gIGluZGljYXRlcyB0aGF0IGF1dG9tYXRlZCBhY3Rpdml0eSB3YXMgbm90IGRldGVjdGVkLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGVyZSB3YXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWwge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHRoZSBvdXRjb21lIG9mIGEgZnJhdWQgcmluZyBiZWhhdmlvciByaXNrIGNoZWNrLiAgYHllc2AgaW5kaWNhdGVzIHRoYXQgZnJhdWQgcmluZyBhY3Rpdml0eSB3YXMgZGV0ZWN0ZWQuICBgbm9gIGluZGljYXRlcyB0aGF0IGZyYXVkIHJpbmcgYWN0aXZpdHkgd2FzIG5vdCBkZXRlY3RlZC4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3ZlcmFsbCB1c2VyIGludGVyYWN0aW9uIHNpZ25hbHMgb2YgYSBiZWhhdmlvciByaXNrIGNoZWNrLiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgaG93IGZhbWlsaWFyIHRoZSB1c2VyIGlzIHdpdGggdGhlIHBlcnNvbmFsIGRhdGEgdGhleSBwcm92aWRlLCBiYXNlZCBvbiBhIG51bWJlciBvZiBzaWduYWxzIHRoYXQgYXJlIGNvbGxlY3RlZCBkdXJpbmcgdGhlaXIgc2Vzc2lvbi4gIGBnZW51aW5lYCBpbmRpY2F0ZXMgdGhlIHVzZXIgaGFzIGhpZ2ggZmFtaWxpYXJpdHkgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBwcm92aWRpbmcsIGFuZCB0aGF0IGZyYXVkIGlzIHVubGlrZWx5LiAgYG5ldXRyYWxgIGluZGljYXRlcyBzb21lIHNpZ25hbHMgYXJlIHByZXNlbnQgaW4gYmV0d2VlbiBgcmlza3lgIGFuZCBgZ2VudWluZWAsIGJ1dCB0aGVyZSBhcmUgbm90IGVub3VnaCBjbGVhciBzaWduYWxzIHRvIGRldGVybWluZSBhbiBvdXRjb21lLiAgYHJpc2t5YCBpbmRpY2F0ZXMgdGhlIHVzZXIgaGFzIGxvdyBmYW1pbGlhcml0eSB3aXRoIHRoZSBkYXRhIHRoZXkgYXJlIHByb3ZpZGluZywgYW5kIHRoYXQgZnJhdWQgaXMgbGlrZWx5LiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGVyZSBpcyBub3Qgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsIHtcbiAgICBHZW51aW5lID0gJ2dlbnVpbmUnLFxuICAgIE5ldXRyYWwgPSAnbmV1dHJhbCcsXG4gICAgUmlza3kgPSAncmlza3knLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgcmlza19jaGVja2Agc3RlcC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3J9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBiZWhhdmlvcjogUmlza0NoZWNrQmVoYXZpb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGVtYWlsOiBSaXNrQ2hlY2tFbWFpbCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1Bob25lfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgcGhvbmU6IFJpc2tDaGVja1Bob25lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiByZXN1bHQgc3VtbWFyeSBvYmplY3RzIHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgZGV2aWNlYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gICAgICogQHR5cGUge0FycmF5PFJpc2tDaGVja0RldmljZT59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBkZXZpY2VzOiBBcnJheTxSaXNrQ2hlY2tEZXZpY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGlkZW50aXR5X2FidXNlX3NpZ25hbHM6IFJpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIG5ldHdvcms/OiBSaXNrQ2hlY2tOZXR3b3JrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXR0cmlidXRlcyByZWxhdGVkIHRvIHRoZSBmYWNpYWwgZHVwbGljYXRlcyBjYXB0dXJlZCBpbiByaXNrIGNoZWNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrQ2hlY2tGYWNpYWxEdXBsaWNhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZmFjaWFsX2R1cGxpY2F0ZXM6IEFycmF5PFJpc2tDaGVja0ZhY2lhbER1cGxpY2F0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIHRydXN0IGluZGV4IHNjb3JlIGZvciB0aGUgYHJpc2tfY2hlY2tgIHN0ZXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHRydXN0X2luZGV4X3Njb3JlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBkZXZpY2VgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJveHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9wcm94eV90eXBlOiBQcm94eVR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENvdW50IG9mIHNwYW0gbGlzdHMgdGhlIElQIGFkZHJlc3MgaXMgYXNzb2NpYXRlZCB3aXRoIGlmIGtub3duLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3NwYW1fbGlzdF9jb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVVEMgb2Zmc2V0IG9mIHRoZSB0aW1lem9uZSBhc3NvY2lhdGVkIHdpdGggdGhlIElQIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfdGltZXpvbmVfb2Zmc2V0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgZmFjdG9ycz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGVtYWlsYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0VtYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrRW1haWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgaXNfZGVsaXZlcmFibGU6IFJpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb3VudCBvZiBhbGwga25vd24gYnJlYWNoZXMgb2YgdGhpcyBlbWFpbCBhZGRyZXNzIGlmIGtub3duLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgYnJlYWNoX2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGZpcnN0X2JyZWFjaGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGxhc3RfYnJlYWNoZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX3JlZ2lzdGVyZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2ZyZWVfcHJvdmlkZXI6IFJpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b219XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2N1c3RvbTogUmlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2Rpc3Bvc2FibGU6IFJpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIHRvcF9sZXZlbF9kb21haW5faXNfc3VzcGljaW91czogUmlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxJc0VkdX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBpc19lZHU6IFJpc2tDaGVja0VtYWlsSXNFZHU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsSW5jbHVkZXNEYXRlT2ZCaXJ0aH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBpbmNsdWRlc19kYXRlX29mX2JpcnRoOiBSaXNrQ2hlY2tFbWFpbEluY2x1ZGVzRGF0ZU9mQmlydGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBuYW1lOiBSaXNrQ2hlY2tFbWFpbE5hbWU7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG9ubGluZSBzZXJ2aWNlcyB3aGVyZSB0aGlzIGVtYWlsIGFkZHJlc3MgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGZhY3RvcnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyBkb21haW4gaXMgY3VzdG9tIGlmIGtub3duLCBpLmUuIGEgY29tcGFueSBkb21haW4gYW5kIG5vdCBmcmVlIG9yIGRpc3Bvc2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGRvbWFpbiBpcyBsaXN0ZWQgYXMgZGlzcG9zYWJsZSBpZiBrbm93bi4gRGlzcG9zYWJsZSBkb21haW5zIGFyZSBvZnRlbiB1c2VkIHRvIGNyZWF0ZSBlbWFpbCBhZGRyZXNzZXMgdGhhdCBhcmUgcGFydCBvZiBhIGZha2Ugc2V0IG9mIHVzZXIgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGEgZnJlZSBwcm92aWRlciBzdWNoIGFzIEdtYWlsIG9yIEhvdG1haWwgaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgaW5jbHVkZXMgdGhlIGRhdGUgb2YgYmlydGggb3IgeWVhciBvZiBiaXJ0aCBpZiBrbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsSW5jbHVkZXNEYXRlT2ZCaXJ0aCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFNNVFAtTVggY2hlY2sgdG8gY29uZmlybSB0aGUgZW1haWwgYWRkcmVzcyBleGlzdHMgaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyBkb21haW4gaXMgYW4gZWR1Y2F0aW9uYWwgaW5zdGl0dXRpb24gZG9tYWluIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxJc0VkdSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBuYW1lIG1hdGNoZXMgdGhlIGVtYWlsIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBLWUMgbmFtZS1tYXRjaGVzLWVtYWlsIGluZmVyZW5jZSByZXN1bHQgaWYga25vd24uICBgbWF0Y2hgIC0gXFxcIlRoZSBlbWFpbFxcJ3MgbmFtZSBpZGVudGlmaWVycyBtYXRjaCB0aGUgdXNlclxcJ3MgbmFtZS5cXFwiICBgcGFydGlhbF9tYXRjaGAgLSBcXFwiVGhlIGVtYWlsXFwncyBuYW1lIGlkZW50aWZpZXJzIHBhcnRpYWxseSBtYXRjaCB0aGUgdXNlclxcJ3MgbmFtZS5cXFwiICBgbm9fbWF0Y2hgIC0gXFxcIlRoZSBlbWFpbFxcJ3MgbmFtZSBpZGVudGlmaWVycyBkbyBub3QgbWF0Y2ggdGhlIHVzZXJcXCdzIG5hbWUuXFxcIiAgYGluZGV0ZXJtaW5hdGVgIC0gXFxcIlRoZSBlbWFpbCBkb2VzIG5vdCBjb250YWluIGFueSBuYW1lIGlkZW50aWZpZXJzLCBhbmQgYSBtYXRjaCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5cXFwiICBgbm9faW5wdXRgIC0gXFxcIlRoZSB1c2VyXFwncyBwcm9maWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHVzZXIgaW5wdXRzIHRvIGRldGVybWluZSBhIG1hdGNoLlxcXCIgIGBub19kYXRhYCAtIFxcXCJGaWVsZCBjb3VsZCBub3QgYmUgdmVyaWZpZWQgYWdhaW5zdCBhdmFpbGFibGUgc291cmNlcy5cXFwiXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbE5hbWUge1xuICAgIE5vSW5wdXQgPSAnbm9faW5wdXQnLFxuICAgIEluZGV0ZXJtaW5hdGUgPSAnaW5kZXRlcm1pbmF0ZScsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyB0b3AgbGV2ZWwgZG9tYWluLCB3aGljaCBpcyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBkb21haW4sIGlzIGZyYXVkdWxlbnQgb3Igcmlza3kgaWYga25vd24uIEluIG1vc3QgY2FzZXMsIGEgc3VzcGljaW91cyB0b3AgbGV2ZWwgZG9tYWluIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoIGEgZGlzcG9zYWJsZSBvciBoaWdoLXJpc2sgZG9tYWluLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgdGhlIGBmYWNpYWxfZHVwbGljYXRlc2AgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tGYWNpYWxEdXBsaWNhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tGYWNpYWxEdXBsaWNhdGUge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0ZhY2lhbER1cGxpY2F0ZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2ltaWxhcml0eSBzY29yZSBvZiB0aGUgbWF0Y2guIFJhbmdlcyBmcm9tIDAgdG8gMTAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0ZhY2lhbER1cGxpY2F0ZVxuICAgICAqL1xuICAgIHNpbWlsYXJpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgbWF0Y2ggb2NjdXJyZWQgYWZ0ZXIgdGhlIHNlc3Npb24gd2FzIGNvbXBsZXRlLiBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBiZSBgdHJ1ZWAgaWYgYSBsYXRlciBzZXNzaW9uIGVuZGVkIHVwIG1hdGNoaW5nIHRoaXMgb25lLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tGYWNpYWxEdXBsaWNhdGVcbiAgICAgKi9cbiAgICBtYXRjaGVkX2FmdGVyX2NvbXBsZXRlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IGNhcHR1cmluZyBhYnVzZSBzaWduYWxzIHJlbGF0ZWQgdG8gYGlkZW50aXR5IGFidXNlYCwgZS5nLiBzdG9sZW4gYW5kIHN5bnRoZXRpYyBpZGVudGl0eSBmcmF1ZC4gVGhlc2UgYXR0cmlidXRlcyBhcmUgb25seSBhdmFpbGFibGUgZm9yIFVTIGlkZW50aXRpZXMgYW5kIHNvbWUgc2lnbmFscyBtYXkgbm90IGJlIGF2YWlsYWJsZSBkZXBlbmRpbmcgb24gd2hhdCBpbmZvcm1hdGlvbiB3YXMgY29sbGVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrU3ludGhldGljSWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzXG4gICAgICovXG4gICAgc3ludGhldGljX2lkZW50aXR5OiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N0b2xlbklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN0b2xlbl9pZGVudGl0eTogUmlza0NoZWNrU3RvbGVuSWRlbnRpdHkgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgYSBsaW5rZWQgc2VydmljZS4gTm90ZSB0aGF0IGBhZHVsdF9zaXRlc2AgcmVmZXJzIHRvIGV4cGxpY2l0IHZpZGVvIGNvbnRlbnQsIGFuZCBpbmNsdWRlcyBhIG51bWJlciBvZiByZWxhdGVkIHNlcnZpY2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrTGlua2VkU2VydmljZSB7XG4gICAgQWJvdXRtZSA9ICdhYm91dG1lJyxcbiAgICBBZG9iZSA9ICdhZG9iZScsXG4gICAgQWR1bHRTaXRlcyA9ICdhZHVsdF9zaXRlcycsXG4gICAgQWlyYm5iID0gJ2FpcmJuYicsXG4gICAgQWx0YmFsYWppID0gJ2FsdGJhbGFqaScsXG4gICAgQW1hem9uID0gJ2FtYXpvbicsXG4gICAgQXBwbGUgPSAnYXBwbGUnLFxuICAgIEFyY2hpdmVvcmcgPSAnYXJjaGl2ZW9yZycsXG4gICAgQXRsYXNzaWFuID0gJ2F0bGFzc2lhbicsXG4gICAgQml0bW9qaSA9ICdiaXRtb2ppJyxcbiAgICBCb2R5YnVpbGRpbmcgPSAnYm9keWJ1aWxkaW5nJyxcbiAgICBCb29raW5nID0gJ2Jvb2tpbmcnLFxuICAgIEJ1a2FsYXBhayA9ICdidWthbGFwYWsnLFxuICAgIENvZGVjYWRlbXkgPSAnY29kZWNhZGVteScsXG4gICAgRGVsaXZlcm9vID0gJ2RlbGl2ZXJvbycsXG4gICAgRGlpZ28gPSAnZGlpZ28nLFxuICAgIERpc2NvcmQgPSAnZGlzY29yZCcsXG4gICAgRGlzbmV5cGx1cyA9ICdkaXNuZXlwbHVzJyxcbiAgICBEdW9saW5nbyA9ICdkdW9saW5nbycsXG4gICAgRWJheSA9ICdlYmF5JyxcbiAgICBFbnZhdG8gPSAnZW52YXRvJyxcbiAgICBFdmVudGJyaXRlID0gJ2V2ZW50YnJpdGUnLFxuICAgIEV2ZXJub3RlID0gJ2V2ZXJub3RlJyxcbiAgICBGYWNlYm9vayA9ICdmYWNlYm9vaycsXG4gICAgRmlyZWZveCA9ICdmaXJlZm94JyxcbiAgICBGbGlja3IgPSAnZmxpY2tyJyxcbiAgICBGbGlwa2FydCA9ICdmbGlwa2FydCcsXG4gICAgRm91cnNxdWFyZSA9ICdmb3Vyc3F1YXJlJyxcbiAgICBGcmVlbGFuY2VyID0gJ2ZyZWVsYW5jZXInLFxuICAgIEdhYW5hID0gJ2dhYW5hJyxcbiAgICBHaXBoeSA9ICdnaXBoeScsXG4gICAgR2l0aHViID0gJ2dpdGh1YicsXG4gICAgR29vZ2xlID0gJ2dvb2dsZScsXG4gICAgR3JhdmF0YXIgPSAnZ3JhdmF0YXInLFxuICAgIEh1YnNwb3QgPSAnaHVic3BvdCcsXG4gICAgSW1ndXIgPSAnaW1ndXInLFxuICAgIEluc3RhZ3JhbSA9ICdpbnN0YWdyYW0nLFxuICAgIEpkaWQgPSAnamRpZCcsXG4gICAgS2FrYW8gPSAna2FrYW8nLFxuICAgIEtvbW1vID0gJ2tvbW1vJyxcbiAgICBLb21vb3QgPSAna29tb290JyxcbiAgICBMYXN0Zm0gPSAnbGFzdGZtJyxcbiAgICBMYXphZGEgPSAnbGF6YWRhJyxcbiAgICBMaW5lID0gJ2xpbmUnLFxuICAgIExpbmtlZGluID0gJ2xpbmtlZGluJyxcbiAgICBNYWlscnUgPSAnbWFpbHJ1JyxcbiAgICBNaWNyb3NvZnQgPSAnbWljcm9zb2Z0JyxcbiAgICBNeXNwYWNlID0gJ215c3BhY2UnLFxuICAgIE5ldGZsaXggPSAnbmV0ZmxpeCcsXG4gICAgTmlrZSA9ICduaWtlJyxcbiAgICBPayA9ICdvaycsXG4gICAgUGF0cmVvbiA9ICdwYXRyZW9uJyxcbiAgICBQaW50ZXJlc3QgPSAncGludGVyZXN0JyxcbiAgICBQbHVyayA9ICdwbHVyaycsXG4gICAgUXVvcmEgPSAncXVvcmEnLFxuICAgIFF6b25lID0gJ3F6b25lJyxcbiAgICBSYW1ibGVyID0gJ3JhbWJsZXInLFxuICAgIFJhcHBpID0gJ3JhcHBpJyxcbiAgICBSZXBsaXQgPSAncmVwbGl0JyxcbiAgICBTYW1zdW5nID0gJ3NhbXN1bmcnLFxuICAgIFNlb2NsZXJrcyA9ICdzZW9jbGVya3MnLFxuICAgIFNob3BjbHVlcyA9ICdzaG9wY2x1ZXMnLFxuICAgIFNreXBlID0gJ3NreXBlJyxcbiAgICBTbmFwY2hhdCA9ICdzbmFwY2hhdCcsXG4gICAgU25hcGRlYWwgPSAnc25hcGRlYWwnLFxuICAgIFNvdW5kY2xvdWQgPSAnc291bmRjbG91ZCcsXG4gICAgU3BvdGlmeSA9ICdzcG90aWZ5JyxcbiAgICBTdGFyeiA9ICdzdGFyeicsXG4gICAgU3RyYXZhID0gJ3N0cmF2YScsXG4gICAgVGFyaW5nYSA9ICd0YXJpbmdhJyxcbiAgICBUZWxlZ3JhbSA9ICd0ZWxlZ3JhbScsXG4gICAgVGlraSA9ICd0aWtpJyxcbiAgICBUb2tvcGVkaWEgPSAndG9rb3BlZGlhJyxcbiAgICBUcmVlaG91c2UgPSAndHJlZWhvdXNlJyxcbiAgICBUdW1ibHIgPSAndHVtYmxyJyxcbiAgICBUd2l0dGVyID0gJ3R3aXR0ZXInLFxuICAgIFZlbm1vID0gJ3Zlbm1vJyxcbiAgICBWaWJlciA9ICd2aWJlcicsXG4gICAgVmltZW8gPSAndmltZW8nLFxuICAgIFZpdmlubyA9ICd2aXZpbm8nLFxuICAgIFZrb250YWt0ZSA9ICd2a29udGFrdGUnLFxuICAgIFdhdHRwYWQgPSAnd2F0dHBhZCcsXG4gICAgV2VpYm8gPSAnd2VpYm8nLFxuICAgIFdoYXRzYXBwID0gJ3doYXRzYXBwJyxcbiAgICBXb3JkcHJlc3MgPSAnd29yZHByZXNzJyxcbiAgICBYaW5nID0gJ3hpbmcnLFxuICAgIFlhaG9vID0gJ3lhaG9vJyxcbiAgICBZYW5kZXggPSAneWFuZGV4JyxcbiAgICBaYWxvID0gJ3phbG8nLFxuICAgIFpvaG8gPSAnem9obydcbn1cblxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIG5ldHdvcmsgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tOZXR3b3JrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrTmV0d29yayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrTmV0d29ya1xuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw6IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tOZXR3b3JrXG4gICAgICovXG4gICAgZmFjdG9yczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgcGhvbmVgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tQaG9uZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG9ubGluZSBzZXJ2aWNlcyB3aGVyZSB0aGlzIHBob25lIG51bWJlciBoYXMgYmVlbiBkZXRlY3RlZCB0byBoYXZlIGFjY291bnRzIG9yIG90aGVyIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgbGlua2VkX3NlcnZpY2VzOiBTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrUGhvbmVcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZmFjdG9ycywgd2hlbiBhdmFpbGFibGUsIHRoYXQgY29udHJpYnV0ZSB0b3dhcmRzIHRoZSByaXNrIGxldmVsIG9mIHRoZSBnaXZlbiByaXNrIGNoZWNrIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgZmFjdG9ycz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiB0aGUgc3RvbGVuIGlkZW50aXR5IHJpc2sgY2hlY2suICBDb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczogIGBzY29yZWAgLSBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3RvbGVuIGlkZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3RvbGVuIGlkZW50aXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1N0b2xlbklkZW50aXR5XG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBSaXNrTGV2ZWw7XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiB0aGUgc3ludGhldGljIGlkZW50aXR5IHJpc2sgY2hlY2suICBDb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczogIGBzY29yZWAgLSBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3ludGhldGljIGlkZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3ludGhldGljIGlkZW50aXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5XG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N5bnRoZXRpY0ZyYXVkfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIGZpcnN0X3BhcnR5X3N5bnRoZXRpY19mcmF1ZD86IFN5bnRoZXRpY0ZyYXVkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3ludGhldGljRnJhdWR9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc3ludGhldGljX2ZyYXVkPzogU3ludGhldGljRnJhdWQgfCBudWxsO1xufVxuLyoqXG4gKiBSaXNrIGluZGljYXRvcnMgZm9jdXMgb24gcHJvdmlkaW5nIHNpZ25hbCBvbiB0aGUgcG9zc2liaWxpdHkgb2YgYSBib3Jyb3dlciBkZWZhdWx0aW5nIG9uIHRoZWlyIGxvYW4gcmVwYXltZW50cyBieSBwcm92aWRpbmcgZGF0YSBwb2ludHMgcmVsYXRlZCB0byBpdHMgcGF5bWVudCBiZWhhdmlvciwgZGVidCwgYW5kIG90aGVyIHJlbGV2YW50IGZpbmFuY2lhbCBpbmZvcm1hdGlvbiwgaGVscGluZyBsZW5kZXJzIGdhdWdlIHRoZSBsZXZlbCBvZiByaXNrIGludm9sdmVkIGluIGEgY2VydGFpbiBvcGVyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tJbmRpY2F0b3JzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0luZGljYXRvcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rUGVuYWx0aWVzSW5kaWNhdG9yc31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBiYW5rX3BlbmFsdGllcz86IEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7R2FtYmxpbmdJbmRpY2F0b3JzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGdhbWJsaW5nPzogR2FtYmxpbmdJbmRpY2F0b3JzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkRpc2J1cnNlbWVudHNJbmRpY2F0b3JzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGxvYW5fZGlzYnVyc2VtZW50cz86IExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9ycyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5QYXltZW50c0luZGljYXRvcnN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tJbmRpY2F0b3JzXG4gICAgICovXG4gICAgbG9hbl9wYXltZW50cz86IExvYW5QYXltZW50c0luZGljYXRvcnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZWdhdGl2ZUJhbGFuY2VJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBuZWdhdGl2ZV9iYWxhbmNlPzogTmVnYXRpdmVCYWxhbmNlSW5zaWdodHMgfCBudWxsO1xufVxuLyoqXG4gKiBSaXNrIGxldmVsIGZvciB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0xldmVsIHtcbiAgICBMb3cgPSAnbG93JyxcbiAgICBNZWRpdW0gPSAnbWVkaXVtJyxcbiAgICBIaWdoID0gJ2hpZ2gnXG59XG5cbi8qKlxuICogUmlzayBsZXZlbCBmb3IgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZSwgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrTGV2ZWxXaXRoTm9EYXRhIHtcbiAgICBMb3cgPSAnbG93JyxcbiAgICBNZWRpdW0gPSAnbWVkaXVtJyxcbiAgICBIaWdoID0gJ2hpZ2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFJpc2tQcm9maWxlIGlzIGRlcHJlY2F0ZWQsIHVzZSBgcnVsZXNldGAgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1Byb2ZpbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrUHJvZmlsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgcmlzayBwcm9maWxlIHVzZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1Byb2ZpbGVcbiAgICAgKi9cbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGVnYWN5IG1ldGhvZCBvZiBpbnNwZWN0aW5nIHRoZSByZXN1bHQgb2YgdGhlIHJ1bGVzZXQuIE5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHNpbXBseSB1c2UgdGhlIFxcXCJyZXN1bHRcXFwiIHByb3BlcnR5IGluc3RlYWQuIFRoaXMgdmFsdWUgd2lsbCBiZSBvbWl0dGVkIGlmIHlvdSBkbyBub3QgaGF2ZSBhIGxpdmUgZXhpc3RpbmcgaW50ZWdyYXRpb24gd2l0aCBydWxlcyB1c2luZyB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgYSBjb2RlIGFuZCBkZXNjcmlwdGlvbiB0byBkZXNjcmliZSBtZWRpdW0gcmlzayB0cmFuc2FjdGlvbnMgYW5kIGFib3ZlIG9uIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrUmVhc29uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza1JlYXNvbiB7XG4gICAgLyoqXG4gICAgICogQSBjb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiByaXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uICBUaGUgY29kZXMgYXJlIGZyb20gUEwwMSB0byBQTDA4IGFuZCBmcm9tIEJLMDEgdG8gQkswNy4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIHJpc2sgcmVhc29uIGNvZGVzLCBzZWUgW1Jpc2sgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYmFsYW5jZS9iYWxhbmNlLXBsdXMvI3Jpc2stY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tSZWFzb25cbiAgICAgKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBleHBsYWluaW5nIHRoZSByaXNrIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbiBhbmQgc29tZSByZWNvbW1lbmRlZCBhY3Rpb25zLiBUaGlzIGZpZWxkIGlzIHN1YmplY3QgdG8gY2hhbmdlOyBhbnkgcHJvZ3JhbW1hdGljIGxvZ2ljIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgYGNvZGVgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1JlYXNvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGZvciB0aGUgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza1NpZ25hbERvY3VtZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU/OiBSaXNrU2lnbmFsRG9jdW1lbnRUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza1NpZ25hbEZpbGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBmaWxlX3R5cGU/OiBSaXNrU2lnbmFsRmlsZVR5cGUgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgYSBkb2N1bWVudCBmb3IgcmlzayBzaWduYWwgYW5hbHlzaXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tTaWduYWxEb2N1bWVudFN0YXR1cyB7XG4gICAgUHJvY2Vzc2luZyA9ICdQUk9DRVNTSU5HJyxcbiAgICBQcm9jZXNzaW5nQ29tcGxldGUgPSAnUFJPQ0VTU0lOR19DT01QTEVURScsXG4gICAgUHJvY2Vzc2luZ0Vycm9yID0gJ1BST0NFU1NJTkdfRVJST1InLFxuICAgIFBhc3N3b3JkUHJvdGVjdGVkID0gJ1BBU1NXT1JEX1BST1RFQ1RFRCcsXG4gICAgVmlydXNEZXRlY3RlZCA9ICdWSVJVU19ERVRFQ1RFRCdcbn1cblxuLyoqXG4gKiBUeXBlIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEJhbmtTdGF0ZW1lbnQgPSAnQkFOS19TVEFURU1FTlQnLFxuICAgIEJlbmVmaXRzU3RhdGVtZW50ID0gJ0JFTkVGSVRTX1NUQVRFTUVOVCcsXG4gICAgQnVzaW5lc3NGaWxpbmcgPSAnQlVTSU5FU1NfRklMSU5HJyxcbiAgICBDaGVjayA9ICdDSEVDSycsXG4gICAgRHJpdmluZ0xpY2Vuc2UgPSAnRFJJVklOR19MSUNFTlNFJyxcbiAgICBGaW5hbmNpYWxTdGF0ZW1lbnQgPSAnRklOQU5DSUFMX1NUQVRFTUVOVCcsXG4gICAgSW52b2ljZSA9ICdJTlZPSUNFJyxcbiAgICBQYXlzbGlwID0gJ1BBWVNMSVAnLFxuICAgIFNvY2lhbFNlY3VyaXR5Q2FyZCA9ICdTT0NJQUxfU0VDVVJJVFlfQ0FSRCcsXG4gICAgVGF4Rm9ybSA9ICdUQVhfRk9STScsXG4gICAgVXRpbGl0eUJpbGwgPSAnVVRJTElUWV9CSUxMJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIHR5cGUgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRmlsZVR5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgSW1hZ2VQZGYgPSAnSU1BR0VfUERGJyxcbiAgICBTY2FuT2NyID0gJ1NDQU5fT0NSJyxcbiAgICBUcnVlUGRmID0gJ1RSVUVfUERGJyxcbiAgICBJbWFnZSA9ICdJTUFHRScsXG4gICAgTWl4ZWRQYWdlUGRmID0gJ01JWEVEX1BBR0VfUERGJyxcbiAgICBFbXB0eVBkZiA9ICdFTVBUWV9QREYnLFxuICAgIEZsYXR0ZW5lZFBkZiA9ICdGTEFUVEVORURfUERGJ1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlXG4gICAgICovXG4gICAgUk9MRV9ERVRBSUw6IFJvbGVEZXRhaWw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZURldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVEZXRhaWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0eVJvbGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlRGV0YWlsXG4gICAgICovXG4gICAgUGFydHlSb2xlVHlwZTogUGFydHlSb2xlVHlwZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZX1cbiAgICAgKiBAbWVtYmVyb2YgUm9sZXNcbiAgICAgKi9cbiAgICBST0xFOiBSb2xlO1xufVxuLyoqXG4gKiBSdWxlcyBhcmUgcnVuIGluIG51bWVyaWNhbCBvcmRlci4gVGhlIGZpcnN0IHJ1bGUgd2l0aCBhIGxvZ2ljIG1hdGNoIGlzIHRyaWdnZXJlZC4gVGhlc2UgYXJlIHRoZSBkZXRhaWxzIG9mIHRoYXQgcnVsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUnVsZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdWxlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgbWVzc2FnZSBhdHRhY2hlZCB0byB0aGUgdHJpZ2dlcmVkIHJ1bGUsIGRlZmluZWQgd2l0aGluIHRoZSBEYXNoYm9hcmQsIGZvciB5b3VyIGludGVybmFsIHVzZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcsIHN1Y2ggYXMgXFxcIkFjY291bnQgYXBwZWFycyB0byBiZSBjbG9zZWQuXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJ1bGVEZXRhaWxzXG4gICAgICovXG4gICAgaW50ZXJuYWxfbm90ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBrZXksIGRlZmluZWQgd2l0aGluIHRoZSBEYXNoYm9hcmQsIHVzZWQgdG8gdHJpZ2dlciBwcm9ncmFtbWF0aWMgYmVoYXZpb3IgZm9yIGEgY2VydGFpbiByZXN1bHQuIEZvciBpbnN0YW5jZSwgeW91IGNvdWxkIG9wdGlvbmFsbHkgY2hvb3NlIHRvIGRlZmluZSBhIFxcXCIzLWRheS1ob2xkXFxcIiBgY3VzdG9tX2FjdGlvbl9rZXlgIGZvciBhbiBBQ0NFUFQgcmVzdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJ1bGVEZXRhaWxzXG4gICAgICovXG4gICAgY3VzdG9tX2FjdGlvbl9rZXk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIHJ1bGUgdGhhdCB3YXMgdHJpZ2dlcmVkIGZvciB0aGlzIHRyYW5zYWN0aW9uLiAgYEFDQ0VQVGA6IEFjY2VwdCB0aGUgdHJhbnNhY3Rpb24gZm9yIHByb2Nlc3NpbmcuIGBSRVJPVVRFYDogUmVyb3V0ZSB0aGUgdHJhbnNhY3Rpb24gdG8gYSBkaWZmZXJlbnQgcGF5bWVudCBtZXRob2QsIGFzIHRoaXMgdHJhbnNhY3Rpb24gaXMgdG9vIHJpc2t5LiBgUkVWSUVXYDogUmV2aWV3IHRoZSB0cmFuc2FjdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJ1bGVSZXN1bHQge1xuICAgIEFjY2VwdCA9ICdBQ0NFUFQnLFxuICAgIFJlcm91dGUgPSAnUkVST1VURScsXG4gICAgUmV2aWV3ID0gJ1JFVklFVydcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSB0cmFuc2FjdGlvbiByZXN1bHQgYWZ0ZXIgZXZhbHVhdGlvbiBieSB0aGUgcmVxdWVzdGVkIFJ1bGVzZXQuIElmIGEgYHJ1bGVzZXRfa2V5YCBpcyBub3QgcHJvdmlkZWQsIGZvciBjdXN0b21lcnMgd2hvIGJlZ2FuIHVzaW5nIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgYmVmb3JlIE9jdG9iZXIgMTUsIDIwMjUsIGJ5IGRlZmF1bHQsIHRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkLiBUbyBsZWFybiBtb3JlLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJ1bGVzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdWxlc2V0IHtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIHRoZSBSdWxlc2V0IHVzZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUnVsZXNldFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSdWxlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBSdWxlc2V0XG4gICAgICovXG4gICAgcmVzdWx0OiBSdWxlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUnVsZXNldFxuICAgICAqL1xuICAgIHRyaWdnZXJlZF9ydWxlX2RldGFpbHM/OiBSdWxlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV2YWx1YXRlZCBvdXRjb21lIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQsIHVzZSBgcmVzdWx0YCBvciBgdHJpZ2dlcmVkX3J1bGVfZGV0YWlscy5jdXN0b21fYWN0aW9uX2tleWAgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSdWxlc2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvdXRjb21lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTTVNWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTTVNWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTTVNWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogU01TVmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdHRlbXB0IGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgU01TIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlbGl2ZXJ5IGF0dGVtcHRzIG1hZGUgd2l0aGluIHRoZSB2ZXJpZmljYXRpb24gdG8gc2VuZCB0aGUgU01TIGNvZGUgdG8gdGhlIHVzZXIuIEVhY2ggZGVsaXZlcnkgYXR0ZW1wdCByZXByZXNlbnRzIHRoZSB1c2VyIHRha2luZyBhY3Rpb24gZnJvbSB0aGUgZnJvbnQgZW5kIFVJIHRvIHJlcXVlc3QgY3JlYXRpb24gYW5kIGRlbGl2ZXJ5IG9mIGEgbmV3IFNNUyB2ZXJpZmljYXRpb24gY29kZSwgb3IgdG8gcmVzZW5kIGFuIGV4aXN0aW5nIFNNUyB2ZXJpZmljYXRpb24gY29kZS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIGRlbGl2ZXJ5IGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZGVsaXZlcnlfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgbWFkZSBieSB0aGUgdXNlciB3aXRoaW4gdGhlIHZlcmlmaWNhdGlvbiB0byB2ZXJpZnkgdGhlIFNNUyBjb2RlIGJ5IGVudGVyaW5nIGl0IGludG8gdGhlIGZyb250IGVuZCBVSS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIHNvbHZlIGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc29sdmVfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpbml0aWFsbHlfc2VudF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9zZW50X2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU01TVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnXG59XG5cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuIElmIHByb3ZpZGVkLCB0aGlzIHdpbGwgb3ZlcnJpZGUgdGhlIFVSTCBzZXQgaW4gdGhlIGRhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfb3ZlcnJpZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19maWVsZHM6IFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcztcbn1cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBjb2RlcyB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHRlc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGUge1xuICAgIFVwZGF0ZSA9ICdCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURScsXG4gICAgQ29tcGxldGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9DT01QTEVURSdcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBmaWVsZHMgd2hpY2ggd2lsbCBiZSBwb3B1bGF0ZWQgaW4gdGhlIHNpbXVsYXRlZCB3ZWJob29rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgdG8gYmUgcmV0dXJuZWQgaW4gSU5DT01FIHdlYmhvb2tzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZWZyZXNoX2NvbXBsZXRlX3Jlc3VsdD86IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB0byB3aGljaCB0aGUgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYGZhaWxlZGAsIG9yIGByZXZlcnNlZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBwZW5kaW5nYCAtLT4gYGZhaWxlZGAgIGBwZW5kaW5nYCAtLT4gYHBvc3RlZGAgIGBwb3N0ZWRgIC0tPiBgcmV2ZXJzZWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXZWJob29rIGNvZGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENhc2ggRmxvdyBVcGRhdGVzIGV2ZW50cyB0byBiZSBzaW11bGF0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PENhc2hGbG93VXBkYXRlc0V2ZW50V2ViaG9va0NvZGVzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGVzPzogQXJyYXk8Q2FzaEZsb3dVcGRhdGVzRXZlbnRXZWJob29rQ29kZXM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBzYW5kYm94L2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGU7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdGYWlsZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRCcsXG4gICAgUGVuZGluZ0FwcHJvdmFsID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZSB7XG4gICAgVmVyaWZpY2F0aW9uID0gJ0lOQ09NRV9WRVJJRklDQVRJT04nLFxuICAgIFZlcmlmaWNhdGlvblJpc2tTaWduYWxzID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vYXBwbGljYXRpb24vc2VlZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgLCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2FwcGxpY2F0aW9uL3NlZWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBuZXdseSBzZWVkZWQgaXRlbSByZXByZXNlbnRpbmcgdGhlIGFwcGxpY2F0aW9uIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IFdlYmhvb2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW0ge1xuICAgIERlZmF1bHRVcGRhdGUgPSAnREVGQVVMVF9VUERBVEUnLFxuICAgIE5ld0FjY291bnRzQXZhaWxhYmxlID0gJ05FV19BQ0NPVU5UU19BVkFJTEFCTEUnLFxuICAgIFNtc01pY3JvZGVwb3NpdHNWZXJpZmljYXRpb24gPSAnU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OJyxcbiAgICBBdXRob3JpemF0aW9uR3JhbnRlZCA9ICdBVVRIT1JJWkFUSU9OX0dSQU5URUQnLFxuICAgIFVzZXJQZXJtaXNzaW9uUmV2b2tlZCA9ICdVU0VSX1BFUk1JU1NJT05fUkVWT0tFRCcsXG4gICAgVXNlckFjY291bnRSZXZva2VkID0gJ1VTRVJfQUNDT1VOVF9SRVZPS0VEJyxcbiAgICBQZW5kaW5nRGlzY29ubmVjdCA9ICdQRU5ESU5HX0RJU0NPTk5FQ1QnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZSA9ICdSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURScsXG4gICAgTG9naW5SZXBhaXJlZCA9ICdMT0dJTl9SRVBBSVJFRCcsXG4gICAgU3luY1VwZGF0ZXNBdmFpbGFibGUgPSAnU1lOQ19VUERBVEVTX0FWQUlMQUJMRScsXG4gICAgUHJvZHVjdFJlYWR5ID0gJ1BST0RVQ1RfUkVBRFknLFxuICAgIEVycm9yID0gJ0VSUk9SJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBpcyBgdHJ1ZWAgaWYgdGhlIHRlc3QgYHdlYmhvb2tfY29kZWAgd2FzIHN1Y2Nlc3NmdWxseSBmaXJlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgd2ViaG9va19maXJlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgd2hvc2UgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB0byBiZSBtb2RpZmllZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyB0byBzZXQgdGhlIGFjY291bnQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGBzYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAgICAgKi9cbiAgICBvYXV0aF9zdGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlc2V0X2xvZ2luOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50IHRvIHNpbXVsYXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgdXJsIHRvIHVzZSBmb3IgYW55IHBheW1lbnQgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGUgc2ltdWxhdGVkIHN0YXR1cyBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyB0byBzZXQgdGhlIHBheW1lbnQgdG8uICBWYWxpZCBzdGF0dXNlcyBpbmNsdWRlOiAtIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgIC0gYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2AgLSBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGAgLSBgUEFZTUVOVF9TVEFUVVNfU0VUVExFRGAgLSBgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXdfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIHNldCBvZiBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjb25maWd1cmluZyB0aGUgSXRlbS4gSWYgc3BlY2lmaWVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcHJvY2Vzc29yIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgYC9wcm9jZXNzb3IvYCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgIHN1cHBvcnRzLiBUaGlzIGFycmF5IG1heSBub3QgYmUgZW1wdHkuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYWxfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIEJhbmsgSW5jb21lLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYGluaXRpYWxfcHJvZHVjdHNgIGFycmF5IGFuZCBgYmFua2AgaXMgc3BlY2lmaWVkIGluIGBpbmNvbWVfc291cmNlX3R5cGVzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgSW5jb21lIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2Ygb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY29uZmlndXJpbmcgdGhlIEl0ZW0uIElmIHNwZWNpZmllZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgd2ViaG9vayB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmV3IEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb247XG59XG4vKipcbiAqIEEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gb3B0aW9ucy4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHdpbGwgYmUgcGVybWl0dGVkIHRvIHNoYXJlLiBPcHRpb25zIGluY2x1ZGUgYGJhbmtgIGFuZCBgcGF5cm9sbGAuIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHN0YXRlbWVudHMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggc3RhdGVtZW50cyBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCBzdGF0ZW1lbnRzIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9ucyBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2FjdGlvbnMvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRyYW5zYWN0aW9ucyB0byBiZSBhZGRlZFxuICAgICAqIEB0eXBlIHtBcnJheTxDdXN0b21TYW5kYm94VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q3VzdG9tU2FuZGJveFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zYWN0aW9ucy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZS4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyIChpLmUuIHRoZSBvcmlnaW5hdG9yKS4gT25seSBhcHBsaWNhYmxlIHRvIFRyYW5zZmVyIGZvciBQbGF0Zm9ybXMgY3VzdG9tZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIG9ubHkgdGhlIHBlbmRpbmcgYmFsYW5jZSB0aGF0IGlzIGR1ZSBiZWZvcmUgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSB0ZXN0IGNsb2NrIHdpbGwgYmUgY29udmVydGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIElmIHByb3ZpZGVkLCB0aGUgZXZlbnQgdG8gYmUgc2ltdWxhdGVkIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCBgdGVzdF9jbG9ja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHJlZnVuZC5wb3N0ZWRgLCBgcmVmdW5kLnNldHRsZWRgLCBgcmVmdW5kLmZhaWxlZGAsIG9yIGByZWZ1bmQucmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCByZWZ1bmQgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHJlZnVuZC5wZW5kaW5nYCAtLT4gYHJlZnVuZC5mYWlsZWRgICBgcmVmdW5kLnBlbmRpbmdgIC0tPiBgcmVmdW5kLnBvc3RlZGAgIGByZWZ1bmQucG9zdGVkYCAtLT4gYHJlZnVuZC5yZXR1cm5lZGAgIGByZWZ1bmQucG9zdGVkYCAtLT4gYHJlZnVuZC5zZXR0bGVkYCAgYHJlZnVuZC5wb3N0ZWRgIGV2ZW50cyBjYW4gb25seSBiZSBzaW11bGF0ZWQgaWYgdGhlIHJlZnVuZGVkIHRyYW5zZmVyIGhhcyBiZWVuIHRyYW5zaXRpb25lZCB0byBzZXR0bGVkLiBUaGlzIG1pbWljcyB0aGUgb3JkZXJpbmcgb2YgZXZlbnRzIGluIFByb2R1Y3Rpb24uIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgVVJMIHRvIHdoaWNoIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYWN0aW9uIHRvIHNpbXVsYXRlLiBNdXN0IGJlIGVpdGhlciBgYXBwcm92ZWAgb3IgYHJlamVjdGAuICAtIGBhcHByb3ZlYDogU2ltdWxhdGVzIGJhbmsgYXBwcm92YWwsIHRyYW5zaXRpb25pbmcgdGhlIHRyYW5zZmVyIHRvIGBzZXR0bGVkYCBzdGF0dXMgLSBgcmVqZWN0YDogU2ltdWxhdGVzIGJhbmsgcmVqZWN0aW9uLCB0cmFuc2l0aW9uaW5nIHRoZSB0cmFuc2ZlciB0byBgZmFpbGVkYCBzdGF0dXMgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZUFjdGlvbiB7XG4gICAgQXBwcm92ZSA9ICdhcHByb3ZlJyxcbiAgICBSZWplY3QgPSAncmVqZWN0J1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmZwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZUFjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWN0aW9uOiBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZUFjdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgYW1vdW50IHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMsIG11c3QgbWF0Y2ggdGhlIGFtb3VudCBvbiB0aGUgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IG5hbWUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciBmb3IgdmFsaWRhdGlvbiBwdXJwb3NlcywgbXVzdCBtYXRjaCB0aGUgc2VuZGVyIGNsaWVudCBuYW1lIG9uIHRoZSB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGB0cmFuc2Zlcl9pZGAuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJmcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JmcC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJmcFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIElmIHByb3ZpZGVkLCB0aGUgZXZlbnQgdG8gYmUgc2ltdWxhdGVkIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCBgdGVzdF9jbG9ja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBzZXR0bGVkYCwgYGZhaWxlZGAsIGBmdW5kc19hdmFpbGFibGVgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldHVybmVkYCAgYHBvc3RlZGAgLS0+IGBzZXR0bGVkYCAgYHNldHRsZWRgIC0tPiBgZnVuZHNfYXZhaWxhYmxlYCAob25seSBhcHBsaWNhYmxlIHRvIEFDSCBkZWJpdHMuKSBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIHN3ZWVwIHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIG9uIHRoZSBkYXkgb2YgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBgdGVzdF9jbG9ja2AuIElmIHRoZSBkYXRlIG9mIGB2aXJ0dWFsX3RpbWVgIGlzIG9uIHdlZWtlbmQgb3IgYSBmZWRlcmFsIGhvbGlkYXksIHRoZSBuZXh0IGF2YWlsYWJsZSBiYW5raW5nIGRheSBpcyB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgVVJMIHRvIHdoaWNoIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2ltdWxhdGVkVHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA/OiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYW5kIG9ubHkgaWYgYSBgdGVzdF9jbG9ja19pZGAgd2FzIGluY2x1ZGVkIGluIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHJlcXVlc3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2ltdWxhdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3NhbmRib3gvI3NpbXVsYXRpbmctcmVjdXJyaW5nLXRyYW5zZmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ld192aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHRpbWVzdGFtcCB3aWxsIGJlIHVzZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVGVzdENsb2NrfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2s6IFRyYW5zZmVyVGVzdENsb2NrO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYW5kIG9ubHkgaWYgYSBgdGVzdF9jbG9ja19pZGAgd2FzIGluY2x1ZGVkIGluIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHJlcXVlc3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2ltdWxhdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3NhbmRib3gvI3NpbXVsYXRpbmctcmVjdXJyaW5nLXRyYW5zZmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclRlc3RDbG9ja31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrOiBUcmFuc2ZlclRlc3RDbG9jaztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgdmlydHVhbCB0aW1lc3RhbXAgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3ZpcnR1YWxfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3ZpcnR1YWxfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRlc3QgY2xvY2tzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyVGVzdENsb2NrPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVzdF9jbG9ja3M6IEFycmF5PFRyYW5zZmVyVGVzdENsb2NrPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGJlIHJlc2V0LiAgSWYgZW1wdHkgb3IgYG51bGxgLCB0aGlzIGZpZWxkIHdpbGwgZGVmYXVsdCB0byByZXNldHRpbmcgYWxsIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjb3BlcyBvYmplY3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NvcGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxBY2NvdW50QWNjZXNzPjtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gbmV3bHkgb3BlbmVkIGFjY291bnRzIGFzIHRoZXkgYXJlIG9wZW5lZC4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuIGluZGljYXRvciBmb3Igd2hlbiBzY29wZXMgYXJlIGJlaW5nIHVwZGF0ZWQuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIHZpYSBlbnJvbGxtZW50IChpLmUuIE9BdXRoKSwgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBFTlJPTExNRU5UYC4gV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgaW4gYSBwb3N0LWVucm9sbG1lbnQgdmlldywgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBQT1JUQUxgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2NvcGVzQ29udGV4dCB7XG4gICAgRW5yb2xsbWVudCA9ICdFTlJPTExNRU5UJyxcbiAgICBQb3J0YWwgPSAnUE9SVEFMJ1xufVxuXG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0QWNjZXNzfVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIHByb2R1Y3RfYWNjZXNzPzogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFjY2Vzcz59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxBY2NvdW50QWNjZXNzPjtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gbmV3bHkgb3BlbmVkIGFjY291bnRzIGFzIHRoZXkgYXJlIG9wZW5lZC4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBuZXdfYWNjb3VudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQW5hbHlzaXMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB3aHkgYSBzY3JlZW5pbmcgaGl0IG1hdGNoZWQgdGhlIHByb3ZpZGVkIHVzZXIgaW5mb3JtYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JlZW5pbmdIaXRBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZXNfb2ZfYmlydGg/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRvY3VtZW50cz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AgdGhhdCB3ZXJlIGNvbXBhcmVkIHdoZW4gdGhlIHNjcmVlbmluZyBoaXQgd2FzIGFkZGVkLiBTY3JlZW5pbmcgaGl0cyBhcmUgaW1tdXRhYmxlIG9uY2UgdGhleSBoYXZlIGJlZW4gcmV2aWV3ZWQuIElmIGNoYW5nZXMgYXJlIGRldGVjdGVkIGR1ZSB0byB1cGRhdGVzIHRvIHRoZSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgLCB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLCBvciB0aGUgbGlzdFxcJ3Mgc291cmNlIGRhdGEgcHJpb3IgdG8gcmV2aWV3LCB0aGUgc2NyZWVuaW5nIGhpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aG9zZSBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zX3ZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRhIHtcbiAgICAvKipcbiAgICAgKiBEYXRlcyBvZiBiaXJ0aCBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGRhdGVzX29mX2JpcnRoPzogQXJyYXk8U2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtPjtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBMb2NhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IEFycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBOYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PFNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+O1xufVxuLyoqXG4gKiBBbmFseXplZCBkYXRlIG9mIGJpcnRoIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW1cbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGF0ZVJhbmdlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW1cbiAgICAgKi9cbiAgICBkYXRhPzogRGF0ZVJhbmdlO1xufVxuLyoqXG4gKiBBbmFseXplZCBkb2N1bWVudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudDtcbn1cbi8qKlxuICogQW5hbHl6ZWQgbmFtZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gaW5kaXZpZHVhbCBzY3JlZW5pbmcgc3RhdHVzIGhhcyBjaGFuZ2VkLCB3aGljaCBjYW4gb2NjdXIgbWFudWFsbHkgdmlhIHRoZSBkYXNoYm9hcmQgb3IgZHVyaW5nIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFNDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzZWN1cml0eVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWN1cml0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgUGxhaWQtc3BlY2lmaWMgaWRlbnRpZmllciBmb3IgdGhlIHNlY3VyaXR5LCB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0aWVzIHdpdGggaG9sZGluZ3MuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHNlY3VyaXR5X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS4gVGhlIGBzZWN1cml0eV9pZGAgbWF5IGNoYW5nZSBpZiBpbmhlcmVudCBkZXRhaWxzIG9mIHRoZSBzZWN1cml0eSBjaGFuZ2UgZHVlIHRvIGEgY29ycG9yYXRlIGFjdGlvbiwgZm9yIGV4YW1wbGUsIGluIHRoZSBldmVudCBvZiBhIHRpY2tlciBzeW1ib2wgY2hhbmdlIG9yIENVU0lQIGNoYW5nZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogMTItY2hhcmFjdGVyIElTSU4sIGEgZ2xvYmFsbHkgdW5pcXVlIHNlY3VyaXRpZXMgaWRlbnRpZmllci4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc2luOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIDktY2hhcmFjdGVyIENVU0lQLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIE5vcnRoIEFtZXJpY2FuIHNlY3VyaXRpZXMuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2Ugc3RhcnQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIFtoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY3VzaXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzZWRvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGdpdmVuIHRvIHRoZSBzZWN1cml0eSBieSB0aGUgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZGAgaXMgcHJlc2VudCwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIFBsYWlkIGBpbnN0aXR1dGlvbl9pZGAgb2YgdGhlIGluc3RpdHV0aW9uIHRvIHdob20gdGhlIGlkZW50aWZpZXIgYmVsb25ncy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluIGNlcnRhaW4gY2FzZXMsIFBsYWlkIHdpbGwgcHJvdmlkZSB0aGUgSUQgb2YgYW5vdGhlciBzZWN1cml0eSB3aG9zZSBwZXJmb3JtYW5jZSByZXNlbWJsZXMgdGhpcyBzZWN1cml0eSwgdHlwaWNhbGx5IHdoZW4gdGhlIG9yaWdpbmFsIHNlY3VyaXR5IGhhcyBsb3cgdm9sdW1lLCBvciB3aGVuIGEgcHJpdmF0ZSBzZWN1cml0eSBjYW4gYmUgbW9kZWxlZCB3aXRoIGEgcHVibGljbHkgdHJhZGVkIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgcHJveHlfc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgc2VjdXJpdHksIHN1aXRhYmxlIGZvciBkaXNwbGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHlcXCdzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdGllcywgYW5kIG90aGVyd2lzZSBhIHNob3J0IGlkZW50aWZpZXIgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIHNlY3VyaXR5IGlzIGEgaGlnaGx5IGxpcXVpZCBhc3NldCBhbmQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBjYXNoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGlzX2Nhc2hfZXF1aXZhbGVudDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuICBJbiByYXJlIGluc3RhbmNlcywgYSBudWxsIHZhbHVlIGlzIHJldHVybmVkIHdoZW4gaW5zdGl0dXRpb25hbCBkYXRhIGlzIGluc3VmZmljaWVudCB0byBkZXRlcm1pbmUgdGhlIHNlY3VyaXR5IHR5cGUuICBWYWxpZCBzZWN1cml0eSB0eXBlcyBhcmU6ICBgY2FzaGA6IENhc2gsIGN1cnJlbmN5LCBhbmQgbW9uZXkgbWFya2V0IGZ1bmRzICBgY3J5cHRvY3VycmVuY3lgOiBEaWdpdGFsIG9yIHZpcnR1YWwgY3VycmVuY2llcyAgYGRlcml2YXRpdmVgOiBPcHRpb25zLCB3YXJyYW50cywgYW5kIG90aGVyIGRlcml2YXRpdmUgaW5zdHJ1bWVudHMgIGBlcXVpdHlgOiBEb21lc3RpYyBhbmQgZm9yZWlnbiBlcXVpdGllcyAgYGV0ZmA6IE11bHRpLWFzc2V0IGV4Y2hhbmdlLXRyYWRlZCBpbnZlc3RtZW50IGZ1bmRzICBgZml4ZWQgaW5jb21lYDogQm9uZHMgYW5kIGNlcnRpZmljYXRlcyBvZiBkZXBvc2l0IChDRHMpICBgbG9hbmA6IExvYW5zIGFuZCBsb2FuIHJlY2VpdmFibGVzICBgbXV0dWFsIGZ1bmRgOiBPcGVuLSBhbmQgY2xvc2VkLWVuZCB2ZWhpY2xlcyBwb29saW5nIGZ1bmRzIG9mIG11bHRpcGxlIGludmVzdG9ycyAgYG90aGVyYDogVW5rbm93biBvciBvdGhlciBpbnZlc3RtZW50IHR5cGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSBzdWJ0eXBlIG9mIHRoZSBob2xkaW5nLiAgSW4gcmFyZSBpbnN0YW5jZXMsIGEgbnVsbCB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIGluc3RpdHV0aW9uYWwgZGF0YSBpcyBpbnN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBzZWN1cml0eSBzdWJ0eXBlLiAgUG9zc2libGUgdmFsdWVzOiBgYXNzZXQgYmFja2VkIHNlY3VyaXR5YCwgYGJpbGxgLCBgYm9uZGAsIGBib25kIHdpdGggd2FycmFudHNgLCBgY2FzaGAsIGBjYXNoIG1hbmFnZW1lbnQgYmlsbGAsIGBjb21tb24gc3RvY2tgLCBgY29udmVydGlibGUgYm9uZGAsIGBjb252ZXJ0aWJsZSBlcXVpdHlgLCBgY3J5cHRvY3VycmVuY3lgLCBgZGVwb3NpdGFyeSByZWNlaXB0YCwgYGRlcG9zaXRhcnkgcmVjZWlwdCBvbiBkZWJ0YCwgYGV0ZmAsIGBmbG9hdCByYXRpbmcgbm90ZWAsIGBmdW5kIG9mIGZ1bmRzYCwgYGhlZGdlIGZ1bmRgLCBgbGltaXRlZCBwYXJ0bmVyc2hpcCB1bml0YCwgYG1lZGl1bSB0ZXJtIG5vdGVgLCBgbW9uZXkgbWFya2V0IGRlYnRgLCBgbW9ydGdhZ2UgYmFja2VkIHNlY3VyaXR5YCwgYG11bmljaXBhbCBib25kYCwgYG11dHVhbCBmdW5kYCwgYG5vdGVgLCBgb3B0aW9uYCwgYG90aGVyYCwgYHByZWZlcnJlZCBjb252ZXJ0aWJsZWAsIGBwcmVmZXJyZWQgZXF1aXR5YCwgYHByaXZhdGUgZXF1aXR5IGZ1bmRgLCBgcmVhbCBlc3RhdGUgaW52ZXN0bWVudCB0cnVzdGAsIGBzdHJ1Y3R1cmVkIGVxdWl0eSBwcm9kdWN0YCwgYHRyZWFzdXJ5IGluZmxhdGlvbiBwcm90ZWN0ZWQgc2VjdXJpdGllc2AsIGB1bml0YCwgYHdhcnJhbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHRoZSBjbG9zZSBvZiB0aGUgcHJldmlvdXMgdHJhZGluZyBzZXNzaW9uLiBOdWxsIGZvciBub24tcHVibGljIHNlY3VyaXRpZXMuICBJZiB0aGUgc2VjdXJpdHkgaXMgYSBmb3JlaWduIGN1cnJlbmN5IHRoaXMgZmllbGQgd2lsbCBiZSB1cGRhdGVkIGRhaWx5IGFuZCB3aWxsIGJlIHByaWNlZCBpbiBVU0QuICBJZiB0aGUgc2VjdXJpdHkgaXMgYSBjcnlwdG9jdXJyZW5jeSwgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMgYSBkYXkuIEFzIGNyeXB0byBwcmljZXMgY2FuIGZsdWN0dWF0ZSBxdWlja2x5IGFuZCBkYXRhIG1heSBiZWNvbWUgc3RhbGUgc29vbmVyIHRoYW4gb3RoZXIgYXNzZXQgY2xhc3NlcywgcmVmZXIgdG8gYHVwZGF0ZV9kYXRldGltZWAgd2l0aCB0aGUgdGltZSB3aGVuIHRoZSBwcmljZSB3YXMgbGFzdCB1cGRhdGVkLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgZm9yIHdoaWNoIGBjbG9zZV9wcmljZWAgaXMgYWNjdXJhdGUuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjbG9zZV9wcmljZV9hc19vZjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIGF0IHdoaWNoIGBjbG9zZV9wcmljZWAgaXMgYWNjdXJhdGUsIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opLiBBbHdheXMgYG51bGxgIGlmIGBjbG9zZV9wcmljZWAgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdXBkYXRlX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgcHJpY2UgZ2l2ZW4uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWN1cml0eS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy0xMDM4MyBNYXJrZXQgSWRlbnRpZmllciBDb2RlIG9mIHRoZSBleGNoYW5nZSBvciBtYXJrZXQgaW4gd2hpY2ggdGhlIHNlY3VyaXR5IGlzIGJlaW5nIHRyYWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIG1hcmtldF9pZGVudGlmaWVyX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3RvciBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHksIHN1Y2ggYXMgRmluYW5jZSwgSGVhbHRoIFRlY2hub2xvZ3ksIGV0Yy4gIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtcXFwiU2VjdG9ycyBhbmQgSW5kdXN0cmllc1xcXCIgc3ByZWFkc2hlZXRdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFMN2FYVWRxTGh4Z004cWU3aEs2N3FxS1hpVWRRcUlMcHdaMExweHZDVm5jKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHNlY3Rvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kdXN0cnkgY2xhc3NpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5LCBzdWNoIGFzIEJpb3RlY2hub2xvZ3ksIEFpcmxpbmVzLCBldGMuICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcywgcGxlYXNlIHJlZmVyIHRvIHRoZSBbXFxcIlNlY3RvcnMgYW5kIEluZHVzdHJpZXNcXFwiIHNwcmVhZHNoZWV0XShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xTDdhWFVkcUxoeGdNOHFlN2hLNjdxcUtYaVVkUXFJTHB3WjBMcHh2Q1ZuYykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbmR1c3RyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwOTYyIENsYXNzaWZpY2F0aW9uIG9mIEZpbmFuY2lhbCBJbnN0cnVtZW50cyBDb2RlIHVzZWQgdG8gY2xhc3NpZnkgdGhlIHNlY3VyaXR5IGJhc2VkIG9uIGl0cyBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2ZpX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09wdGlvbkNvbnRyYWN0fVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIG9wdGlvbl9jb250cmFjdDogT3B0aW9uQ29udHJhY3QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGaXhlZEluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBmaXhlZF9pbmNvbWU6IEZpeGVkSW5jb21lIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmeSB0aGUgc2VjdXJpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nIG9yIGludmVzdG1lbnQgdHJhbnNhY3Rpb24uIFdoZW4gaW5wdXR0aW5nIGN1c3RvbSBzZWN1cml0eSBkYXRhIHRvIHRoZSBTYW5kYm94LCBQbGFpZCB3aWxsIHBlcmZvcm0gcG9zdC1kYXRhLXJldHJpZXZhbCBub3JtYWxpemF0aW9uIGFuZCBlbnJpY2htZW50LiBUaGVzZSBwcm9jZXNzZXMgbWF5IGNhdXNlIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBTYW5kYm94IHRvIGJlIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBkYXRhIHlvdSBpbnB1dC4gQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZSBhbmQgYSBzZWN1cml0eSBpZGVudGlmaWVyIChgdGlja2VyX3N5bWJvbGAsIGBjdXNpcGAsIG9yIGBpc2luYCkgYXJlIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWN1cml0eU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogMTItY2hhcmFjdGVyIElTSU4sIGEgZ2xvYmFsbHkgdW5pcXVlIHNlY3VyaXRpZXMgaWRlbnRpZmllci4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBbcmVxdWVzdCBJU0lOL0NVU0lQIGFjY2VzcyBoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpc2luPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDktY2hhcmFjdGVyIENVU0lQLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIE5vcnRoIEFtZXJpY2FuIHNlY3VyaXRpZXMuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2UgW3JlcXVlc3QgSVNJTi9DVVNJUCBhY2Nlc3MgaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgY3VzaXA/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNlZG9sPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHlcXCdzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdGllcywgYW5kIG90aGVyd2lzZSBhIHNob3J0IGlkZW50aWZpZXIgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIHZhbGlkIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFnZS1lc3RpbWF0aW9uIHJlc3VsdHMgZnJvbSB0aGUgc2VsZmllIGNhcHR1cmUuIFRoaXMgZmllbGQgaXMgYG51bGxgIHdoZW4gYW4gYWdlIHJhbmdlIGNvdWxkIG5vdCBiZSBlc3RpbWF0ZWQgZnJvbSB0aGUgc2VsZmllIGNhcHR1cmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUFnZUNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQWdlQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBZ2VDaGVja1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQWdlQ2hlY2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IFNlbGZpZUFnZUNoZWNrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBhZ2UgYXQgdGhlIHRpbWUgb2YgdGhlIHNlbGZpZSBjYXB0dXJlLCBjYWxjdWxhdGVkIGZyb20gdGhlIGRhdGUgb2YgYmlydGggc3VibWl0dGVkIGR1cmluZyBJZGVudGl0eSBWZXJpZmljYXRpb24uIElmIG11bHRpcGxlIGRhdGUgb2YgYmlydGggc291cmNlcyBhcmUgYXZhaWxhYmxlLCB0aGUgZGF0ZSBvZiBiaXJ0aCBzdWJtaXR0ZWQgaW4gdGhlIGZsb3cgc2Vzc2lvbiB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZSBkb2N1bWVudCBkYXRlIG9mIGJpcnRoLiBUaGlzIGZpZWxkIGlzIGBudWxsYCB3aGVuIHRoZSBkYXRlIG9mIGJpcnRoIGlzIHVuYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFnZUNoZWNrXG4gICAgICovXG4gICAgcmVwb3J0ZWRfYWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExvd2VyIGJvdW5kIG9mIHRoZSBlc3RpbWF0ZWQgYWdlIHJhbmdlIGZyb20gdGhlIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFnZUNoZWNrXG4gICAgICovXG4gICAgYWdlX2VzdGltYXRlX2xvd2VyX2JvdW5kOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVXBwZXIgYm91bmQgb2YgdGhlIGVzdGltYXRlZCBhZ2UgcmFuZ2UgZnJvbSB0aGUgc2VsZmllIGNhcHR1cmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQWdlQ2hlY2tcbiAgICAgKi9cbiAgICBhZ2VfZXN0aW1hdGVfdXBwZXJfYm91bmQ6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlcG9ydGVkIGFnZSBhbGlnbnMgd2l0aCB0aGUgZXN0aW1hdGVkIHNlbGZpZSBjYXB0dXJlIGFnZSByYW5nZS4gIGBtYXRjaGAgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcG9ydGVkIGFnZSBmYWxscyB3aXRoaW4gdGhlIGVzdGltYXRlZCBzZWxmaWUgY2FwdHVyZSBhZ2UgcmFuZ2UuICBgd2FybmluZ2AgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcG9ydGVkIGFnZSBmYWxscyBvdXRzaWRlIHRoZSBlc3RpbWF0ZWQgc2VsZmllIGNhcHR1cmUgYWdlIHJhbmdlLCBidXQgaXMgY2xvc2UgZW5vdWdoIHRoYXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgcmV2aWV3ZWQuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSByZXBvcnRlZCBhZ2UgZmFsbHMgZmFyIG91dHNpZGUgdGhlIGVzdGltYXRlZCBzZWxmaWUgY2FwdHVyZSBhZ2UgcmFuZ2UuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIG5vdCBlbm91Z2ggZGF0YSBhdmFpbGFibGUgYXQgYWdlLWVzdGltYXRpb24gdGltZSB0byBjb21wYXJlIHRoZSByZXBvcnRlZCBhZ2UgYWdhaW5zdCB0aGUgZXN0aW1hdGVkIHNlbGZpZSBjYXB0dXJlIGFnZSByYW5nZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUFnZUNoZWNrU3RhdHVzIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgV2FybmluZyA9ICd3YXJuaW5nJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgc2VsZmllIHdhcyBwcm9jZXNzZWQuIElmIGEgc2VsZmllIGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBzZWxmaWUgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGZpZUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb259XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRfY29tcGFyaXNvbjogU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzTGl2ZW5lc3NDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNcbiAgICAgKi9cbiAgICBsaXZlbmVzc19jaGVjazogU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBZ2VDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZ2VfY2hlY2s/OiBTZWxmaWVBZ2VDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZmFjaWFsX2FuYWx5c2lzPzogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpcyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIHNlbGZpZSBhbmQgdGhlIGRvY3VtZW50IChpZiBkb2N1bWVudGFyeSB2ZXJpZmljYXRpb24gYWxzbyByYW4pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb24ge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0J1xufVxuXG4vKipcbiAqIEFuYWx5c2lzIG9mIHRoZSBmYWNpYWwgZmVhdHVyZXMgb2YgdGhlIHNlbGZpZSB3aGVuIGNvbXBhcmVkIHRvIHRoZSBmYWNlIGluIHRoZSB1cGxvYWRlZCBkb2N1bWVudCwgaWYgb25lIGlzIHByZXNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBsZWZ0X2V5ZTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgcmlnaHRfZXllOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBsZWZ0X2Jyb3c6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIHJpZ2h0X2Jyb3c6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIGZvcmVoZWFkOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBtaWRkbGVfZm9yZWhlYWQ6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIG5vc2U6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIHBoaWx0cnVtOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBtb3V0aDogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgamF3OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBsZWZ0X2NoZWVrOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICByaWdodF9jaGVlazogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG59XG4vKipcbiAqIE91dGNvbWUgb2YgdGhlIGZhY2lhbCBhbmFseXNpcyBmb3IgYSBzcGVjaWZpYyBmYWNpYWwgZmVhdHVyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQXNzZXNzbWVudCBvZiB3aGV0aGVyIHRoZSBzZWxmaWUgY2FwdHVyZSBpcyBvZiBhIHJlYWwgaHVtYW4gYmVpbmcsIGFzIG9wcG9zZWQgdG8gYSBwaWN0dXJlIG9mIGEgaHVtYW4gb24gYSBzY3JlZW4sIGEgcGljdHVyZSBvZiBhIHBhcGVyIGN1dCBvdXQsIHNvbWVvbmUgd2VhcmluZyBhIG1hc2ssIG9yIGEgZGVlcGZha2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVBbmFseXNpc0xpdmVuZXNzQ2hlY2sge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBUaGUgaW1hZ2Ugb3IgdmlkZW8gY2FwdHVyZSBvZiBhIHNlbGZpZS4gT25seSBvbmUgb2YgYGltYWdlX3VybGAgb3IgYHZpZGVvX3VybGAgd2lsbCBiZSBwb3B1bGF0ZWQgcGVyIHNlbGZpZS4gSW4gdGhlIHZhc3QgbWFqb3JpdHkgb2Ygc2Vzc2lvbnMgUGxhaWQgcmVjb3JkcyBhIHNob3J0IHZpZGVvIG9mIHRoZSB1c2VyLCBzbyBgdmlkZW9fdXJsYCBpcyBwb3B1bGF0ZWQgYW5kIGBpbWFnZV91cmxgIGlzIGBudWxsYC4gYGltYWdlX3VybGAgaXMgb25seSBwb3B1bGF0ZWQgaW4gdGhlIHJhcmUgcGFzc2l2ZS1saXZlbmVzcyBmYWxsYmFjayBjYXNlLCB3aGVyZSB0aGUgdXNlclxcJ3MgZGV2aWNlIGNvdWxkIG5vdCBjb21wbGV0ZSB0aGUgc3RhbmRhcmQgdmlkZW8gbGl2ZW5lc3MgY2FwdHVyZSAoZm9yIGV4YW1wbGUsIGEgY2FtZXJhIG9yIHN0cmVhbWluZyBlcnJvcikgYW5kIHN1Ym1pdHRlZCBhIHNpbmdsZSBzdGlsbCBpbWFnZSBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDYXB0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZSB7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYSBzdGlsbC1pbWFnZSBzZWxmaWUgY2FwdHVyZS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHRoZSBzZXNzaW9uIGZlbGwgYmFjayB0byBwYXNzaXZlIChpbWFnZS1iYXNlZCkgbGl2ZW5lc3MuIEZvciB0aGUgbWFqb3JpdHkgb2Ygc2VsZmllIGNoZWNrcyB0aGlzIGZpZWxkIGlzIGBudWxsYCBhbmQgYHZpZGVvX3VybGAgaXMgcG9wdWxhdGVkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2FwdHVyZVxuICAgICAqL1xuICAgIGltYWdlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIGZvciBkb3dubG9hZGluZyBhIHZpZGVvIHNlbGZpZSBjYXB0dXJlLiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBzZWxmaWUgY2FwdHVyZSBmb3IgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLiBQbGFpZCByZWNvcmRzIGEgc2hvcnQgdmlkZW8gb2YgdGhlIHVzZXIgZHVyaW5nIHRoZSBTZWxmaWUgQ2hlY2sgbGl2ZW5lc3Mgc3RlcCwgc28gdGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgZm9yIHRoZSB2YXN0IG1ham9yaXR5IG9mIHNlbGZpZSBjaGVja3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2FwdHVyZVxuICAgICAqL1xuICAgIHZpZGVvX3VybDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5zZWxmaWVfY2hlY2tgIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2hlY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVDaGVjayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1xuICAgICAqL1xuICAgIHN0YXR1czogU2VsZmllQ2hlY2tTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygc2VsZmllcyBzdWJtaXR0ZWQgdG8gdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlciBzdWJtaXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWxmaWVDaGVja1NlbGZpZT59XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrXG4gICAgICovXG4gICAgc2VsZmllczogQXJyYXk8U2VsZmllQ2hlY2tTZWxmaWU+O1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhbmQgYW5hbHlzaXMgZnJvbSBhIHVzZXJcXCdzIHNlbGZpZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVDaGVja1NlbGZpZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBzdGF0dXM6IFNlbGZpZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF0dGVtcHRgIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgc2VsZmllIHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2FwdHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBjYXB0dXJlOiBTZWxmaWVDYXB0dXJlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBhbmFseXNpczogU2VsZmllQW5hbHlzaXM7XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGBzZWxmaWVfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBgc3RlcHMuc2VsZmllX2NoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUNoZWNrU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQW4gb3V0Y29tZSBzdGF0dXMgZm9yIHRoaXMgc3BlY2lmaWMgc2VsZmllLiBEaXN0aW5jdCBmcm9tIHRoZSBvdmVyYWxsIGBzZWxmaWVfY2hlY2suc3RhdHVzYCB0aGF0IHN1bW1hcml6ZXMgdGhlIHZlcmlmaWNhdGlvbiBvdXRjb21lIGZyb20gb25lIG9yIG1vcmUgc2VsZmllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZVN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgQmFjcyBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlLiBJZiBhbiBJQkFOIGlzIG5vdCBwcm92aWRlZCBvciBpZiB0aGlzIHJlY2lwaWVudCBuZWVkcyB0byBhY2NlcHQgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCBCYWNzIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbmRlckJBQ1NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRlckJBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VuZGVyQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGRldGFpbHMgcmVsYXRlZCB0byBhIGZ1bGZpbGxtZW50IHNlcnZpY2Ugb3IgcHJvZHVjdCBpbiB0ZXJtcyBvZiByZXF1ZXN0LCBwcm9jZXNzIGFuZCByZXN1bHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uT2ZBc3NldH1cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVDogVmVyaWZpY2F0aW9uT2ZBc3NldDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzZXN9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBTVEFUVVNFUzogU3RhdHVzZXM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlRfREVUQUlMOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSB0eXBlIG9mIG9yZGVyIFZlcmlmaWNhdGlvbiBvZiBBc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gICAgICovXG4gICAgVmVuZG9yT3JkZXJJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXIge1xuICAgIFZvYSA9ICdWT0EnLFxuICAgIFZvZSA9ICdWT0UnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIHN0dWRlbnQgbG9hbiBzZXJ2aWNlci4gVGhpcyBpcyBnZW5lcmFsbHkgdGhlIHJlbWl0dGFuY2UgYWRkcmVzcyB0byB3aGljaCBwYXltZW50cyBzaG91bGQgYmUgc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXJBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZm9yIHNlcnZpY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXNcbiAgICAgKi9cbiAgICBTRVJWSUNFOiBTZXJ2aWNlO1xufVxuLyoqXG4gKiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Nlc3Npb24vdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiBhIHRlbXBsYXRlIGRlZmluZWQgaW4gUGxhaWQgRGFzaGJvYXJkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Nlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIEEgVVJJIGluZGljYXRpbmcgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIGEgdXNlciBzaG91bGQgYmUgZm9yd2FyZGVkIGFmdGVyIGNvbXBsZXRpbmcgdGhlIExpbmsgZmxvdzsgdXNlZCB0byBzdXBwb3J0IE9BdXRoIGF1dGhlbnRpY2F0aW9uIGZsb3dzIHdoZW4gbGF1bmNoaW5nIExpbmsgaW4gdGhlIGJyb3dzZXIgb3IgYW5vdGhlciBhcHAuIFRoZSBgcmVkaXJlY3RfdXJpYCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFdoZW4gdXNlZCBpbiBQcm9kdWN0aW9uLCBtdXN0IGJlIGFuIGh0dHBzIFVSSS4gTm90ZSB0aGF0IGFueSByZWRpcmVjdCBVUkkgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIHJlZGlyZWN0IFVSSXMgbGlzdCBpbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIElmIGluaXRpYWxpemluZyBvbiBBbmRyb2lkLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgc3BlY2lmaWVkIGluc3RlYWQgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBcXCdzIEFuZHJvaWQgcGFja2FnZS4gUmVxdWlyZWQgaWYgdXNpbmcgdGhlIHNlc3Npb24gdG9rZW4gdG8gaW5pdGlhbGl6ZSBMYXllciBvbiBBbmRyb2lkLiBBbnkgcGFja2FnZSBuYW1lIHNwZWNpZmllZCBoZXJlIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCBBbmRyb2lkIHBhY2thZ2UgbmFtZXMgc2V0dGluZyBvbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIFdoZW4gY3JlYXRpbmcgYSBzZXNzaW9uIHRva2VuIGZvciBpbml0aWFsaXppbmcgTGF5ZXIgb24gb3RoZXIgcGxhdGZvcm1zLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgbGVmdCBibGFuayBhbmQgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW5kcm9pZF9wYWNrYWdlX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIFVSTCB0byB3aGljaCBhbnkgd2ViaG9va3Mgc2hvdWxkIGJlIHNlbnQuIElmIHlvdSB1c2UgdGhlIHNhbWUgd2ViaG9vayBsaXN0ZW5lciBmb3IgYWxsIFNhbmRib3ggb3IgYWxsIFByb2R1Y3Rpb24gYWN0aXZpdHksIHNldCB0aGlzIHZhbHVlIGluIHRoZSBMYXllciB0ZW1wbGF0ZSBlZGl0b3IgaW4gdGhlIERhc2hib2FyZCBpbnN0ZWFkLiBPbmx5IHByb3ZpZGUgYSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlmIHlvdSBuZWVkIHRvIHVzZSBtdWx0aXBsZSB3ZWJob29rIFVSTHMgcGVyIGVudmlyb25tZW50IChhbiB1bmNvbW1vbiB1c2UgY2FzZSkuIElmIHByb3ZpZGVkLCBhIHZhbHVlIGluIHRoaXMgZmllbGQgd2lsbCB0YWtlIHByaW9yaXR5IG92ZXIgd2ViaG9vayB2YWx1ZXMgc2V0IGluIHRoZSBMYXllciB0ZW1wbGF0ZSBlZGl0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyLiBSZXF1aXJlZCBpZiBhIHJvb3QtbGV2ZWwgYHVzZXJfaWRgIGlzIG5vdCBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0VXNlciB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC4gSXQgaXMgY3VycmVudGx5IHVzZWQgYXMgYSBtZWFucyBvZiBzZWFyY2hpbmcgbG9ncyBmb3IgdGhlIGdpdmVuIHVzZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2Vzc2lvbi90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2VMaW5rfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbms/OiBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZUxpbms7XG59XG4vKipcbiAqIFJlc3BvbnNlIGRhdGEgZm9yIGAvc2Vzc2lvbi90b2tlbi9jcmVhdGVgIGludGVuZGVkIGZvciB1c2Ugd2l0aCB0aGUgTGluayBTREsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlTGlua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlTGluayB7XG4gICAgLyoqXG4gICAgICogQSBMaW5rIHRva2VuLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2VMaW5rXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgbGlua190b2tlbmAgY3JlYXRlZCB0byBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIHRoYXQgd2lsbCBiZSBleGNoYW5nZWQgZm9yIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgNCBob3Vycy4gQSBgbGlua190b2tlbmAgY3JlYXRlZCBmb3IgYW4gZXhpc3RpbmcgSXRlbSAoc3VjaCBhcyB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gIGJ5IGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlKSBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2VMaW5rXG4gICAgICovXG4gICAgZXhwaXJhdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlTGlua1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcGF5bWVudCBkZWNpc2lvbiBmcm9tIHRoZSByaXNrIGFzc2Vzc21lbnQuICBgQVBQUk9WRWA6IGFwcHJvdmUgdGhlIHRyYW5zYWN0aW9uIHdpdGhvdXQgcmVxdWlyaW5nIGZ1cnRoZXIgYWN0aW9ucyBmcm9tIHlvdXIgY3VzdG9tZXJzLiBGb3IgZXhhbXBsZSwgdXNlIHRoaXMgZmllbGQgaWYgeW91IGFyZSBwbGFjaW5nIGEgc3RhbmRhcmQgaG9sZCBmb3IgYWxsIHRoZSBhcHByb3ZlZCB0cmFuc2FjdGlvbnMgYmVmb3JlIG1ha2luZyBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMuIFlvdSBzaG91bGQgYWxzbyB1c2UgdGhpcyBmaWVsZCBpZiB5b3UgZGVjaWRlIHRvIGFjY2VsZXJhdGUgdGhlIGZ1bmQgYXZhaWxhYmlsaXR5IGZvciB5b3VyIGN1c3RvbWVycy4gIGBSRVZJRVdgOiB0aGUgdHJhbnNhY3Rpb24gcmVxdWlyZXMgbWFudWFsIHJldmlldyAgYFJFSkVDVGA6IHJlamVjdCB0aGUgdHJhbnNhY3Rpb24gIGBUQUtFX09USEVSX1JJU0tfTUVBU1VSRVNgOiBmb3IgZXhhbXBsZSwgcGxhY2luZyBhIGxvbmdlciBob2xkIG9uIGZ1bmRzIHRoYW4gdGhvc2UgYXBwcm92ZWQgdHJhbnNhY3Rpb25zIG9yIGludHJvZHVjaW5nIGN1c3RvbWVyIGZyaWN0aW9ucyBzdWNoIGFzIHN0ZXAtdXAgdmVyaWZpY2F0aW9uL2F1dGhlbnRpY2F0aW9uICBgTk9UX0VWQUxVQVRFRGA6IGlmIG9ubHkgbG9nZ2luZyB0aGUgcmVzdWx0cyB3aXRob3V0IHVzaW5nIHRoZW0gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTaWduYWxEZWNpc2lvbk91dGNvbWUge1xuICAgIEFwcHJvdmUgPSAnQVBQUk9WRScsXG4gICAgUmV2aWV3ID0gJ1JFVklFVycsXG4gICAgUmVqZWN0ID0gJ1JFSkVDVCcsXG4gICAgVGFrZU90aGVyUmlza01lYXN1cmVzID0gJ1RBS0VfT1RIRVJfUklTS19NRUFTVVJFUycsXG4gICAgTm90RXZhbHVhdGVkID0gJ05PVF9FVkFMVUFURUQnXG59XG5cbi8qKlxuICogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5pdGlhdGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGRheXMgKGhvbGQgdGltZSkgc2luY2UgdGhlIEFDSCBkZWJpdCB0cmFuc2FjdGlvbiB0aGF0IHlvdSB3YWl0IGJlZm9yZSBtYWtpbmcgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzLiBUaGUgaG9sZGluZyB0aW1lIGNvdWxkIGFmZmVjdCB0aGUgQUNIIHJldHVybiByYXRlLiAgRm9yIGV4YW1wbGUsIHVzZSAwIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycyBpbnN0YW50bHkgb3IgdGhlIHNhbWUgZGF5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24sIG9yIDEgaWYgeW91IG1ha2UgZnVuZHMgYXZhaWxhYmxlIHRoZSBuZXh0IGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IGluaXRpYWxpemF0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfZnVuZHNfb25faG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERlY2lzaW9uT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVjaXNpb25fb3V0Y29tZT86IFNpZ25hbERlY2lzaW9uT3V0Y29tZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFBheW1lbnRNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0aG9kPzogU2lnbmFsUGF5bWVudE1ldGhvZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCAoaW4gVVNEKSBtYWRlIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycyBpbnN0YW50bHkgZm9sbG93aW5nIHRoZSBkZWJpdCB0cmFuc2FjdGlvbi4gSXQgY291bGQgYmUgYSBwYXJ0aWFsIGFtb3VudCBvZiB0aGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9uIChleGFtcGxlOiAxMDIuMDUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudF9pbnN0YW50bHlfYXZhaWxhYmxlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgQUNIIGRlYml0IHdhcyBzdWJtaXR0ZWQgdG8gdGhlIGJhbmsgZm9yIHByb2Nlc3NpbmcgKGluIElTTyA4NjAxIGZvcm1hdDogYFlZWVktTU0tRERUSEg6bW06c3NaYCkuIFRoaXMgZmllbGQgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIGF0dGVtcHQgaW5pdGlhdGVkIGFmdGVyIHRoZSBgL3NpZ25hbC9zY2hlZHVsZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdWJtaXR0ZWRfYXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGRldmljZS4gVGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCwgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBhY2N1cmFjeSBvZiByZXN1bHRzIHdoZW4gdXNpbmcgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3Jlcy4gV2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBSdWxlc2V0LCB0aGVzZSBmaWVsZHMgYXJlIGlnbm9yZWQgaWYgdGhlIFNpZ25hbCBBZGRlbmR1bSBoYXMgYmVlbiBzaWduZWQ7IGlmIGl0IGhhcyBub3QgYmVlbiBzaWduZWQsIHVzaW5nIHRoZXNlIGZpZWxkcyB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgdGhhdCBpbml0aWF0ZWQgdGhlIHRyYW5zYWN0aW9uIChlLmcuIFxcXCJNb3ppbGxhLzUuMFxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjb3JlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyB0aGUgQUNIIHJldHVybiByaXNrLiAgSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgb25seSBgYXZhaWxhYmxlX2JhbGFuY2VgIGFuZCBgY3VycmVudF9iYWxhbmNlYCB3aWxsIGJlIHJldHVybmVkIGFzIGNvcmUgYXR0cmlidXRlcy4gSWYgdXNpbmcgYSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIHJ1bGVzZXQsIG92ZXIgODAgY29yZSBhdHRyaWJ1dGVzIHdpbGwgYmUgcmV0dXJuZWQuIEV4YW1wbGVzIG9mIGF0dHJpYnV0ZXMgaW5jbHVkZTogIGBhdmFpbGFibGVfYmFsYW5jZWAgYW5kIGBjdXJyZW50X2JhbGFuY2VgOiBUaGUgYmFsYW5jZSBpbiB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uYDogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXMgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgYGlzX3NhdmluZ3Nfb3JfbW9uZXlfbWFya2V0X2FjY291bnRgOiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnQgIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IHNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDcgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX3NhdmluZ3Nfb3JfbW9uZXlfbWFya2V0X2FjY291bnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIGFsbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIGFsbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5NXRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5NV9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5NXRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5NV9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHdpdGhpbiB0aGUgcGFzdCA5MCBkYXlzIHdoZW4gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgaGFkIGEgbmVnYXRpdmUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfbmVnYXRpdmVfYmFsYW5jZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAzMCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAzMCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2YWlsYWJsZSBiYWxhbmNlLCBhcyBvZiB0aGUgYGJhbGFuY2VfbGFzdF91cGRhdGVkYCB0aW1lLiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGVfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3VycmVudCBiYWxhbmNlLCBhcyBvZiB0aGUgYGJhbGFuY2VfbGFzdF91cGRhdGVkYCB0aW1lLiBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGN1cnJlbnRfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCBoYXMgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBiYWxhbmNlX2xhc3RfdXBkYXRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZHJlc3NfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkZWJpdF90cmFuc2FjdGlvbnNfY291bnRfMTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3JlZGl0X3RyYW5zYWN0aW9uc19jb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkZWJpdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3JlZGl0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkZWJpdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3JlZGl0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkZWJpdF90cmFuc2FjdGlvbnNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3JlZGl0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAzMCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9lb2RfYmFsYW5jZV8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9lb2RfYmFsYW5jZV82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9lb2RfYmFsYW5jZV85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBkYXkgMzEgYW5kIGRheSA2MCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzMxZF90b182MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBkYXkgNjEgYW5kIGRheSA5MCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzYxZF90b185MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBkYXkgMzEgYW5kIGRheSA2MCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzMxZF90b182MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBkYXkgNjEgYW5kIGRheSA5MCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzYxZF90b185MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBkYXkgMzEgYW5kIGRheSA2MCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzMxZF90b182MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBkYXkgNjEgYW5kIGRheSA5MCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzYxZF90b185MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhhdCB0aGUgdHJhbnNhY3Rpb25zIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2xhc3RfdXBkYXRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgY2xvc2VkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Nsb3NlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgcmVjZWl2ZXIgYmFuayBhY2NvdW50IGlzIGVpdGhlciBmcm96ZW4gb3IgcmVzdHJpY3RlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9mcm96ZW5fb3JfcmVzdHJpY3RlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXMgKG1heCAxMDApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXMgKG1heCAxMDApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBTU0wvVExTIGNvbm5lY3Rpb24gc2Vzc2lvbnMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBTU0wvVExTIGNvbm5lY3Rpb24gc2Vzc2lvbnMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBTU0wvVExTIGNvbm5lY3Rpb24gc2Vzc2lvbnMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9zc2xfdGxzX2Nvbm5lY3Rpb25fc2Vzc2lvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9hY2NvdW50X29wZW5pbmc/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRha2luZyBgYXZhaWxhYmxlX29yX2N1cnJlbnRfYmFsYW5jZWAgYW5kIGRpdmlkaW5nIGl0IGJ5IHRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIFVzZWZ1bCB0byBzYXkgXFxcIjEwJSBidWZmZXJcXFwiLCBmb3IgZXhhbXBsZS4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGJ1aWxkIFNpZ25hbCBSdWxlcyB1cG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBiYWxhbmNlX3RvX3RyYW5zYWN0aW9uX2Ftb3VudF9yYXRpbz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtaW5wdXQvI2ludmFsaWRfYWNjb3VudF9pZCkgZXJyb3IgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCBhdCB0aGUgYmFuayBvciBpZiB0aGUgYGFjY291bnRfaWRgIGlzIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIGV2YWx1YXRpb24gYXR0ZW1wdCAtIGZvciBleGFtcGxlLCBhIHBheW1lbnQgYXR0ZW1wdCBJRC4gWW91IHdpbGwgdXNlIHRoaXMgbGF0ZXIgdG8gZGVidWcgdGhpcyBldmFsdWF0aW9uLCBhbmQvb3IgcmVwb3J0IGFuIEFDSCByZXR1cm4sIGV0Yy4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBlbmQgdXNlciBpcyBwcmVzZW50IHdoaWxlIGluaXRpYXRpbmcgdGhlIEFDSCB0cmFuc2ZlciBhbmQgdGhlIGVuZHBvaW50IGlzIGJlaW5nIGNhbGxlZDsgYGZhbHNlYCBvdGhlcndpc2UgKGZvciBleGFtcGxlLCB3aGVuIHRoZSBBQ0ggdHJhbnNmZXIgaXMgc2NoZWR1bGVkIGFuZCB0aGUgZW5kIHVzZXIgaXMgbm90IHByZXNlbnQsIG9yIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgdGhlIEFDSCB0cmFuc2ZlciBidXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIE5hY2hhIGZpbGUgZm9yIEFDSCBwcm9jZXNzaW5nKS4gV2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIFRoaXMgZmllbGQgaXMgbm90IGN1cnJlbnRseSB1c2VkIGFzIHBhcnQgb2YgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGV2YWx1YXRpb25zLCBidXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSBgdHJ1ZWAgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHBhcnQgb2YgcmVjdXJyaW5nIHNjaGVkdWxlIChmb3IgZXhhbXBsZSwgYSBtb250aGx5IHJlcGF5bWVudCk7IGBmYWxzZWAgb3RoZXJ3aXNlLiBXaGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gV2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIGBTQU1FX0RBWV9BQ0hgOiBTYW1lIERheSBBQ0ggYnkgTmFjaGEuIFRoZSBkZWJpdCB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgb24gdGhlIHNhbWUgZGF5LiBgU1RBTkRBUkRfQUNIYDogU3RhbmRhcmQgQUNIIGJ5IE5hY2hhLiBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogSWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMuIFBvc3NpYmxlIHZhbHVlczogIGBTQU1FX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnlpbmcgYHJpc2tfcHJvZmlsZV9rZXlgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwcm92aWRlIGBydWxlc2V0YCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlX2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgcnVsZXNldCB0byB1c2UgZm9yIGV2YWx1YXRpbmcgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjcmVhdGUgYSBydWxlc2V0IHVzaW5nIHRoZSBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIFtTaWduYWwtPlJ1bGVzXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc2lnbmFsL3Jpc2stcHJvZmlsZXMpLiBJZiBub3QgcHJvdmlkZWQsIGZvciBhbGwgbmV3IGN1c3RvbWVycyBhcyBvZiBPY3RvYmVyIDE1LCAyMDI1LCB0aGUgYGRlZmF1bHRgIHJ1bGVzZXQgd2lsbCBiZSB1c2VkLiBGb3IgZXhpc3RpbmcgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBjdXN0b21lcnMgYXMgb2YgT2N0b2JlciAxNSwgMjAyNSwgYnkgZGVmYXVsdCwgbm8gcnVsZXNldCB3aWxsIGJlIHVzZWQgaWYgdGhlIGBydWxlc2V0X2tleWAgaXMgbm90IHByb3ZpZGVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gb3B0IG91dCBvZiB1c2luZyBydWxlc2V0cywgc2VlIFtTaWduYWwgUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsRXZhbHVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvcmVfYXR0cmlidXRlcz86IFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tQcm9maWxlfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByaXNrX3Byb2ZpbGU/OiBSaXNrUHJvZmlsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1J1bGVzZXR9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlc2V0PzogUnVsZXNldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIHJlc3VsdHMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBhZnRlciB0aGUgcmlzayBhc3Nlc3NtZW50LiBJdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgcGF5bWVudCBtZXRob2QuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5hY2hhLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheS4gIGBTVEFOREFSRF9BQ0hgOiBTdGFuZGFyZCBBQ0ggYnkgTmFjaGEuICBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsUGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIE5leHREYXlBY2ggPSAnTkVYVF9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIE11bHRpcGxlUGF5bWVudE1ldGhvZHMgPSAnTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcnNvbk5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHByZWZpeCAoZS5nLiBcXFwiTXIuXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgcHJlZml4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZ2l2ZW4gbmFtZS4gSWYgdGhlIHVzZXIgaGFzIGEgb25lLXdvcmQgbmFtZSwgaXQgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZhbWlseSBuYW1lIC8gc3VybmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgc3VmZml4IChlLmcuIFxcXCJJSVxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4geW91IHJlY2VpdmUgdGhlIHJldHVybnMgZnJvbSB5b3VyIHBheW1lbnQgcHJvY2Vzc29ycywgaW4gSVNPIDg2MDEgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHNwZWNpZmllZCBpbiB0aGUgYGRlZmF1bHRfcGF5bWVudF9tZXRob2RgIGZpZWxkIGRpcmVjdGx5IGltcGFjdHMgdGhlIHRpbWluZyByZWNvbW1lbmRhdGlvbnMgcHJvdmlkZWQgYnkgdGhlIEFQSSBmb3Igc3VibWl0dGluZyB0aGUgZGViaXQgZW50cnkgdG8geW91ciBwcm9jZXNzb3Igb3IgT0RGSS4gSWYgdW5zcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGBTVEFOREFSRF9BQ0hgLiAgYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCAoYXMgZGVmaW5lZCBieSBOYWNoYSkuIFRoZSBBUEkgYXNzdW1lcyB0aGUgc2V0dGxlbWVudCB3aWxsIG9jY3VyIG9uIHRoZSBzYW1lIGJ1c2luZXNzIGRheSBpZiB0aGUgYC9zaWduYWwvc2NoZWR1bGVgIHJlcXVlc3QgaXMgc3VibWl0dGVkIGJ5IDY6MDAgUE0gVVRDLiBOb3RlOiBUaGUgYWN0dWFsIGN1dG9mZiB0aW1lIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIG9yIE9ERkkuIE5hY2hhIGhhcyBlc3RhYmxpc2hlZCB0aHJlZSBwcm9jZXNzaW5nIHdpbmRvd3MgZm9yIFNhbWUgRGF5IEFDSCAoRWFzdGVybiBUaW1lKTogMTA6MzAgQU0sIDI6NDUgUE0sIGFuZCA0OjQ1IFBNLiAgYFNUQU5EQVJEX0FDSGA6IFN0YW5kYXJkIEFDSCAoYXMgZGVmaW5lZCBieSBOYWNoYSksIHR5cGljYWxseSBzZXR0bGVkIG9uZSB0byB0aHJlZSBidXNpbmVzcyBkYXlzIGFmdGVyIHN1Ym1pc3Npb24uICBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogSW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhlIHRyYW5zYWN0aW9uIGNvdWxkIHVzZSBhbnkgb2YgdGhlbSBiYXNlZCBvbiBjdXN0b21lciBwb2xpY3kgb3IgYXZhaWxhYmlsaXR5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsU2NoZWR1bGVEZWZhdWx0UGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIFN0YW5kYXJkQWNoID0gJ1NUQU5EQVJEX0FDSCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogQ29udmV5cyBpbmZvcm1hdGlvbiBvbiBpZiBhIHJldHJ5IGlzIHJlY29tbWVuZGVkIG9uIGEgZ2l2ZW4gZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIGRhdGUgZm9yIHN1Ym1pdHRpbmcgdGhlIGRlYml0IGVudHJ5LCBmb3JtYXR0ZWQgaW4gSVNPIDg2MDEgKGUuZy4sIFxcXCIyMDI1LTAxLTE3XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvblxuICAgICAqL1xuICAgIGRhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY29tbWVuZGF0aW9uU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmVjb21tZW5kYXRpb24/OiBSZWNvbW1lbmRhdGlvblN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuayBvZiB0aGUgcmVjb21tZW5kYXRpb24gYmFzZWQgb24gdGhlIGxpa2VsaWhvb2Qgb2YgZGViaXQgc3VjY2Vzcywgd2l0aCAxIHJlcHJlc2VudGluZyB0aGUgbW9zdCBvcHRpbWFsIGRhdGUuIERhdGVzIHdpdGggYE5PVF9SRUNPTU1FTkRFRGAgb3IgYFVOS05PV05gIHdpbGwgaGF2ZSByYW5rIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmFuaz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvc2NoZWR1bGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtaW5wdXQvI2ludmFsaWRfYWNjb3VudF9pZCkgZXJyb3IgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCBhdCB0aGUgYmFuayBvciBpZiB0aGUgYGFjY291bnRfaWRgIGlzIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIElEL2lkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFRoZSBtYXggbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIDM2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxTY2hlZHVsZURlZmF1bHRQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogU2lnbmFsU2NoZWR1bGVEZWZhdWx0UGF5bWVudE1ldGhvZDtcbn1cbi8qKlxuICogU2lnbmFsU2NoZWR1bGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL3NjaGVkdWxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsU2NoZWR1bGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY29tbWVuZGVkIG9wdGltYWwgZGF0ZSB0byBzdWJtaXQgdGhlIGRlYml0IGVudHJ5LCBmb3JtYXR0ZWQgaW4gSVNPIDg2MDEgXFxcIllZWVktTU0tRERcXFwiIChlLmcuLCBcXFwiMjAyNC0wMy0zMFxcXCIpLiBUaGUgYG9wdGltYWxfZGF0ZWAgaXMgZGVyaXZlZCBmcm9tIHRoZSBkYXRlIHdpdGggcmFuayA9IDEgaW4gdGhlIGZvbGxvd2luZyByZWNvbW1lbmRhdGlvbnMgYXJyYXkuICBOT1RFOiBUaGUgYGRlZmF1bHRfcGF5bWVudF9tZXRob2RgIGZpZWxkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3aWxsIGFmZmVjdCB0aGUgcmVjb21tZW5kYXRpb24sIHNpbmNlIHdlXFwncmUgYWNjb3VudGluZyBmb3IgZGViaXQgc2V0dGxlbWVudCB0aW1lLiAgVGhlIGRlYml0IHNjaGVkdWxpbmcgZXZhbHVhdGlvbiBzdGFydHMgZnJvbSB0aGUgZGF5IHRoZSAvc2lnbmFsL3NjaGVkdWxlIHJlcXVlc3QgaXMgc3VibWl0dGVkIChEYXkgMCkgb3IgdGhlIG5leHQgYmFua2luZyBkYXkgaWYgdGhlIHN1Ym1pc3Npb24gZGF5IGlzIG5vdCBhIGJhbmtpbmcgZGF5LCBhbmQgZXh0ZW5kcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgZml2ZSBiYW5raW5nIGRheXMgKERheSAxIHRvIERheSA1KS4gSWYgbm8gZGF0ZSB3aXRoaW4gdGhpcyBwZXJpb2QgaXMgY29uc2lkZXJlZCBsaWtlbHkgdG8gcmVzdWx0IGluIGEgc3VjY2Vzc2Z1bCBkZWJpdCBhdHRlbXB0LCBgbnVsbGAgd2lsbCBiZSByZXR1cm5lZCBmb3IgdGhlIGBvcHRpbWFsX2RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcHRpbWFsX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBhcnJheSBwcm92aWRlcyBhIGRhdGUtYnktZGF0ZSBldmFsdWF0aW9uIG9mIGRlYml0IHN1Ym1pc3Npb24gcmVjb21tZW5kYXRpb25zIHdpdGhpbiB0aGUgZml2ZSBiYW5raW5nIGRheSBldmFsdWF0aW9uIHBlcmlvZC4gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5IHJlcHJlc2VudHMgYSByZXRyeSByZWNvbW1lbmRhdGlvbiBmb3IgYSBzcGVjaWZpYyBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY29tbWVuZGF0aW9uczogQXJyYXk8U2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvbj47XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSaXNrIHNjb3JpbmcgZGV0YWlscyBicm9rZW4gZG93biBieSByaXNrIGNhdGVnb3J5LiBXaGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgb2JqZWN0IHdpbGwgbm90IGJlIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY29yZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTY29yZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlzaz86IEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQmFua0luaXRpYXRlZFJldHVyblJpc2s7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIChpLmUuLCB0aGUgYWNjb3VudCBob2xkZXIpLiBUaGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBidXQgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5jcmVhc2UgdGhlIGFjY3VyYWN5IG9mIHJlc3VsdHMgd2hlbiB1c2luZyBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzLiBXaGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIGlmIHRoZSBTaWduYWwgQWRkZW5kdW0gaGFzIGJlZW4gc2lnbmVkLCB0aGVzZSBmaWVsZHMgYXJlIGlnbm9yZWQ7IGlmIHRoZSBBZGRlbmR1bSBoYXMgbm90IGJlZW4gc2lnbmVkLCB1c2luZyB0aGVzZSBmaWVsZHMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxVc2VyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGVyc29uTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBTaWduYWxQZXJzb25OYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBDb252ZXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBtaXNzaW5nIG9yIHN0YWxlIGJhbmsgZGF0YSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIHNjb3JlcyBhbmQgcmVzcG9uc2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIHdhcm5pbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcgdGhhdCBwZXJ0YWlucyB0byB0aGUgZXJyb3IgY2F1c2luZyBiYW5rIGRhdGEgdG8gYmUgbWlzc2luZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gRm9yIG1vcmUgZGV0YWlscyBvbiB3YXJuaW5nIGNvZGVzLCBwbGVhc2UgcmVmZXIgdG8gUGxhaWQgc3RhbmRhcmQgZXJyb3IgY29kZXMgZG9jdW1lbnRhdGlvbi4gSWYgeW91IHJlY2VpdmUgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3YXJuaW5nLCB3ZSByZWNvbW1lbmQgcmUtYXV0aGVudGljYXRpbmcgeW91ciB1c2VyIGJ5IGltcGxlbWVudGluZyBMaW5rXFwncyB1cGRhdGUgbW9kZS4gVGhpcyB3aWxsIGd1aWRlIHlvdXIgdXNlciB0byBmaXggdGhlaXIgY3JlZGVudGlhbHMsIGFsbG93aW5nIFBsYWlkIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEgYWdhaW4gZm9yIGZ1dHVyZSByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3YXJuaW5nIHR5cGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX21lc3NhZ2U/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3dlZXAgcmV0dXJuZWQgZnJvbSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludC4gQ2FuIGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIHRyYW5zZmVycyB0byBpbmNsdWRlIGluIGEgc3dlZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBkZWNpbWFsIGFtb3VudCBvZiB0aGUgc3dlZXAgYXMgaXQgYXBwZWFycyBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyIChlLmcuIFxcXCItMTAuMDBcXFwiKSAgSWYgYW1vdW50IGlzIG5vdCBwcmVzZW50LCB0aGUgc3dlZXAgd2FzIG5ldC1zZXR0bGVkIHRvIHplcm8gYW5kIG91dHN0YW5kaW5nIGRlYml0cyBhbmQgY3JlZGl0cyBiZXR3ZWVuIHRoZSBzd2VlcCBhY2NvdW50IGFuZCBQbGFpZCBhcmUgYmFsYW5jZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgc3dlZXAgc2V0dGxlZCwgaW4gdGhlIFlZWVktTU0tREQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzZXR0bGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCBkYXRlIHdoZW4gZnVuZHMgZnJvbSBhIGxlZGdlciBkZXBvc2l0IHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgYW5kIGNhbiBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYXNzb2NpYXRlZCBsZWRnZXIgYmFsYW5jZS4gT25seSBhcHBsaWVzIHRvIGRlcG9zaXRzLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZXhwZWN0ZWRfZnVuZHNfYXZhaWxhYmxlX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgdHJpZ2dlcj86IFN3ZWVwVHJpZ2dlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBGb3IgYHJ0cGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBUcmFuc2FjdGlvbiBJZGVudGlmaWNhdGlvbiBudW1iZXIuIEZvciBgd2lyZWAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBJTUFEIChJbnB1dCBNZXNzYWdlIEFjY291bnRhYmlsaXR5IERhdGEpIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogU3dlZXBGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgYWxsIHJpc2sgc2lnbmFscyBhbmQgcmVsZXZhbnQgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgU2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZG9jdW1lbnRfcmVmZXJlbmNlOiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYXR0cmlidXRlcyB0aGF0IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGZyYXVkIHJpc2sgd2l0aCBhIGRvY3VtZW50XG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRSaXNrU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcmlza19zdW1tYXJ5OiBEb2N1bWVudFJpc2tTdW1tYXJ5O1xufVxuLyoqXG4gKiBBIHR5cGUgaW5kaWNhdGluZyB3aGV0aGVyIGEgZGFzaGJvYXJkIHVzZXIsIGFuIEFQSS1iYXNlZCB1c2VyLCBvciBQbGFpZCBsYXN0IHRvdWNoZWQgdGhpcyBvYmplY3QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTb3VyY2Uge1xuICAgIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICAgIExpbmsgPSAnbGluaycsXG4gICAgQXBpID0gJ2FwaScsXG4gICAgU3lzdGVtID0gJ3N5c3RlbSdcbn1cblxuLyoqXG4gKiBUaGUgc2NoZW1hIGJlbG93IGRlc2NyaWJlcyB0aGUgdmFyaW91cyBgdHlwZXNgIGFuZCBjb3JyZXNwb25kaW5nIGBzdWJ0eXBlc2AgdGhhdCBQbGFpZCByZWNvZ25pemVzIGFuZCByZXBvcnRzIGZvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMuIEZvciBhIG1hcHBpbmcgb2Ygc3VwcG9ydGVkIHR5cGVzIGFuZCBzdWJ0eXBlcyB0byBQbGFpZCBwcm9kdWN0cywgc2VlIHRoZSBbQWNjb3VudCB0eXBlIC8gcHJvZHVjdCBzdXBwb3J0IG1hdHJpeF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS0tcHJvZHVjdC1zdXBwb3J0LW1hdHJpeCkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVBY2NvdW50VHlwZSB7XG4gICAgLyoqXG4gICAgICogQW4gYWNjb3VudCB0eXBlIGhvbGRpbmcgY2FzaCwgaW4gd2hpY2ggZnVuZHMgYXJlIGRlcG9zaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjcmVkaXQgY2FyZCB0eXBlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgY3JlZGl0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsb2FuIHR5cGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBsb2FuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaW52ZXN0bWVudCBhY2NvdW50LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyB0eXBlIGlzIGNhbGxlZCBgYnJva2VyYWdlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXlyb2xsIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgcGF5cm9sbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdGhlciBvciB1bmtub3duIGFjY291bnQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGN1cnJlbmN5IGNvZGVzIGFyZSBzdXBwb3J0ZWQgYnkgUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3Qge1xuICAgIC8qKlxuICAgICAqIFBsYWlkIHN1cHBvcnRzIGFsbCBJU08gNDIxNyBjdXJyZW5jeSBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgdmFsdWVzIGZvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcy4gTm90ZSB0aGF0IHRyYW5zYWN0aW9ucyByZXByZXNlbnRpbmcgaW5mbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgbmVnYXRpdmUgYW1vdW50cywgb3V0ZmxvdyBvZiBjYXNoIHdpbGwgYXBwZWFyIGFzIHBvc2l0aXZlIGFtb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGUge1xuICAgIC8qKlxuICAgICAqIEJ1eWluZyBhbiBpbnZlc3RtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBidXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZWxsaW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHNlbGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhbmNlbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBjYXNoOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRmVlcyBvbiB0aGUgYWNjb3VudCwgZS5nLiBjb21taXNzaW9uLCBib29ra2VlcGluZywgb3B0aW9ucy1yZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgZmVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbWFzazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9vZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YnR5cGUgb2YgdGhlIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIHN0YXRlbWVudHNcXCcgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgc3RhdGVtZW50czogQXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD47XG59XG4vKipcbiAqIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9kb3dubG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8U3RhdGVtZW50c0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IHJlZnJlc2ggZXh0cmFjdGlvbiAgYFNVQ0NFU1NgOiBUaGUgc3RhdGVtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgYW5kIGNhbiBiZSBsaXN0ZWQgdmlhIGAvc3RhdGVtZW50cy9saXN0L2AgYW5kIGRvd25sb2FkZWQgdmlhIGAvc3RhdGVtZW50cy9kb3dubG9hZC9gLiAgYEZBSUxVUkVgOiBUaGUgc3RhdGVtZW50cyBmYWlsZWQgdG8gYmUgZXh0cmFjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiByZWZyZXNoZWQgc3RhdGVtZW50cyBleHRyYWN0aW9uIGlzIGNvbXBsZXRlZCBvciBmYWlsZWQgdG8gYmUgY29tcGxldGVkLiBUcmlnZ2VyZWQgYnkgY2FsbGluZyBgL3N0YXRlbWVudHMvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTVEFURU1FTlRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNfUkVGUkVTSF9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMy0wOC0zMFxcXCIuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjMtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXRlbWVudFxcJ3MgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNTdGF0ZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSB3aGVuIHRoZSBzdGF0ZW1lbnQgd2FzIHBvc3RlZCBieSB0aGUgRkksIGlmIGtub3duXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1N0YXRlbWVudFxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNb250aCBvZiB0aGUgeWVhci4gUG9zc2libGUgdmFsdWVzOiAxIHRocm91Z2ggMTIgKEphbnVhcnkgdGhyb3VnaCBEZWNlbWJlcikuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1N0YXRlbWVudFxuICAgICAqL1xuICAgIG1vbnRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgb2YgdGhlIHN0YXRlbWVudCwgZS5nLiAyMDI0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICB5ZWFyOiBudW1iZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBTdGF0dXMgQ29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBEZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIFNUQVRVUyBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNlc1xuICAgICAqL1xuICAgIFNUQVRVUzogU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIHdoYXQgc3RlcHMgdGhlIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzaG91bGQgcmVxdWlyZSB0aGUgdXNlciB0byBjb21wbGV0ZTogICBgcmVzZXRgIC0gUmVzdGFydCB0aGUgdXNlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHBhcnQgb2YgdGhlaXIgcHJldmlvdXMgc2Vzc2lvbi4gIGBpbmNvbXBsZXRlYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiBhdCB0aGUgc3RlcCB0aGF0IHRoZSB1c2VyIGZhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgc2tpcHBpbmcgc3RlcHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgYGluZmVyYCAtIElmIHRoZSBtb3N0IHJlY2VudCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgaGFzIGEgc3RhdHVzIG9mIGBmYWlsZWRgIG9yIGBleHBpcmVkYCwgcmV0cnkgdXNpbmcgdGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGByZXNldGAgc3RyYXRlZ3kuICBgY3VzdG9tYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiB3aXRoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlIGBzdGVwc2AgZmllbGQgIE5vdGU6ICBUaGUgYGluY29tcGxldGVgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBmYWlsaW5nIHN0ZXAgaXMgYHNjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLiBFYWNoIGFjY291bnQgY2FuIG9ubHkgY29udGFpbiBvbmUgbGlhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvd2VkIGFzIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpc3N1ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGxvYW4sIGUuZy4sIFxcXCJDb25zb2xpZGF0aW9uIExvYW5zXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zOiBTb21lIGluc3RpdHV0aW9ucyByZXF1aXJlIGEgbWluaW11bSBwYXltZW50IGFjcm9zcyBhbGwgbG9hbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgbnVtYmVyLiBPdXIgQVBJIHByZXNlbnRzIHRoYXQgc2FtZSBtaW5pbXVtIHBheW1lbnQgYW1vdW50IG9uIGVhY2ggbG9hbi4gVGhlIGluc3RpdHV0aW9ucyB0aGF0IGRvIHRoaXMgYXJlOiBHcmVhdCBMYWtlcyAoIGBpbnNfMTE2ODYxYCksIEZpcnN0bWFyayAoYGluc18xMTYyOTVgKSwgQ29tbW9uYm9uZCBGaXJzdG1hcmsgU2VydmljZXMgKGBpbnNfMTE2OTUwYCksIEdyYW5pdGUgU3RhdGUgKGBpbnNfMTE2MzA4YCksIGFuZCBPa2xhaG9tYSBTdHVkZW50IExvYW4gQXV0aG9yaXR5IChgaW5zXzExNjk0NWApLiBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCApIGFuZCBOYXZpZW50IChgaW5zXzExNjI0OGApIHdpbGwgZGlzcGxheSBhcyAkMCBpZiB0aGVyZSBpcyBhbiBhdXRvcGF5IHByb2dyYW0gaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gQSBwYXltZW50IGlzIG5vdCBleHBlY3RlZCBpZiBgbG9hbl9zdGF0dXMudHlwZWAgaXMgYGRlZmVybWVudGAsIGBpbiBzY2hvb2xgLCBgY29uc29saWRhdGVkYCwgYHBhaWQgaW4gZnVsbGAsIG9yIGB0cmFuc2ZlcnJlZGAuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkb2xsYXIgYW1vdW50IG9mIHRoZSBhY2NydWVkIGludGVyZXN0IGJhbGFuY2UuIEZvciBTYWxsaWUgTWFlICggYGluc18xMTY5NDRgKSwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgbG9hbiwgc28gdGhpcyBmaWVsZCB3aWxsIHJldHVybiBhcyBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvdXRzdGFuZGluZ19pbnRlcmVzdF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IGFjY291bnQgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbG9hbiBmb3IgcGF5bWVudHMuIEluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgd2lsbCBtYXRjaCBgYWNjb3VudF9udW1iZXIsYCBidXQgaW4gc29tZSBpbnN0aXR1dGlvbnMsIHN1Y2ggYXMgR3JlYXQgTGFrZXMgKGBpbnNfMTE2ODYxYCksIGl0IHdpbGwgYmUgZGlmZmVyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnLFxuICAgIFBlbmRpbmdJZHIgPSAncGVuZGluZyBpZHInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEluY29tZVNlbnNpdGl2ZVJlcGF5bWVudCA9ICdpbmNvbWUtc2Vuc2l0aXZlIHJlcGF5bWVudCcsXG4gICAgSW50ZXJlc3RPbmx5ID0gJ2ludGVyZXN0LW9ubHknLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYXlBc1lvdUVhcm4gPSAncGF5IGFzIHlvdSBlYXJuJyxcbiAgICBSZXZpc2VkUGF5QXNZb3VFYXJuID0gJ3JldmlzZWQgcGF5IGFzIHlvdSBlYXJuJyxcbiAgICBTdGFuZGFyZCA9ICdzdGFuZGFyZCcsXG4gICAgU2F2aW5nT25BVmFsdWFibGVFZHVjYXRpb24gPSAnc2F2aW5nIG9uIGEgdmFsdWFibGUgZWR1Y2F0aW9uJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBzdGF0dXMgZm9yIGEgc3dlZXAgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTd2VlcEZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBzd2VlcCBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAvUmZQIGVycm9yIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jcnRwcmZwLWVycm9yLWNvZGVzKSBmb3IgUlRQIGVycm9yIGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN3ZWVwRmFpbHVyZVxuICAgICAqL1xuICAgIGZhaWx1cmVfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTd2VlcEZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzd2VlcCB0cmFuc2ZlciAgYFxcXCJwZW5kaW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3VycmVudGx5IHBlbmRpbmcgYFxcXCJwb3N0ZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiBwb3N0ZWQgYFxcXCJzZXR0bGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIHNldHRsZWQuIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgc3VjY2Vzc2Z1bCBjcmVkaXQgc3dlZXAuIGBcXFwicmV0dXJuZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiByZXR1cm5lZC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSByZXR1cm5lZCBzd2VlcC4gUmV0dXJucyBvZiBhIHN3ZWVwIGFyZSBleHRyZW1lbHkgcmFyZSwgc2luY2Ugc3dlZXBzIGFyZSBtb25leSBtb3ZlbWVudCBiZXR3ZWVuIHlvdXIgb3duIGJhbmsgYWNjb3VudCBhbmQgeW91ciBvd24gTGVkZ2VyLiBgXFxcImZ1bmRzX2F2YWlsYWJsZVxcXCJgIC0gRnVuZHMgZnJvbSB0aGUgc3dlZXAgaGF2ZSBiZWVuIHJlbGVhc2VkIGZyb20gaG9sZCBhbmQgYXBwbGllZCB0byB0aGUgbGVkZ2VyXFwncyBhdmFpbGFibGUgYmFsYW5jZS4gKE9ubHkgYXBwbGljYWJsZSB0byBkZXBvc2l0cy4pIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgc3VjY2Vzc2Z1bCBkZXBvc2l0IHN3ZWVwLiBgXFxcImZhaWxlZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBmYWlsZWQuIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgZmFpbGVkIHN3ZWVwLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBGdW5kc0F2YWlsYWJsZSA9ICdmdW5kc19hdmFpbGFibGUnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHRyaWdnZXIgb2YgdGhlIHN3ZWVwICBgXFxcIm1hbnVhbFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIGN1c3RvbWVyIGBcXFwiaW5jb21pbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGluY29taW5nIGZ1bmRzIGZsb3cgKGUuZy4gSW5jb21pbmcgV2lyZSkgYFxcXCJiYWxhbmNlX3RocmVzaG9sZFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgYnkgYmFsYW5jZSB0aHJlc2hvbGQgc2V0dGluZyBgXFxcImF1dG9tYXRpY19hZ2dyZWdhdGVcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IHRoZSBQbGFpZCBhdXRvbWF0aWMgYWdncmVnYXRpb24gcHJvY2Vzcy4gVGhlc2UgZnVuZHMgZGlkIG5vdCBwYXNzIHRocm91Z2ggdGhlIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBUcmlnZ2VyIHtcbiAgICBNYW51YWwgPSAnbWFudWFsJyxcbiAgICBJbmNvbWluZyA9ICdpbmNvbWluZycsXG4gICAgQmFsYW5jZVRocmVzaG9sZCA9ICdiYWxhbmNlX3RocmVzaG9sZCcsXG4gICAgQXV0b21hdGljQWdncmVnYXRlID0gJ2F1dG9tYXRpY19hZ2dyZWdhdGUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgdGhlIG9sZGVyIHdlYmhvb2tzIGBJTklUSUFMX1VQREFURWAsIGBISVNUT1JJQ0FMX1VQREFURWAsIGBERUZBVUxUX1VQREFURWAsIGFuZCBgVFJBTlNBQ1RJT05TX1JFTU9WRURgLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgbmV3IGNoYW5nZXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIGFuIEl0ZW0sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50IGFzIGl0IHdvdWxkIGluIFByb2R1Y3Rpb24uIEl0IGNhbiBhbHNvIGJlIG1hbnVhbGx5IHRyaWdnZXJlZCBpbiBTYW5kYm94IGJ5IGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gKG1vc3QgcmVjZW50IDMwIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIChtYXhpbXVtIHRyYW5zYWN0aW9uIGhpc3RvcnkgcmVxdWVzdGVkLCB1cCB0byAyIHllYXJzKSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiBhIHN5bnRoZXRpYyBmcmF1ZCByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTeW50aGV0aWNGcmF1ZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXRpY0ZyYXVkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBTeW50aGV0aWNGcmF1ZFxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw6IFJpc2tMZXZlbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCBhbiBvZmZpY2lhbCBkb2N1bWVudCB1c2VkIHRvIHJlcG9ydCB0aGUgdXNlclxcJ3MgaW5jb21lIHRvIHRoZSBJUlMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheGZvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhmb3JtIHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgZG9jX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRheCBkb2N1bWVudC4gQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgYHcyYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgZG9jdW1lbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXMn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIHcyPzogVzI7XG59XG4vKipcbiAqIFRheHBheWVyIElEIG9mIHRoZSBpbmRpdmlkdWFsIHJlY2VpdmluZyB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySUQge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgSUQsIGUuZy4gXFwnU1NOXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG1hc2s7IGkuZS4gbGFzdCA0IGRpZ2l0cyBvZiB0aGUgdGF4cGF5ZXIgSURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGFzdCA0IGRpZ2l0cyBvZiB1bmlxdWUgbnVtYmVyIG9mIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxhc3RfNF9kaWdpdHM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgVGF4cGF5ZXIgaWRlbnRpZmljYXRpb24gdmFsdWVzIGFzc2lnbmVkIHRvIHRoZSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyXG4gICAgICovXG4gICAgVGF4cGF5ZXJJZGVudGlmaWVyVHlwZTogVGF4cGF5ZXJJZGVudGlmaWVyVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0YXhwYXllciBpZGVudGlmaWVyIGFzIGFzc2lnbmVkIGJ5IHRoZSBJUlMgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySWRlbnRpZmllclxuICAgICAqL1xuICAgIFRheHBheWVySWRlbnRpZmllclZhbHVlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBjbGFzc2lmaWVzIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgdXNlZCBieSB0aGUgSW50ZXJuYWwgUmV2ZW51ZSBTZXJ2aWNlIChJUlMpIGluIHRoZSBhZG1pbmlzdHJhdGlvbiBvZiB0YXggbGF3cy4gQSBTb2NpYWwgU2VjdXJpdHkgbnVtYmVyIChTU04pIGlzIGlzc3VlZCBieSB0aGUgU1NBOyBhbGwgb3RoZXIgdGF4cGF5ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVycyBhcmUgaXNzdWVkIGJ5IHRoZSBJUlMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUYXhwYXllcklkZW50aWZpZXJUeXBlIHtcbiAgICBJbmRpdmlkdWFsVGF4cGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlciA9ICdJbmRpdmlkdWFsVGF4cGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlcicsXG4gICAgU29jaWFsU2VjdXJpdHlOdW1iZXIgPSAnU29jaWFsU2VjdXJpdHlOdW1iZXInXG59XG5cbi8qKlxuICogVGhlIGNvbGxlY3Rpb24gb2YgYFRBWFBBWUVSX0lERU5USUZJQ0FUSU9OYCBlbGVtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyc1xuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVI6IFRheHBheWVySWRlbnRpZmllcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGEgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRU1QTE9ZRUUgTUVESUNBUkUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTT0NJQUwgU0VDVVJJVFkgRU1QTE9ZRUUgVEFYJyxcbiAgICBNZWRpY2FsID0gJ01FRElDQUwnLFxuICAgIFZpc2lvbiA9ICdWSVNJT04nLFxuICAgIERlbnRhbCA9ICdERU5UQUwnLFxuICAgIE5ldFBheSA9ICdORVQgUEFZJyxcbiAgICBUYXhlcyA9ICdUQVhFUycsXG4gICAgTm90Rm91bmQgPSAnTk9UX0ZPVU5EJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgdGltZSBwZXJpb2Qgb2YgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDMwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDMwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCA2MCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgOTAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgdG90YWwgbW9udGhseSBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxNb250aGx5SW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIGZvciB0aGUgMzAgZGF5cyBwcmlvciB0byBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsTW9udGhseUluY29tZUluc2lnaHRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBiYXNlbGluZV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhZ2dyZWdhdGVkIGluY29tZSBvZiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxNb250aGx5SW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSB0aW1lIHBlcmlvZCBvZiB0aGUgcmVwb3J0LiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgMzAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDMwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDMwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDYwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ2MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCA5MCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50OTBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgcmVwb3J0XFwncyBhY2NvdW50cyBpbiB0aGUgdGltZSBwZXJpb2Qgb2YgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgcmVwb3J0XFwncyBhY2NvdW50cyBpbiB0aGUgbGFzdCAzMCBkYXlzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50MzBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQzMGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSByZXBvcnRcXCdzIGFjY291bnRzIGluIHRoZSBsYXN0IDYwIGRheXMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIHJlcG9ydFxcJ3MgYWNjb3VudHMgaW4gdGhlIGxhc3QgOTAgZGF5cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDkwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50OTBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIHJlcG9ydFxcJ3MgYWNjb3VudHMgaW4gdGhlIHRpbWUgcGVyaW9kIG9mIHRoZSByZXBvcnQuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIHJlcG9ydFxcJ3MgYWNjb3VudHMgaW4gdGhlIGxhc3QgMzAgZGF5cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQzMGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQzMGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgcmVwb3J0XFwncyBhY2NvdW50cyBpbiB0aGUgbGFzdCA2MCBkYXlzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDYwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ2MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSByZXBvcnRcXCdzIGFjY291bnRzIGluIHRoZSBsYXN0IDkwIGRheXMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50OTBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gRm9yIGFsbCBwcm9kdWN0cyBleGNlcHQgSW5jb21lOiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuIEZvciBJbmNvbWUgZW5kcG9pbnRzLCB2YWx1ZXMgYXJlIHBvc2l0aXZlIHdoZW4gcmVwcmVzZW50aW5nIGluY29tZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLiBUbyByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIHRoYXQgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRlYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgTm90ZTogV2hpbGUgUGxhaWQgZG9lcyBub3QgY3VycmVudGx5IHBsYW4gdG8gcmVtb3ZlIHRoaXMgZmllbGQsIGl0IGlzIGEgbGVnYWN5IGZpZWxkIHRoYXQgaXMgbm90IGFjdGl2ZWx5IG1haW50YWluZWQuIFVzZSBgbWVyY2hhbnRfbmFtZWAgaW5zdGVhZCBmb3IgdGhlIG1lcmNoYW50IG5hbWUuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBpZiB0aGUgY2xpZW50IGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE6IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBwcm92aWRlIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLiBBIHN1Yi1hY2NvdW50IG1vc3QgY29tbW9ubHkgZXhpc3RzIGluIGNhc2VzIHdoZXJlIGEgc2luZ2xlIGFjY291bnQgaXMgbGlua2VkIHRvIG11bHRpcGxlIGNhcmRzLCBlYWNoIHdpdGggaXRzIG93biBjYXJkIG51bWJlciBhbmQgY2FyZCBob2xkZXIgbmFtZTsgZWFjaCBjYXJkIHdpbGwgYmUgY29uc2lkZXJlZCBhIHN1Yi1hY2NvdW50LiBJZiB0aGUgYWNjb3VudCBkb2VzIGhhdmUgc3ViLWFjY291bnRzLCB0aGlzIGZpZWxkIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWUgY29tYmluYXRpb24gb2YgdGhlIHN1Yi1hY2NvdW50IG93bmVyXFwncyBuYW1lIGFuZC9vciB0aGUgc3ViLWFjY291bnQgbWFzay4gVGhlIGZvcm1hdCBvZiB0aGlzIGZpZWxkIGlzIG5vdCBzdGFuZGFyZGl6ZWQgYW5kIHdpbGwgdmFyeSBiYXNlZCBvbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgVGhpcyBmaWVsZCByZXBsYWNlcyB0aGUgYHRyYW5zYWN0aW9uX3R5cGVgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGJ1c2luZXNzX2ZpbmFuY2VfY2F0ZWdvcnk/OiBCdXNpbmVzc0ZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuIEluIHRoZSBjYXNlIG9mIGEgbWVyY2hhbnQgd2l0aCBtdWx0aXBsZSByZXRhaWwgbG9jYXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBicm9hZGVyIG1lcmNoYW50LCBub3QgYSBzcGVjaWZpYyBsb2NhdGlvbiBvciBzdG9yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NsaWVudEN1c3RvbWl6YXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2N1c3RvbWl6YXRpb24/OiBDbGllbnRDdXN0b21pemF0aW9uIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRldGltZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRldGltZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRldGltZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgcmF0aGVyIHRoYW4gcG9zdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCBmaWVsZC4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgVGhpcyBmaWVsZCByZXBsYWNlcyB0aGUgYHRyYW5zYWN0aW9uX3R5cGVgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBUcmFuc2FjdGlvbkFsbE9mUGF5bWVudENoYW5uZWxFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYnVzaW5lc3NfZmluYW5jZV9jYXRlZ29yeT86IEJ1c2luZXNzRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY29kZTogVHJhbnNhY3Rpb25Db2RlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGFuIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkuIFRoZSBpY29uIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC4gSW4gdGhlIGNhc2Ugb2YgYSBtZXJjaGFudCB3aXRoIG11bHRpcGxlIHJldGFpbCBsb2NhdGlvbnMsIHRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGJyb2FkZXIgbWVyY2hhbnQsIG5vdCBhIHNwZWNpZmljIGxvY2F0aW9uIG9yIHN0b3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBtZXJjaGFudF9lbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRDdXN0b21pemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgY2xpZW50X2N1c3RvbWl6YXRpb24/OiBDbGllbnRDdXN0b21pemF0aW9uIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkFsbE9mUGF5bWVudENoYW5uZWxFbnVtIHtcbiAgICBPbmxpbmUgPSAnb25saW5lJyxcbiAgICBJblN0b3JlID0gJ2luIHN0b3JlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25CYXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25CYXNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25zXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIEZvciBhbGwgcHJvZHVjdHMgZXhjZXB0IEluY29tZTogUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLiBGb3IgSW5jb21lIGVuZHBvaW50cywgdmFsdWVzIGFyZSBwb3NpdGl2ZSB3aGVuIHJlcHJlc2VudGluZyBpbmNvbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS4gVG8gcmVjZWl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSB0aGF0IGEgcG9zdGVkIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIE5vdGU6IFdoaWxlIFBsYWlkIGRvZXMgbm90IGN1cnJlbnRseSBwbGFuIHRvIHJlbW92ZSB0aGlzIGZpZWxkLCBpdCBpcyBhIGxlZ2FjeSBmaWVsZCB0aGF0IGlzIG5vdCBhY3RpdmVseSBtYWludGFpbmVkLiBVc2UgYG1lcmNoYW50X25hbWVgIGluc3RlYWQgZm9yIHRoZSBtZXJjaGFudCBuYW1lLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgaW5jbHVkZWQgaWYgdGhlIGNsaWVudCBoYXMgc2V0IGBvcHRpb25zLmluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb25gIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE/OiBQYXltZW50TWV0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC4gTm90IGFsbCBpbnN0aXR1dGlvbnMgcHJvdmlkZSBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS4gTm90IGFsbCBpbnN0aXR1dGlvbnMgcHJvdmlkZSBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy4gQSBzdWItYWNjb3VudCBtb3N0IGNvbW1vbmx5IGV4aXN0cyBpbiBjYXNlcyB3aGVyZSBhIHNpbmdsZSBhY2NvdW50IGlzIGxpbmtlZCB0byBtdWx0aXBsZSBjYXJkcywgZWFjaCB3aXRoIGl0cyBvd24gY2FyZCBudW1iZXIgYW5kIGNhcmQgaG9sZGVyIG5hbWU7IGVhY2ggY2FyZCB3aWxsIGJlIGNvbnNpZGVyZWQgYSBzdWItYWNjb3VudC4gSWYgdGhlIGFjY291bnQgZG9lcyBoYXZlIHN1Yi1hY2NvdW50cywgdGhpcyBmaWVsZCB3aWxsIHR5cGljYWxseSBiZSBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWItYWNjb3VudCBvd25lclxcJ3MgbmFtZSBhbmQvb3IgdGhlIHN1Yi1hY2NvdW50IG1hc2suIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWVsZCBpcyBub3Qgc3RhbmRhcmRpemVkIGFuZCB3aWxsIHZhcnkgYmFzZWQgb24gaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQmFzZVRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIEFuIGlkZW50aWZpZXIgY2xhc3NpZnlpbmcgdGhlIHRyYW5zYWN0aW9uIHR5cGUuICBUaGlzIGZpZWxkIGlzIHBvcHVsYXRlZCBmb3IgRXVyb3BlYW4gaW5zdGl0dXRpb25zLCBhcyB3ZWxsIGFzIGNlcnRhaW4gaW5zdGl0dXRpb25zIGluIHRoZSBVbml0ZWQgU3RhdGVzLiBGb3IgaW5zdGl0dXRpb25zIHdoZXJlIHRoaXMgY2xhc3NpZmljYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gYG51bGxgLiAgYGFkanVzdG1lbnQ6YCBCYW5rIGFkanVzdG1lbnQgIGBhdG06YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCB2aWEgYW4gYXV0b21hdGVkIHRlbGxlciBtYWNoaW5lICBgYmFuayBjaGFyZ2U6YCBDaGFyZ2Ugb3IgZmVlIGxldmllZCBieSB0aGUgaW5zdGl0dXRpb24gIGBiaWxsIHBheW1lbnRgOiBQYXltZW50IG9mIGEgYmlsbCAgYGNhc2g6YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCAgYGNhc2hiYWNrOmAgQ2FzaCB3aXRoZHJhd2FsIHdoaWxlIG1ha2luZyBhIGRlYml0IGNhcmQgcHVyY2hhc2UgIGBjaGVxdWU6YCBEb2N1bWVudCBvcmRlcmluZyB0aGUgcGF5bWVudCBvZiBtb25leSB0byBhbm90aGVyIHBlcnNvbiBvciBvcmdhbml6YXRpb24gIGBkaXJlY3QgZGViaXQ6YCBBdXRvbWF0aWMgd2l0aGRyYXdhbCBvZiBmdW5kcyBpbml0aWF0ZWQgYnkgYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGBpbnRlcmVzdDpgIEludGVyZXN0IGVhcm5lZCBvciBpbmN1cnJlZCAgYHBheW1lbnQ6YCBPbmUtb2ZmIG91dGJvdW5kIHBheW1lbnQgbm90IGNsYXNzaWZpZWQgYXMgYSBiaWxsIHBheW1lbnQsIGRpcmVjdCBkZWJpdCwgb3Igc3RhbmRpbmcgb3JkZXIgIGBwdXJjaGFzZTpgIFB1cmNoYXNlIG1hZGUgd2l0aCBhIGRlYml0IG9yIGNyZWRpdCBjYXJkICBgcmVmdW5kOmAgTWVyY2hhbnQgY3JlZGl0IG9yIHJldHVybiwgc3VjaCBhcyBhIHJlZnVuZCBvZiBhIHByaW9yIHB1cmNoYXNlICBgc3RhbmRpbmcgb3JkZXI6YCBQYXltZW50IGluc3RydWN0ZWQgYnkgdGhlIGFjY291bnQgaG9sZGVyIHRvIGEgdGhpcmQgcGFydHkgYXQgYSByZWd1bGFyIGludGVydmFsICBgdHJhbnNmZXI6YCBUcmFuc2ZlciBvZiBtb25leSBiZXR3ZWVuIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkNvZGUge1xuICAgIEFkanVzdG1lbnQgPSAnYWRqdXN0bWVudCcsXG4gICAgQXRtID0gJ2F0bScsXG4gICAgQmFua0NoYXJnZSA9ICdiYW5rIGNoYXJnZScsXG4gICAgQmlsbFBheW1lbnQgPSAnYmlsbCBwYXltZW50JyxcbiAgICBDYXNoID0gJ2Nhc2gnLFxuICAgIENhc2hiYWNrID0gJ2Nhc2hiYWNrJyxcbiAgICBDaGVxdWUgPSAnY2hlcXVlJyxcbiAgICBEaXJlY3REZWJpdCA9ICdkaXJlY3QgZGViaXQnLFxuICAgIEludGVyZXN0ID0gJ2ludGVyZXN0JyxcbiAgICBQYXltZW50ID0gJ3BheW1lbnQnLFxuICAgIFB1cmNoYXNlID0gJ3B1cmNoYXNlJyxcbiAgICBSZWZ1bmQgPSAncmVmdW5kJyxcbiAgICBTdGFuZGluZ09yZGVyID0gJ3N0YW5kaW5nIG9yZGVyJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHR5cGU6IENvdW50ZXJwYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRuXFwndCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvblxcJ3Qga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX2xldmVsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcnM/OiBDb3VudGVycGFydHlOdW1iZXJzIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hdGNoZWQgZGlyZWN0IGRlcG9zaXQgdHJhbnNhY3Rpb24gdXNlZCB0byB2ZXJpZnkgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVuZCB1c2VyXFwncyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSB0byBwb3B1bGF0ZSBhcyB0ZXN0IHRyYW5zYWN0aW9uIGRhdGEuIElmIG5vdCBzcGVjaWZpZWQsIHJhbmRvbSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gVHJhbnNhY3Rpb25zIGluIFNhbmRib3ggd2lsbCBtb3ZlIGZyb20gcGVuZGluZyB0byBwb3N0ZWQgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBkYXRlIGhhcyBiZWVuIHJlYWNoZWQuIElmIGEgYGRhdGVfdHJhbnNhY3RlZGAgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgYSB0cmFuc2FjdGlvbiBkYXRlIG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIFtgYXV0aG9yaXplZF9kYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnMtZ2V0LXJlc3BvbnNlLXRyYW5zYWN0aW9ucy1hdXRob3JpemVkLWRhdGUpIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBQb3N0ZWQgZGF0ZXMgaW4gdGhlIHBhc3Qgb3IgcHJlc2VudCB3aWxsIHJlc3VsdCBpbiBwb3N0ZWQgdHJhbnNhY3Rpb25zOyBwb3N0ZWQgZGF0ZXMgaW4gdGhlIGZ1dHVyZSB3aWxsIHJlc3VsdCBpbiBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZV9wb3N0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LiBDYW4gYmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgZm9ybWF0IGN1cnJlbmN5IGNvZGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgcmVsYXRlZCB0cmFuc2FjdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBzdHJlYW0gYmVsb25nc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdHJlYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YC4gYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHByb3ZpZGVzIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbiBhbmQgZ3JlYXRlciBhY2N1cmFjeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLiBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uIGFuZCBncmVhdGVyIGFjY3VyYWN5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZmlyc3RfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGRhdGUgb2YgdGhlIG5leHQgcGF5bWVudC4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBuZXh0IHBheW1lbnQgZGF0ZSBjYW4gYmUgcHJlZGljdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgcHJlZGljdGVkX25leHRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeTogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgdHJhbnNhY3Rpb24gSURzIGJlbG9uZ2luZyB0byB0aGUgc3RyZWFtLCBzb3J0ZWQgYnkgcG9zdGVkIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudDogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzIHRoZSBhYmlsaXR5IHRvIG1vZGlmeSB0cmFuc2FjdGlvbnMgc3RyZWFtcyBoYXMgYmVlbiBkaXNjb250aW51ZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzX3VzZXJfbW9kaWZpZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIG1vc3QgcmVjZW50IHVzZXIgbW9kaWZpY2F0aW9uLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgaWYgYGlzX3VzZXJfbW9kaWZpZWRgIGlzIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGFzdF91c2VyX21vZGlmaWVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3Qgd2l0aCBkYXRhIHBlcnRhaW5pbmcgdG8gYW4gYW1vdW50IG9uIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiBhbiBhbW91bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBNQVRVUkVgOiBBIGBNQVRVUkVgIHJlY3VycmluZyBzdHJlYW0gc2hvdWxkIGhhdmUgYXQgbGVhc3QgMyB0cmFuc2FjdGlvbnMgYW5kIGhhcHBlbiBvbiBhIHJlZ3VsYXIgY2FkZW5jZSAoRm9yIEFubnVhbCByZWN1cnJpbmcgc3RyZWFtLCB3ZSB3aWxsIG1hcmsgaXQgYE1BVFVSRWAgYWZ0ZXIgMiBpbnN0YW5jZXMpLiAgYEVBUkxZX0RFVEVDVElPTmA6IFdoZW4gYSByZWN1cnJpbmcgdHJhbnNhY3Rpb24gZmlyc3QgYXBwZWFycyBpbiB0aGUgdHJhbnNhY3Rpb24gaGlzdG9yeSBhbmQgYmVmb3JlIGl0IGZ1bGZpbGxzIHRoZSByZXF1aXJlbWVudCBvZiBhIG1hdHVyZSBzdHJlYW0sIHRoZSBzdGF0dXMgd2lsbCBiZSBgRUFSTFlfREVURUNUSU9OYC4gIGBUT01CU1RPTkVEYDogQSBzdHJlYW0gdGhhdCB3YXMgcHJldmlvdXNseSBpbiB0aGUgYEVBUkxZX0RFVEVDVElPTmAgc3RhdHVzIHdpbGwgbW92ZSB0byB0aGUgYFRPTUJTVE9ORURgIHN0YXR1cyB3aGVuIG5vIGZ1cnRoZXIgdHJhbnNhY3Rpb25zIHdlcmUgZm91bmQgYXQgdGhlIG5leHQgZXhwZWN0ZWQgZGF0ZS4gIGBVTktOT1dOYDogQSBzdHJlYW0gaXMgYXNzaWduZWQgYW4gYFVOS05PV05gIHN0YXR1cyB3aGVuIG5vbmUgb2YgdGhlIG90aGVyIHN0YXR1c2VzIGFyZSBhcHBsaWNhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25TdHJlYW1TdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgTWF0dXJlID0gJ01BVFVSRScsXG4gICAgRWFybHlEZXRlY3Rpb24gPSAnRUFSTFlfREVURUNUSU9OJyxcbiAgICBUb21ic3RvbmVkID0gJ1RPTUJTVE9ORUQnXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9ucyBjYXRlZ29yeSBydWxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGUge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJ1bGUgY3JlYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZC1nZW5lcmF0ZWQgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlbmQgdXNlciB0aGlzIHJ1bGUgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHJ1bGUgd2FzIGNyZWF0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHJ1bGUgd2FzIGxhc3QgdXBkYXRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwZXJzb25hbCBmaW5hbmNlIHByaW1hcnkgY2F0ZWdvcnkuIFNlZSB0aGUgW3RheG9ub215IGNzdiBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvcGZjLXRheG9ub215LWFsbC5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIHBmY19wcmltYXJ5X2NhdGVnb3J5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGVyc29uYWwgZmluYW5jZSBkZXRhaWxlZCBjYXRlZ29yeS4gU2VlIHRoZSBbdGF4b25vbXkgY3N2IGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wZmMtdGF4b25vbXktYWxsLmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgcGZjX2RldGFpbGVkX2NhdGVnb3J5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgcnVsZV9kZXRhaWxzPzogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IGZvciB0aGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9ucyAoYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHJhdyB0cmFuc2FjdGlvbnMgdG8gYmUgZW5oYW5jZWQuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZW5oYW5jZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmhhbmNlZF90cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbnMgKGVpdGhlciBgZGVwb3NpdG9yeWAgb3IgYGNyZWRpdGApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbiBvYmplY3RzIHRvIGJlIGVucmljaGVkIGJ5IFBsYWlkLiBNYXhpbXVtIG9mIDEwMCB0cmFuc2FjdGlvbnMgcGVyIHJlcXVlc3QuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYGxlZ2FjeV9jYXRlZ29yeWAgYW5kIGBsZWdhY3lfY2F0ZWdvcnlfaWRgIGluIHRoZSByZXNwb25zZSAoaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgKS4gIENhdGVnb3JpZXMgYXJlIGJhc2VkIG9uIFBsYWlkXFwncyBsZWdhY3kgdGF4b25vbXkuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xlZ2FjeV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ZlcnNpb24/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb247XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZW5yaWNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVucmljaGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnJpY2hlZF90cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbSAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDb3VudGVycGFydGllcyBhbmQgZXh0cmEgbWVyY2hhbnQgZmllbGRzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV92ZXJzaW9uPzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9uO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB3aGVyZSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKGkuZS4gYnkgc3BlY2lmeWluZyBgdHJhbnNhY3Rpb25zYCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIG9yIGJ5IG1ha2luZyBhIHByZXZpb3VzIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCkuIEluIHRob3NlIGNhc2VzLCB0aGUgZmllbGQgY29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0aGF0IFBsYWlkIHdpbGwgcmVxdWVzdCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBtb3JlIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVxdWVzdGVkLCB0aGUgbG9uZ2VyIHRoZSBoaXN0b3JpY2FsIHVwZGF0ZSBwb2xsIHdpbGwgdGFrZS4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCA5MCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQgYnkgZGVmYXVsdC4gSW4gUHJvZHVjdGlvbiwgaWYgYSB2YWx1ZSB1bmRlciAzMCBpcyBwcm92aWRlZCwgYSBtaW5pbXVtIG9mIDMwIGRheXMgb2YgaGlzdG9yeSB3aWxsIGJlIHJlcXVlc3RlZC4gIElmIHlvdSBhcmUgaW5pdGlhbGl6aW5nIHlvdXIgSXRlbXMgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIChlLmcuIGJ5IGluY2x1ZGluZyBgdHJhbnNhY3Rpb25zYCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYHByb2R1Y3RzYCBhcnJheSksIHlvdSBtdXN0IHVzZSB0aGUgW2B0cmFuc2FjdGlvbnMuZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgZmllbGQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIHJlcXVlc3QgaW5zdGVhZCBvZiBpbiB0aGUgYC90cmFuc2FjdGlvbnMvZ2V0YCByZXF1ZXN0LiAgSWYgdGhlIEl0ZW0gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCwgdGhpcyBmaWVsZCB3aWxsIGhhdmUgbm8gZWZmZWN0LiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IG9uIGFuIEl0ZW0gY2Fubm90IGJlIHVwZGF0ZWQgaWYgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0uIFRvIHJlcXVlc3Qgb2xkZXIgdHJhbnNhY3Rpb24gaGlzdG9yeSBvbiBhbiBJdGVtIHdoZXJlIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLCB5b3UgbXVzdCBkZWxldGUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgIGFuZCBzZW5kIHRoZSB1c2VyIHRocm91Z2ggTGluayB0byBjcmVhdGUgYSBuZXcgSXRlbS4gIEN1c3RvbWVycyB1c2luZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHNob3VsZCByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgYGFjY291bnRzYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIHRyYW5zYWN0aW9ucyBhcmUgYmVpbmcgcmV0dXJuZWQuIEVhY2ggdHJhbnNhY3Rpb24gY2FuIGJlIG1hcHBlZCB0byBpdHMgY29ycmVzcG9uZGluZyBhY2NvdW50IHZpYSB0aGUgYGFjY291bnRfaWRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQgZGVmaW5lcyBhIHNpbmdsZSBpbnB1dCB0byB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvY3JlYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dCB7XG4gICAgLyoqXG4gICAgICogSURzIG9mIGFsbCB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgd2lsbCBiZSBtZXJnZWQgaW50byBvbmUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0cyBpbiBhbm90aGVyIHN0cmVhbSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG90aGVyIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IGRlZmluZWQgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCB0aGUgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuIFRoaXMgd2lsbCBlaXRoZXIgYWxsIHN1Y2NlZWQgb3IgYWxsIGZhaWwuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlucHV0czogQXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQ+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBTdHJlYW1zIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZGVkX3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBPdGhlciBzdHJlYW1zIHdpdGggdHJhbnNhY3Rpb25zIHJlbW92ZWQgZnJvbSB0aGVtIGFzIGEgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWRfc3RyZWFtcz86IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWRzIG9mIHN0cmVhbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHF1YWxpZmllZCBhcyByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtcyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZF9zdHJlYW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBSZXRyaWV2ZXMgYWxsIGFjdGl2ZSBhY2NvdW50cyBvbiBpdGVtIGlmIG5vIGBhY2NvdW50X2lkYHMgYXJlIHByb3ZpZGVkLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV92ZXJzaW9uPzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9uO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGRlcG9zaXRvcnkgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZXhwZW5zZSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRyYW5zYWN0aW9uIHN0cmVhbXMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IHdlcmUgdXBkYXRlZCBvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9kYXRldGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV92ZXJzaW9uPzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9uO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIGlucHV0IHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgZmlyc3Qgc3RyZWFtLiBUaGlzIG9wZXJhdGlvbiB3aWxsIHJldGFpbiB0aGUgYHN0cmVhbV9pZGAgb2YgdGhlIGZpcnN0IHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBEaXJlY3RseSBtb2RpZmllZCBzdHJlYW0sIGFsb25nIHdpdGggb3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgb3BlcmF0aW9uIHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy91cGRhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgc3RyZWFtIHRoYXQgYWxsIHRoZSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBhZGRlZCBpbiB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0IGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRyYW5zYWN0aW9uKHMpIGZvciBhbiBJdGVtIGFyZSBkZWxldGVkLiBUaGUgZGVsZXRlZCB0cmFuc2FjdGlvbiBJRHMgYXJlIGluY2x1ZGVkIGluIHRoZSB3ZWJob29rIHBheWxvYWQuIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBkZWxldGVkIHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRyYW5zYWN0aW9ucyBydWxlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRmllbGR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgZmllbGQ6IFRyYW5zYWN0aW9uc1J1bGVGaWVsZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNhY3Rpb25zUnVsZVR5cGU7XG4gICAgLyoqXG4gICAgICogRm9yIGBUUkFOU0FDVElPTl9JRGAgZmllbGQsIHByb3ZpZGUgYHRyYW5zYWN0aW9uX2lkYC4gRm9yIGBOQU1FYCBmaWVsZCwgcHJvdmlkZSBhIHN0cmluZyBwYXR0ZXJuLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGZpZWxkIGZvciB3aGljaCB0aGUgcnVsZSBpcyBkZWZpbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25zUnVsZUZpZWxkIHtcbiAgICBUcmFuc2FjdGlvbklkID0gJ1RSQU5TQUNUSU9OX0lEJyxcbiAgICBNZXJjaGFudE5hbWUgPSAnTUVSQ0hBTlRfTkFNRSdcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBydWxlXFwncyBtYXRjaCB0eXBlLiBGb3IgYFRSQU5TQUNUSU9OX0lEYCBmaWVsZCwgYEVYQUNUX01BVENIYCBpcyBhdmFpbGFibGUuIE1hdGNoZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVUeXBlIHtcbiAgICBFeGFjdE1hdGNoID0gJ0VYQUNUX01BVENIJyxcbiAgICBTdWJzdHJpbmdNYXRjaCA9ICdTVUJTVFJJTkdfTUFUQ0gnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gVGhpcyBJRCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBydWxlcyB3aXRoIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGVyc29uYWwgZmluYW5jZSBwcmltYXJ5IGNhdGVnb3J5LiBTZWUgdGhlIFt0YXhvbm9teSBjc3YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3BmYy10YXhvbm9teS1hbGwuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwZmNfcHJpbWFyeV9jYXRlZ29yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGVyc29uYWwgZmluYW5jZSBkZXRhaWxlZCBjYXRlZ29yeS4gU2VlIHRoZSBbdGF4b25vbXkgY3N2IGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wZmMtdGF4b25vbXktYWxsLmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGZjX2RldGFpbGVkX2NhdGVnb3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1J1bGVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBydWxlX2RldGFpbHM6IFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcnVsZTogVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlciB3aG9zZSBydWxlcyBzaG91bGQgYmUgbGlzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSB1c2VyXFwncyB0cmFuc2FjdGlvbiBydWxlc1xuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGVzOiBBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIgdGhlIHJ1bGUgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcnVsZVxcJ3MgdW5pcXVlIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBydWxlX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnNvciB2YWx1ZSByZXByZXNlbnRzIHRoZSBsYXN0IHVwZGF0ZSByZXF1ZXN0ZWQuIFByb3ZpZGluZyBpdCB3aWxsIGNhdXNlIHRoZSByZXNwb25zZSB0byBvbmx5IHJldHVybiBjaGFuZ2VzIGFmdGVyIHRoaXMgdXBkYXRlLiBJZiBvbWl0dGVkLCB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgdXBkYXRlcyB3aWxsIGJlIHJldHVybmVkLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdC1hZGRlZCB0cmFuc2FjdGlvbnMgb24gdGhlIEl0ZW0uIFRoZSBjdXJzb3IgYWxzbyBhY2NlcHRzIHRoZSBzcGVjaWFsIHZhbHVlIG9mIGBcXFwibm93XFxcImAsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZhc3QtZm9yd2FyZCB0aGUgY3Vyc29yIGFzIHBhcnQgb2YgbWlncmF0aW5nIGFuIGV4aXN0aW5nIEl0ZW0gZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIHN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiBOb3RlIHRoYXQgdXNpbmcgdGhlIGBcXFwibm93XFxcImAgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW55IHVzZSBjYXNlIG90aGVyIHRoYW4gbWlncmF0aW5nIGV4aXN0aW5nIEl0ZW1zIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIFRoZSB1cHBlci1ib3VuZCBsZW5ndGggb2YgdGhpcyBjdXJzb3IgaXMgMjU2IGNoYXJhY3RlcnMgb2YgYmFzZTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9sb2dvX2FuZF9jb3VudGVycGFydHlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV92ZXJzaW9uPzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9uO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB3aGVyZSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKGkuZS4sIGJ5IHNwZWNpZnlpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgb3B0aW9uYWxfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBieSBtYWtpbmcgYSBwcmV2aW91cyBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGApLiBJbiB0aG9zZSBjYXNlcywgdGhlIGZpZWxkIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgOTAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkIGJ5IGRlZmF1bHQuIEluIFByb2R1Y3Rpb24sIGlmIGEgdmFsdWUgbGVzcyB0aGFuIDMwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLiAgSWYgeW91IGFyZSBpbml0aWFsaXppbmcgeW91ciBJdGVtcyB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgKGUuZy4gYnkgaW5jbHVkaW5nIGB0cmFuc2FjdGlvbnNgIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgcHJvZHVjdHNgIGFycmF5KSwgeW91IG11c3QgdXNlIHRoZSBbYHRyYW5zYWN0aW9ucy5kYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBmaWVsZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgcmVxdWVzdCBpbnN0ZWFkIG9mIGluIHRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByZXF1ZXN0LiAgSWYgdGhlIEl0ZW0gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCwgdGhpcyBmaWVsZCB3aWxsIGhhdmUgbm8gZWZmZWN0LiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IG9uIGFuIEl0ZW0gY2Fubm90IGJlIHVwZGF0ZWQgaWYgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0uIFRvIHJlcXVlc3Qgb2xkZXIgdHJhbnNhY3Rpb24gaGlzdG9yeSBvbiBhbiBJdGVtIHdoZXJlIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLCB5b3UgbXVzdCBkZWxldGUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgIGFuZCBzZW5kIHRoZSB1c2VyIHRocm91Z2ggTGluayB0byBjcmVhdGUgYSBuZXcgSXRlbS4gIEN1c3RvbWVycyB1c2luZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHNob3VsZCByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIHJldHVybmVkIHVwZGF0ZXMgYW5kIGN1cnNvciB3aWxsIG9ubHkgcmVmbGVjdCB0aGUgc3BlY2lmaWVkIGFjY291bnRcXCdzIHRyYW5zYWN0aW9ucy4gT21pdHRpbmcgYGFjY291bnRfaWRgIHJldHVybnMgdXBkYXRlcyBmb3IgYWxsIGFjY291bnRzIHVuZGVyIHRoZSBJdGVtLiBOb3RlIHRoYXQgc3BlY2lmeWluZyBhbiBgYWNjb3VudF9pZGAgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHNlcGFyYXRlIGluY3JlbWVudGFsIHVwZGF0ZSBzdHJlYW0gLS0gYW5kIHRoZXJlZm9yZSBhIHNlcGFyYXRlIGN1cnNvciAtLSBmb3IgdGhhdCBhY2NvdW50LiBJZiBtdWx0aXBsZSBhY2NvdW50cyBhcmUgcXVlcmllZCB0aGlzIHdheSwgeW91IHdpbGwgbWFpbnRhaW4gbXVsdGlwbGUgY3Vyc29ycywgb25lIHBlciBgYWNjb3VudF9pZGAuICBJZiB5b3UgZGVjaWRlIHRvIGJlZ2luIGZpbHRlcmluZyBieSBgYWNjb3VudF9pZGAgYWZ0ZXIgdXNpbmcgbm8gYGFjY291bnRfaWRgLCBzdGFydCBmcmVzaCB3aXRoIGEgbnVsbCBjdXJzb3IgYW5kIG1haW50YWluIHNlcGFyYXRlIGAoYWNjb3VudF9pZCwgY3Vyc29yKWAgcGFpcnMgZ29pbmcgZm9yd2FyZC4gRG8gbm90IHJldXNlIGFueSBwcmV2aW91c2x5IHNhdmVkIGN1cnNvcnMsIGFzIHRoaXMgY2FuIGNhdXNlIHBhZ2luYXRpb24gZXJyb3JzIG9yIGluY29tcGxldGUgZGF0YS4gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVfc3RhdHVzOiBUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudHMgYXQgYSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbnMgaW4gdGhpcyByZXNwb25zZS4gT25seSBhY2NvdW50cyB0aGF0IGhhdmUgYXNzb2NpYXRlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBzaG93bi4gRm9yIGV4YW1wbGUsIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIHdpbGwgYmUgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb24gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGFueSBmdXR1cmUgdXBkYXRlcyBhZnRlciB0aGUgbGF0ZXN0IHVwZGF0ZSBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlLiBUaGUgY3Vyc29yIG9idGFpbmVkIGFmdGVyIGFsbCBwYWdlcyBoYXZlIGJlZW4gcHVsbGVkIChpbmRpY2F0ZWQgYnkgYGhhc19tb3JlYCBiZWluZyBgZmFsc2VgKSB3aWxsIGJlIHZhbGlkIGZvciBhdCBsZWFzdCAxIHllYXIuIFRoaXMgY3Vyc29yIHNob3VsZCBiZSBwZXJzaXN0ZWQgZm9yIGxhdGVyIGNhbGxzLiBJZiB0cmFuc2FjdGlvbnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLiAgSWYgYGFjY291bnRfaWRgIGlzIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0LCB0aGUgcmV0dXJuZWQgY3Vyc29yIHdpbGwgcmVmbGVjdCB1cGRhdGVzIGZvciB0aGF0IHNwZWNpZmljIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGlmIG1vcmUgdGhhbiByZXF1ZXN0ZWQgY291bnQgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyBleGlzdC4gSWYgdHJ1ZSwgdGhlIGFkZGl0aW9uYWwgdXBkYXRlcyBjYW4gYmUgZmV0Y2hlZCBieSBtYWtpbmcgYW4gYWRkaXRpb25hbCByZXF1ZXN0IHdpdGggYGN1cnNvcmAgc2V0IHRvIGBuZXh0X2N1cnNvcmAuIElmIGBoYXNfbW9yZWAgaXMgdHJ1ZSwgaXRcXCdzIGltcG9ydGFudCB0byBwdWxsIGFsbCBhdmFpbGFibGUgcGFnZXMsIHRvIG1ha2UgaXQgbGVzcyBsaWtlbHkgZm9yIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VzIHRvIGNvbmZsaWN0IHdpdGggcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgdXBkYXRlIHN0YXR1cyBmb3IgdHJhbnNhY3Rpb24gcHVsbHMgb2YgYW4gSXRlbS4gVGhpcyBmaWVsZCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0cmFuc2FjdGlvbnMgd2ViaG9va3MsIGFuZCBtYXkgYmUgaGVscGZ1bCBmb3Igd2ViaG9vayB0cm91Ymxlc2hvb3Rpbmcgb3Igd2hlbiByZWNvdmVyaW5nIGZyb20gbWlzc2VkIHdlYmhvb2tzLiAgYFRSQU5TQUNUSU9OU19VUERBVEVfU1RBVFVTX1VOS05PV05gOiBVbmFibGUgdG8gZmV0Y2ggdHJhbnNhY3Rpb25zIHVwZGF0ZSBzdGF0dXMgZm9yIEl0ZW0uIGBOT1RfUkVBRFlgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIHRyYW5zYWN0aW9uIHB1bGwuIGBJTklUSUFMX1VQREFURV9DT01QTEVURWA6IEluaXRpYWwgcHVsbCBmb3IgdGhlIEl0ZW0gaXMgY29tcGxldGUsIGhpc3RvcmljYWwgcHVsbCBpcyBwZW5kaW5nLiBgSElTVE9SSUNBTF9VUERBVEVfQ09NUExFVEVgOiBCb3RoIGluaXRpYWwgYW5kIGhpc3RvcmljYWwgcHVsbCBmb3IgSXRlbSBhcmUgY29tcGxldGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXMge1xuICAgIFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1c1Vua25vd24gPSAnVFJBTlNBQ1RJT05TX1VQREFURV9TVEFUVVNfVU5LTk9XTicsXG4gICAgTm90UmVhZHkgPSAnTk9UX1JFQURZJyxcbiAgICBJbml0aWFsVXBkYXRlQ29tcGxldGUgPSAnSU5JVElBTF9VUERBVEVfQ09NUExFVEUnLFxuICAgIEhpc3RvcmljYWxVcGRhdGVDb21wbGV0ZSA9ICdISVNUT1JJQ0FMX1VQREFURV9DT01QTEVURSdcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBjbGllbnQtcHJvdmlkZWQgYGNsaWVudF91c2VyX2lkYCB0byByZXRyaWV2ZSBpbnNpZ2h0cyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyRGF0YU92ZXJ2aWV3fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXJfZGF0YV9vdmVydmlldzogVXNlckRhdGFPdmVydmlldztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRlcnBhcnR5X2luc2lnaHRzPzogQ291bnRlcnBhcnR5SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdGVnb3J5SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaW5zaWdodHM/OiBDYXRlZ29yeUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zYWN0aW9ucz86IFJlY3VycmluZ1RyYW5zYWN0aW9ucztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGFzc29jaWF0ZWQgZnVuZGluZyBhY2NvdW50LCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgcHJlc2VudCwgdGhpcyBpbmRpY2F0ZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIFBsYWlkIExlZGdlciBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN3ZWVwX3N0YXR1cz86IFRyYW5zZmVyU3dlZXBTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlcldpcmVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHdpcmVfZGV0YWlscz86IFRyYW5zZmVyV2lyZURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB5b3UgY2FuIHN0aWxsIGNhbmNlbCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGNhbmNlbGxhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyR3VhcmFudGVlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGV0YWlscz86IFRyYW5zZmVyR3VhcmFudGVlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgMyBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjAxLCBSMDIsIFIwMywgUjI5LiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YW5kYXJkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgNjEgYnVzaW5lc3MgZGF5cyBmcm9tIHNldHRsZW1lbnQgZGF0ZSBpbmRpY2F0aW5nIHRoZSBmb2xsb3dpbmcgQUNIIHJldHVybnMgY2FuIG5vIGxvbmdlciBoYXBwZW46IFIwNSwgUjA3LCBSMTAsIFIxMSwgUjUxLCBSMzMsIFIzNywgUjM4LCBSNTEsIFI1MiwgUjUzLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF9yZXR1cm5fd2luZG93OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgZm9yIFBsYWlkIExlZGdlciBjbGllbnRzLCB1c2UgYGV4cGVjdGVkX2Z1bmRzX2F2YWlsYWJsZV9kYXRlYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgd2hlbiBmdW5kcyBmcm9tIGEgdHJhbnNmZXIgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhc3NvY2lhdGVkIGxlZGdlciBiYWxhbmNlLCBhc3N1bWluZyB0aGUgZGViaXQgZG9lcyBub3QgcmV0dXJuIGJlZm9yZSB0aGlzIGRhdGUuIElmIHRoZSB0cmFuc2ZlciBkb2VzIHJldHVybiBiZWZvcmUgdGhpcyBkYXRlLCB0aGlzIGZpZWxkIHdpbGwgYmUgbnVsbC4gT25seSBhcHBsaWVzIHRvIGRlYml0IHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9mdW5kc19hdmFpbGFibGVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybVxcJ3MgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXJcXCdzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgdmFsdWUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYHRyYW5zZmVyLmFtb3VudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWNpbGl0YXRvcl9mZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIEFDSCBuZXR3b3JrcyB1c2VkIGZvciB0aGUgZnVuZHMgZmxvdy4gIEZvciByZXF1ZXN0cyBzdWJtaXR0ZWQgYXMgZWl0aGVyIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRoZSBjdXRvZmYgZm9yIFNhbWUgRGF5IEFDSCBpcyAzOjAwIFBNIEVhc3Rlcm4gVGltZSBhbmQgdGhlIGN1dG9mZiBmb3IgU3RhbmRhcmQgQUNIIHRyYW5zZmVycyBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc3VibWl0IGEgcmVxdWVzdCBhdCBsZWFzdCAxNSBtaW51dGVzIGJlZm9yZSB0aGUgY3V0b2ZmIHRpbWUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBjdXRvZmYuIEFueSByZXF1ZXN0IHRoYXQgaXMgaW5kaWNhdGVkIGFzIGBzYW1lLWRheS1hY2hgIGFuZCB0aGF0IG1pc3NlcyB0aGUgU2FtZSBEYXkgQUNIIGN1dG9mZiwgYnV0IGlzIHN1Ym1pdHRlZCBpbiB0aW1lIGZvciB0aGUgU3RhbmRhcmQgQUNIIGN1dG9mZiwgd2lsbCBiZSBzZW50IG92ZXIgU3RhbmRhcmQgQUNIIHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBQ0hOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCdcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBmb3IgYSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSByZXByZXNlbnRpbmcgd2hlbiB0aGUgYXV0aG9yaXphdGlvbiB3YXMgY3JlYXRlZCwgaW4gdGhlIGZvcm1hdCBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhvcml6YXRpb25HdWFyYW50ZWVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGV0YWlscz86IEF1dGhvcml6YXRpb25HdWFyYW50ZWVEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2t9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrOiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIHByb3Bvc2VkX3RyYW5zZmVyOiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYWNjb3VudCB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBTaG91bGQgYmUgc3BlY2lmaWVkIGlmIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMgb25seS4gSWYgdXNpbmcgUGxhaWQgTGVkZ2VyLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayBhbmQgeW91IGFyZSB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuIE90aGVyd2lzZSwgUGxhaWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGxlZGdlciBiYWxhbmNlIHNob3VsZCBiZSB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBZb3UgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXF1aXJlZCBpZiBub3QgdXNpbmcgYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX2RldGFpbHM/OiBUcmFuc2ZlcldpcmVEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIGF1dGhvcml6YXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBhdXRob3JpemF0aW9uLCB3aGljaCBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGFuIGF1dGhvcml6YXRpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0aG9yaXphdGlvbiBpcyBjcmVhdGVkLiAgSWRlbXBvdGVuY3kgZG9lcyBub3QgYXBwbHkgdG8gYXV0aG9yaXphdGlvbnMgd2hvc2UgZGVjaXNpb25zIGFyZSBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLiBUaGVyZWZvcmUgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uIGFmdGVyIGNvbXBsZXRpbmcgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYGlkZW1wb3RlbmN5X2tleWAuICBUaGlzIGlkZW1wb3RlbmN5IGtleSBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLCBhZnRlciB3aGljaCB0aGUgc2FtZSBrZXkgY2FuIGJlIHJldXNlZC4gRmFpbHVyZSB0byBwcm92aWRlIHRoaXMga2V5IG1heSByZXN1bHQgaW4gZHVwbGljYXRlIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLiBUaGlzIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgaXMgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgUGxhaWQgd2lsbCBub3Qgb2ZmZXIgYSBgZ3VhcmFudGVlX2RlY2lzaW9uYCBmb3IgdGhpcyByZXF1ZXN0IChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3IgZm9yIGBndWFyYW50ZWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB3aXRoX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2ZlciBzaG91bGQgYmUgZXZhbHVhdGVkIGZvciBndWFyYW50ZWUgY292ZXJhZ2UuIFdoZW4gc2V0IHRvIGB0cnVlYCwgUGxhaWQgYXNzZXNzZXMgdGhlIHRyYW5zZmVyIGZvciBndWFyYW50ZWUgY292ZXJhZ2UgYW5kIHJldHVybnMgYSBkZWNpc2lvbiBpbiB0aGUgYXV0aG9yaXphdGlvbiByZXNwb25zZS4gV2hlbiBvbWl0dGVkIG9yIHNldCB0byBgZmFsc2VgLCB0aGUgYXV0aG9yaXphdGlvbiBpcyBldmFsdWF0ZWQgd2l0aG91dCBndWFyYW50ZWUgY292ZXJhZ2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1ZXN0X2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBieSBQbGFpZFxcJ3MgW2JlYWNvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9ndWFyYW50ZWUvI3VzaW5nLWEtYmVhY29uKSB3aGVuIGl0IGlzIHJ1biBvbiB5b3VyIHdlYnBhZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9zZXNzaW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhpcyB0cmFuc2Zlci4gT25seSBuZWVkZWQgaWYgY3JlYXRpbmcgdHJhbnNmZXJzIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVkaXRfZnVuZHNfc291cmNlPzogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdXNpbmcgYHNhbmRib3hgIGVudmlyb25tZW50LiBJZiBwcm92aWRlZCwgdGhlIGBhdXRob3JpemF0aW9uYCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgdGVzdCBjbG9jay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgUnVsZXNldCBmb3IgdGhlIHRyYW5zYWN0aW9uLiBJZiBub3QgcHJvdmlkZWQsIFNpZ25hbCB3aWxsIHVzZSB0aGUgYGRlZmF1bHRgIHJ1bGVzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGZyZWUtZm9ybSBtYXAgb2YgY2xpZW50LXN1cHBsaWVkIHJpc2stcmVsZXZhbnQgY29udGV4dCBmb3IgdGhpcyBhdXRob3JpemF0aW9uLiBQbGFpZCBtYXkgdXNlIHRoZXNlIGF0dHJpYnV0ZXMgdG8gaW5mb3JtIGZ1dHVyZSB2ZXJzaW9ucyBvZiBvdXIgcmlzayBtb2RlbHMuICBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBLZXlzIG11c3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBgXltBLVphLXowLTlfLi1dezEsNDB9JGAgVmFsdWVzIG11c3QgYmUgc3RyaW5ncyAobm8gbmVzdGVkIG9iamVjdHMsIGFycmF5cywgbnVtYmVycywgb3IgYm9vbGVhbnMgYWxsb3dlZDsgc3RyaW5naWZ5IG5vbi1zdHJpbmcgdmFsdWVzIGNsaWVudC1zaWRlKSBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyAgRG8gbm90IGluY2x1ZGUgcGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24gb3Igb3RoZXIgc2Vuc2l0aXZlIGRhdGEuIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV9hdHRyaWJ1dGVzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogIEEgZGVjaXNpb24gcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci4gIGBhcHByb3ZlZGAgLSBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBkZWNsaW5lZGAgLSBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAgLSBBbiBhY3Rpb24gaXMgcmVxdWlyZWQgYmVmb3JlIFBsYWlkIGNhbiBhc3Nlc3MgdGhlIHRyYW5zZmVyIHJpc2sgYW5kIG1ha2UgYSBkZWNpc2lvbi4gVGhlIG1vc3QgY29tbW9uIHNjZW5hcmlvIGlzIHRvIHVwZGF0ZSBhdXRoZW50aWNhdGlvbiBmb3IgYW4gSXRlbS4gVG8gY29tcGxldGUgdGhlIHJlcXVpcmVkIGFjdGlvbiwgaW5pdGlhbGl6ZSBMaW5rIGJ5IHNldHRpbmcgYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgIGluIHRoZSByZXF1ZXN0IG9mIGAvbGluay90b2tlbi9jcmVhdGVgLiBBZnRlciBMaW5rIGZsb3cgaXMgY29tcGxldGVkLCB5b3UgbWF5IHJlLWF0dGVtcHQgdGhlIGF1dGhvcml6YXRpb24gcmVxdWVzdC4gIEZvciBgZ3VhcmFudGVlYCByZXF1ZXN0cywgYGFwcHJvdmVkYCBpbmRpY2F0ZXMgdGhlIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBQbGFpZFxcJ3MgZ3VhcmFudGVlLCBhbmQgYGRlY2xpbmVkYCBpbmRpY2F0ZXMgUGxhaWQgd2lsbCBub3QgcHJvdmlkZSBndWFyYW50ZWUgY292ZXJhZ2UgZm9yIHRoZSB0cmFuc2Zlci4gYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCBpbmRpY2F0ZXMgeW91IHNob3VsZCBmb2xsb3cgdGhlIGFib3ZlIGd1aWRhbmNlIGJlZm9yZSByZS1hdHRlbXB0aW5nLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZWNsaW5lZCA9ICdkZWNsaW5lZCcsXG4gICAgVXNlckFjdGlvblJlcXVpcmVkID0gJ3VzZXJfYWN0aW9uX3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIFRoZSByYXRpb25hbGUgZm9yIFBsYWlkXFwncyBkZWNpc2lvbiByZWdhcmRpbmcgYSBwcm9wb3NlZCB0cmFuc2Zlci4gSXQgaXMgYWx3YXlzIHNldCBmb3IgYGRlY2xpbmVkYCBkZWNpc2lvbnMsIGFuZCBtYXkgb3IgbWF5IG5vdCBiZSBudWxsIGZvciBgYXBwcm92ZWRgIGRlY2lzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBjb2RlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2ZlciBhcHByb3ZhbCBvciB0cmFuc2ZlciBkZWNsaW5lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cbi8qKlxuICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmF0aW9uYWxlIGZvciBhcHByb3Zpbmcgb3IgZGVjbGluaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci4gIElmIHRoZSBgcmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIHBhc3NlZCB0aGUgYXV0aG9yaXphdGlvbiBjaGVjay4gIEFueSBub24tYG51bGxgIHZhbHVlIGZvciBhbiBgYXBwcm92ZWRgIHRyYW5zZmVyIGluZGljYXRlcyB0aGF0IHRoZSBhdXRob3JpemF0aW9uIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4gYW5kIHRoYXQgeW91IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgYXNzZXNzbWVudCBvbiB0aGUgdHJhbnNmZXIuIFRoZSBjb2RlIHdpbGwgaW5kaWNhdGUgd2h5IHRoZSBjaGVjayBjb3VsZCBub3QgYmUgcnVuLiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgYXJlOiAgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gIC0gSXRlbSBjcmVhdGVkIHZpYSBhIG1hbnVhbCBlbnRyeSBmbG93IChpLmUuIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXQsIEluc3RhbnQgTWljcm8tZGVwb3NpdCwgb3IgZGF0YWJhc2UtYmFzZWQgdmVyaWZpY2F0aW9uKSwgbGltaXRlZCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuICBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgLSBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiBkdWUgdG8gSXRlbSBzdGFsZW5lc3MuIENhbiBiZSByZXNvbHZlZCBieSB1c2luZyBMaW5rIGFuZCBzZXR0aW5nIFtgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNmZXItYXV0aG9yaXphdGlvbi1pZCkgaW4gdGhlIHJlcXVlc3QgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuICBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYCAtIFRoZSBQYXltZW50IFByb2ZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsIHRvIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGlzIGluIGEgc3RhdGUgdGhhdCByZXF1aXJlcyB0aGUgZW5kIHVzZXIgdG8gcmUtYXV0aGVudGljYXRlLiBDYW4gYmUgcmVzb2x2ZWQgYnkgdXNpbmcgTGluayB0byByZWZyZXNoIHRoZSBQYXltZW50IFByb2ZpbGUuICBgTUlHUkFURURfQUNDT1VOVF9JVEVNYCAtIEl0ZW0gY3JlYXRlZCB2aWEgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50LCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBFUlJPUmAgLSBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiBkdWUgdG8gYW4gdW5zcGVjaWZpZWQgZXJyb3IuICBUaGUgZm9sbG93aW5nIGNvZGVzIGluZGljYXRlIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gd2FzIGBkZWNsaW5lZGA6ICBgTlNGYCAtIFRyYW5zYWN0aW9uIGxpa2VseSB0byByZXN1bHQgaW4gYSByZXR1cm4gZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBSSVNLYCAtIFRyYW5zYWN0aW9uIGlzIGhpZ2gtcmlzay4gIGBUUkFOU0ZFUl9MSU1JVF9SRUFDSEVEYCAtIE9uZSBvciBzZXZlcmFsIHRyYW5zZmVyIGxpbWl0cyBhcmUgcmVhY2hlZCwgZS5nLiBtb250aGx5IHRyYW5zZmVyIGxpbWl0LiBDaGVjayB0aGUgYWNjb21wYW55aW5nIGBkZXNjcmlwdGlvbmAgZmllbGQgdG8gdW5kZXJzdGFuZCB3aGljaCBsaW1pdCBoYXMgYmVlbiByZWFjaGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlIHtcbiAgICBOc2YgPSAnTlNGJyxcbiAgICBSaXNrID0gJ1JJU0snLFxuICAgIFRyYW5zZmVyTGltaXRSZWFjaGVkID0gJ1RSQU5TRkVSX0xJTUlUX1JFQUNIRUQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWRJdGVtID0gJ01BTlVBTExZX1ZFUklGSUVEX0lURU0nLFxuICAgIEl0ZW1Mb2dpblJlcXVpcmVkID0gJ0lURU1fTE9HSU5fUkVRVUlSRUQnLFxuICAgIFBheW1lbnRQcm9maWxlTG9naW5SZXF1aXJlZCA9ICdQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRUQnLFxuICAgIEVycm9yID0gJ0VSUk9SJyxcbiAgICBNaWdyYXRlZEFjY291bnRJdGVtID0gJ01JR1JBVEVEX0FDQ09VTlRfSVRFTScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi4gVGhlc2UgZmllbGRzIGFyZSBub3QgY3VycmVudGx5IGluY29ycG9yYXRlZCBpbnRvIHRoZSByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAgICAgKi9cbiAgICB1c2VyX2FnZW50Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNmZXIgaXMgZ3VhcmFudGVlZCBieSBQbGFpZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS4gVGhpcyBmaWVsZCB3aWxsIGNvbnRhaW4gZWl0aGVyIGBHVUFSQU5URUVEYCBvciBgTk9UX0dVQVJBTlRFRURgIGluZGljYXRpbmcgd2hldGhlciBQbGFpZCB3aWxsIGd1YXJhbnRlZSB0aGUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB7XG4gICAgR3VhcmFudGVlZCA9ICdHVUFSQU5URUVEJyxcbiAgICBOb3RHdWFyYW50ZWVkID0gJ05PVF9HVUFSQU5URUVEJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHRvIG5vdCBndWFyYW50ZWUgYSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBndWFyYW50ZWVfZGVjaXNpb25gIGlzIGBOT1RfR1VBUkFOVEVFRGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgY29kZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSB0cmFuc2ZlciBjYW5ub3QgYmUgZ3VhcmFudGVlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiBQbGFpZCBkZWNsaW5lZCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2ZlcjogIGBSRVRVUk5fQkFOS2A6IFRoZSByaXNrIG9mIGEgYmFuay1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYW4gUjAxL05TRikgaXMgdG9vIGhpZ2ggdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXIuICBgUkVUVVJOX0NVU1RPTUVSYDogVGhlIHJpc2sgb2YgYSBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYSBSMTAvVW5hdXRob3JpemVkKSBpcyB0b28gaGlnaCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2Zlci4gIGBHVUFSQU5URUVfTElNSVRfUkVBQ0hFRGA6IFRoaXMgdHJhbnNmZXIgaXMgbG93LXJpc2ssIGJ1dCBHdWFyYW50ZWUgaGFzIGV4aGF1c3RlZCBhbiBpbnRlcm5hbCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9yIHJhdGUgb2YgZ3VhcmFudGVlcyB0aGF0IGFwcGxpZXMgdG8gdGhpcyB0cmFuc2Zlci4gIGBSSVNLX0VTVElNQVRFX1VOQVZBSUxBQkxFYDogQSByaXNrIGVzdGltYXRlIGlzIHVuYXZhaWxhYmxlIGZvciB0aGlzIEl0ZW0uICBgUkVRVUlSRURfUEFSQU1fTUlTU0lOR2A6IFJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZSB7XG4gICAgUmV0dXJuQmFuayA9ICdSRVRVUk5fQkFOSycsXG4gICAgUmV0dXJuQ3VzdG9tZXIgPSAnUkVUVVJOX0NVU1RPTUVSJyxcbiAgICBHdWFyYW50ZWVMaW1pdFJlYWNoZWQgPSAnR1VBUkFOVEVFX0xJTUlUX1JFQUNIRUQnLFxuICAgIFJpc2tFc3RpbWF0ZVVuYXZhaWxhYmxlID0gJ1JJU0tfRVNUSU1BVEVfVU5BVkFJTEFCTEUnLFxuICAgIFJlcXVpcmVkUGFyYW1NaXNzaW5nID0gJ1JFUVVJUkVEX1BBUkFNX01JU1NJTkcnXG59XG5cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgdGhlIHNjb3JlcyBhbmQgcmlzayBsZXZlbC4gVGhpcyByZXNwb25zZSBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYC4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhlc2UgZmllbGRzLCBwbGVhc2UgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLiAgVGhlIHNjb3JlIGV2YWx1YXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgYmVjYXVzZSBhbiBhY2NvdW50IGlzIG92ZXJkcmF3biBvciBiZWNhdXNlIGFuIGluZWxpZ2libGUgYWNjb3VudCBpcyB1c2VkIGFuZCBjb3ZlcnMgcmV0dXJuIGNvZGVzOiBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCAgXFxcIlIwOVxcXCIsIFxcXCJSMTNcXFwiLCBcXFwiUjE2XFxcIiwgXFxcIlIxN1xcXCIsIFxcXCJSMjBcXFwiLCBcXFwiUjIzXFxcIi4gVGhlc2UgcmV0dXJucyBoYXZlIGEgdHVybmFyb3VuZCB0aW1lIG9mIDIgYmFua2luZyBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Njb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC4gIFRoZSBzY29yZSBldmFsdWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIG9mIGFuIHVuYXV0aG9yaXplZCBkZWJpdCBhbmQgY292ZXJzIHJldHVybiBjb2RlczogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCwgdGhpcyBhcnJheSBjb250YWlucyB3YXJuaW5ncyBkZXNjcmliaW5nIHdoeSBiYW5rIGRhdGEgaXMgbWlzc2luZy4gSWYgeW91IHdhbnQgdG8gcmVjZWl2ZSBhbiBBUEkgZXJyb3IgaW5zdGVhZCBvZiBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9yaWdpbmFsbHkgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgd2hlbiBjcmVhdGluZyB0aGUgYXV0aG9yaXphdGlvbiAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCI4MDAuMDBcXFwiKS4gVGhpcyBtYXkgZGlmZmVyIGZyb20gYGFtb3VudGAsIHRoZSBhbW91bnQgUGxhaWQgcHJvcG9zZXMgdG8gdHJhbnNmZXIsIHdoZW4gb25seSBhIHBhcnRpYWwgYW1vdW50IGlzIG9mZmVyZWQgYXMgcGFydCBvZiBhbiBBZGFwdGl2ZSBHdWFyYW50ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlcXVlc3RlZF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJXaXJlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHdpcmVfZGV0YWlscz86IFRyYW5zZmVyV2lyZURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IHByZXNlbnQgaWYgY3JlYXRlZCBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVkaXRfZnVuZHNfc291cmNlOiBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlO1xufVxuLyoqXG4gKiBDb21wcmlzZXMgZml2ZSByaXNrIGNhdGVnb3JpZXMgKGhpZ2ggcmlzaywgbWVkaXVtLWhpZ2ggcmlzaywgbWVkaXVtIHJpc2ssIG1lZGl1bS1sb3cgcmlzaywgbG93IHJpc2spIGJhc2VkIG9uIHRoZSBwcm9iYWJpbGl0eSBvZiByZXR1cm5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbCB7XG4gICAgSGlnaFJpc2sgPSAnSElHSF9SSVNLJyxcbiAgICBNZWRpdW1IaWdoUmlzayA9ICdNRURJVU1fSElHSF9SSVNLJyxcbiAgICBNZWRpdW1SaXNrID0gJ01FRElVTV9SSVNLJyxcbiAgICBNZWRpdW1Mb3dSaXNrID0gJ01FRElVTV9MT1dfUklTSycsXG4gICAgTG93UmlzayA9ICdMT1dfUklTSydcbn1cblxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci4gIElmIHRoZSBhY2NvdW50IGhhcyBtdWx0aXBsZSBhY2NvdW50IGhvbGRlcnMsIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIgb24gd2hvc2UgYmVoYWxmIHRoZSBhdXRob3JpemF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhlIGB1c2VyLmxlZ2FsX25hbWVgIGZpZWxkIGlzIHJlcXVpcmVkLiBPdGhlciBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgYXJlIHByZXNlbnQgdG8gc3VwcG9ydCBwbGFubmVkIGZ1dHVyZSBmdW5jdGlvbmFsaXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuIElmIHRoZSB1c2VyIGlzIGEgYnVzaW5lc3MsIHByb3ZpZGUgdGhlIGJ1c2luZXNzIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2YWlsYWJsZSBiYWxhbmNlLCBwbHVzIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJCYWxhbmNlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU/OiBUcmFuc2ZlckJhbGFuY2VUeXBlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFsYW5jZS4gIGBwcmVmdW5kZWRfcnRwX2NyZWRpdHNgIC0gWW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJCYWxhbmNlVHlwZSB7XG4gICAgUnRwQ3JlZGl0cyA9ICdwcmVmdW5kZWRfcnRwX2NyZWRpdHMnLFxuICAgIEFjaENyZWRpdHMgPSAncHJlZnVuZGVkX2FjaF9jcmVkaXRzJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlYXNvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlPzogUmVhc29uQ29kZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyB0aGUgc3VwcG9ydGVkIHNlcnZpY2UgdHlwZXMgaW4gUlRQXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFAge1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgbGlua2VkIEl0ZW1cXCdzIGluc3RpdHV0aW9uIHN1cHBvcnRzIFJUUCBjcmVkaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQXG4gICAgICovXG4gICAgY3JlZGl0PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSBkYXRhIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3N1cHBvcnRlZF9uZXR3b3JrczogSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3JrcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN1cHBvcnRlZCBzZXJ2aWNlIHR5cGVzIGluIFJmUFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbiBzdXBwb3J0cyBSZlAgZGViaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQXG4gICAgICovXG4gICAgZGViaXQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGFtb3VudCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpIGZvciBvcmlnaW5hdGluZyBSZlAgdHJhbnNmZXJzIHdpdGggdGhlIGdpdmVuIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQXG4gICAgICovXG4gICAgbWF4X2Ftb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBgbWF4X2Ftb3VudGAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZlBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIGNyZWRpdCB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIGRlYml0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfZGFpbHlfY3JlZGl0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9kZWJpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBhbmQgZGViaXQgdHJhbnNmZXJzIGluIG9uZSBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9kZWJpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBgYXV0aG9yaXphdGlvbl9pZGAgaXMgbm93IHVzZWQgYXMgaWRlbXBvdGVuY3kgaW5zdGVhZC4gIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgdHJhbnNmZXIgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIFRoaXMgcGFyYW1ldGVyIGFsc28gc2VydmVzIHRoZSBwdXJwb3NlIG9mIGFjdGluZyBhcyBhbiBpZGVtcG90ZW5jeSBpZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHR5cGU/OiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbiwgbWF4aW11bSBvZiAxNSBjaGFyYWN0ZXJzIChSVFAgdHJhbnNhY3Rpb25zKSBvciAxMCBjaGFyYWN0ZXJzIChBQ0ggdHJhbnNhY3Rpb25zKS4gU2hvdWxkIHJlcHJlc2VudCB3aHkgdGhlIG1vbmV5IGlzIG1vdmluZywgbm90IHlvdXIgY29tcGFueSBuYW1lLiBGb3IgcmVjb21tZW5kYXRpb25zIG9uIHNldHRpbmcgdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQgdG8gYXZvaWQgQUNIIHJldHVybnMsIHNlZSBbRGVzY3JpcHRpb24gZmllbGQgcmVjb21tZW5kYXRpb25zXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9jcmVhdGluZy10cmFuc2ZlcnMvI2Rlc2NyaXB0aW9uLWZpZWxkLXJlY29tbWVuZGF0aW9ucykuICBJZiByZXByb2Nlc3NpbmcgYSByZXR1cm5lZCB0cmFuc2ZlciwgdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQgbXVzdCBiZSBgXFxcIlJldHJ5IDFcXFwiYCBvciBgXFxcIlJldHJ5IDJcXFwiYC4gWW91IG1heSByZXRyeSBhIHRyYW5zZmVyIHVwIHRvIDIgdGltZXMsIHdpdGhpbiAxODAgZGF5cyBvZiBjcmVhdGluZyB0aGUgb3JpZ2luYWwgdHJhbnNmZXIuIE9ubHkgdHJhbnNmZXJzIHRoYXQgd2VyZSByZXR1cm5lZCB3aXRoIGNvZGUgYFIwMWAgb3IgYFIwOWAgbWF5IGJlIHJldHJpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdXNlcj86IFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyB0cmFuc2Zlci4gSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBvcmlnaW5hdGlvbiBhY2NvdW50LCB0aGlzIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLiBPdGhlcndpc2UsIHRoaXMgZmllbGQgc2hvdWxkIGJlIGxlZnQgYmxhbmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdXNpbmcgYHNhbmRib3hgIGVudmlyb25tZW50LiBJZiBwcm92aWRlZCwgdGhlIGB0cmFuc2ZlcmAgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIGB0ZXN0X2Nsb2NrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybVxcJ3MgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXJcXCdzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgdmFsdWUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYHRyYW5zZmVyLmFtb3VudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFjaWxpdGF0b3JfZmVlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIG5vdyBkZXByZWNhdGVkLiBZb3UgbWF5IGlnbm9yZSBpdCBmb3IgdHJhbnNmZXJzIGNyZWF0ZWQgb24gYW5kIGFmdGVyIDEyLzAxLzIwMjMuICBTcGVjaWZpZXMgdGhlIHNvdXJjZSBvZiBmdW5kcyBmb3IgdGhlIHRyYW5zZmVyLiBPbmx5IHZhbGlkIGZvciBgY3JlZGl0YCB0cmFuc2ZlcnMsIGFuZCBkZWZhdWx0cyB0byBgc3dlZXBgIGlmIG5vdCBzcGVjaWZpZWQuIFRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZCBmb3IgYGRlYml0YCB0cmFuc2ZlcnMuICBgc3dlZXBgIC0gU3dlZXAgZnVuZHMgZnJvbSB5b3VyIGZ1bmRpbmcgYWNjb3VudCBgcHJlZnVuZGVkX3J0cF9jcmVkaXRzYCAtIFVzZSB5b3VyIHByZWZ1bmRlZCBSVFAgY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZCBgcHJlZnVuZGVkX2FjaF9jcmVkaXRzYCAtIFVzZSB5b3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZSB7XG4gICAgU3dlZXAgPSAnc3dlZXAnLFxuICAgIFByZWZ1bmRlZFJ0cENyZWRpdHMgPSAncHJlZnVuZGVkX3J0cF9jcmVkaXRzJyxcbiAgICBQcmVmdW5kZWRBY2hDcmVkaXRzID0gJ3ByZWZ1bmRlZF9hY2hfY3JlZGl0cycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdXNhZ2Ugb2YgY3JlZGl0cy4gRm9yIGFsbCBkb2xsYXIgYW1vdW50cywgdXNlIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgdGhlIG9yaWdpbmF0b3IgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBjcmVkaXQgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfZnJlcXVlbmN5OiBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgaGlnaGVzdCBhbW91bnQgZm9yIGEgc2luZ2xlIGNyZWRpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2hpZ2hlc3RfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIGF2ZXJhZ2UgYW1vdW50IHBlciBjcmVkaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9hdmVyYWdlX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9yXFwncyBtb250aGx5IGV4cGVjdGVkIEFDSCBjcmVkaXQgcHJvY2Vzc2luZyBhbW91bnQgZm9yIHRoZSBuZXh0IDYtMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfbW9udGhseV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGV4cGVjdGVkIHVzZSBjYXNlcyBmb3IgdGhlIG9yaWdpbmF0b3JcXCdzIGNyZWRpdCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29kZXM6ICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQuIFRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIuIEF1dGhvcml6YXRpb24gd2FzIG9idGFpbmVkIGZyb20gdGhlIGNvbnN1bWVyIGluIHBlcnNvbiB2aWEgd3JpdGluZywgb3IgdGhyb3VnaCBvbmxpbmUgYXV0aG9yaXphdGlvbiwgb3IgdmlhIGFuIGVsZWN0cm9uaWMgZG9jdW1lbnQgc2lnbmluZywgZS5nLiBEb2N1c2lnbi4gRm9yIGV4YW1wbGUgbGFuZ3VhZ2UgZm9yIG9ubGluZSBhdXRob3JpemF0aW9uLCBzZWUgdGhlIDIwMjUgTmFjaGEgT3BlcmF0aW5nIFJ1bGVzIC0tIFNlY3Rpb24gMi4zLjIsIEF1dGhvcml6YXRpb24gb2YgRW50cmllcyB2aWEgRWxlY3Ryb25pYyBNZWFucy4gQ2FuIGJlIHVzZWQgZm9yIGNyZWRpdHMgb3IgZGViaXRzLiAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeS4gVGhlIHRyYW5zZmVyIGRlYml0cyBhIGNvbnN1bWVyXFwncyBiYW5rIGFjY291bnQuIEF1dGhvcml6YXRpb24gZnJvbSB0aGUgY29uc3VtZXIgaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXQgKGUuZy4gYSB3ZWIgb3IgbW9iaWxlIGFwcGxpY2F0aW9uKS4gQ2FuIGJlIHVzZWQgZm9yIHNpbmdsZSBkZWJpdHMgb3IgcmVjdXJyaW5nIGRlYml0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QUNIQ2xhc3M+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHNlY19jb2RlczogQXJyYXk8Q3JlZGl0QUNIQ2xhc3M+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGRlYml0cy4gRm9yIGFsbCBkb2xsYXIgYW1vdW50cywgdXNlIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgdGhlIG9yaWdpbmF0b3IgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBkZWJpdCB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9mcmVxdWVuY3k6IE9yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCBoaWdoZXN0IGFtb3VudCBmb3IgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2hpZ2hlc3RfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIGF2ZXJhZ2UgYW1vdW50IHBlciBkZWJpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfYXZlcmFnZV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvclxcJ3MgbW9udGhseSBleHBlY3RlZCBBQ0ggZGViaXQgcHJvY2Vzc2luZyBhbW91bnQgZm9yIHRoZSBuZXh0IDYtMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgdXNlIGNhc2VzIGZvciB0aGUgb3JpZ2luYXRvclxcJ3MgZGViaXQgdHJhbnNmZXJzLiBUaGlzIHNob3VsZCBiZSBhIGxpc3QgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzOiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gVGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lci4gQXV0aG9yaXphdGlvbiB3YXMgb2J0YWluZWQgaW4gd3JpdGluZyBlaXRoZXIgaW4gcGVyc29uIG9yIHZpYSBhbiBlbGVjdHJvbmljIGRvY3VtZW50IHNpZ25pbmcsIGUuZy4gRG9jdXNpZ24sIGJ5IHRoZSBjb25zdW1lci4gQ2FuIGJlIHVzZWQgZm9yIGNyZWRpdHMgb3IgZGViaXRzLiAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeS4gVGhlIHRyYW5zZmVyIGRlYml0cyBhIGNvbnN1bWVyXFwncyBiYW5rIGFjY291bnQuIEF1dGhvcml6YXRpb24gZnJvbSB0aGUgY29uc3VtZXIgaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXQgKGUuZy4gYSB3ZWIgb3IgbW9iaWxlIGFwcGxpY2F0aW9uKS4gQ2FuIGJlIHVzZWQgZm9yIHNpbmdsZSBkZWJpdHMgb3IgcmVjdXJyaW5nIGRlYml0cy4gIGBcXFwidGVsXFxcImAgLSBUZWxlcGhvbmUtSW5pdGlhdGVkIEVudHJ5LiBUaGUgdHJhbnNmZXIgZGViaXRzIGEgY29uc3VtZXIuIERlYml0IGF1dGhvcml6YXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgb3JhbGx5IG92ZXIgdGhlIHRlbGVwaG9uZSB2aWEgYSByZWNvcmRlZCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PEFDSENsYXNzPjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRvY3VtZW50IHRoYXQgeW91IHdhbnQgdG8gdXBsb2FkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZpbGUgdG8gdXBsb2FkLiBUaGUgZmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuIDIwTUIuIFN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnM6IC5wZGYuXG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBmaWxlOiBhbnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRG9jdW1lbnRQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHB1cnBvc2U6IFRyYW5zZmVyRG9jdW1lbnRQdXJwb3NlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPcmlnaW5hdG9yXFwncyBkaWxpZ2VuY2Ugc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXMge1xuICAgIE5vdFN1Ym1pdHRlZCA9ICdub3Rfc3VibWl0dGVkJyxcbiAgICBTdWJtaXR0ZWQgPSAnc3VibWl0dGVkJyxcbiAgICBVbmRlclJldmlldyA9ICd1bmRlcl9yZXZpZXcnLFxuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZW5pZWQgPSAnZGVuaWVkJyxcbiAgICBNb3JlSW5mb3JtYXRpb25SZXF1aXJlZCA9ICdtb3JlX2luZm9ybWF0aW9uX3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3Igd2hvc2UgZGlsaWdlbmNlIHRoYXQgeW91IHdhbnQgdG8gc3VibWl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9kaWxpZ2VuY2U6IFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBwdXJwb3NlIG9mIHRoZSB1cGxvYWRlZCBmaWxlLiAgYFxcXCJEVUVfRElMSUdFTkNFXFxcImAgLSBUaGUgdHJhbnNmZXIgZHVlIGRpbGlnZW5jZSBkb2N1bWVudCBvZiB0aGUgb3JpZ2luYXRvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRG9jdW1lbnRQdXJwb3NlIHtcbiAgICBEdWVEaWxpZ2VuY2UgPSAnRFVFX0RJTElHRU5DRSdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGV2ZW50IGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV2ZW50LiBJRHMgYXJlIHNlcXVlbnRpYWwgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zZmVyLiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIFBsYWlkIExlZGdlciBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci4gVGhpcyBmaWVsZCBpcyBhbiBlbXB0eSBzdHJpbmcgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T21pdHRhYmxlVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZT86IE9taXR0YWJsZVRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2Ftb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNpZ25lZCBhbW91bnQgb2YgaG93IG11Y2ggd2FzIGBzd2VwdGAgb3IgYHJldHVybl9zd2VwdGAgZm9yIHRoaXMgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiLTUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfYW1vdW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuIEEgbm9uLW51bGwgdmFsdWUgaW5kaWNhdGVzIHRoZSBldmVudCBpcyBmb3IgdGhlIGFzc29jaWF0ZWQgcmVmdW5kIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGUgdHJhbnNmZXIgdGhhdCB0aGlzIGV2ZW50IGFwcGxpZXMgdG8uIE9ubHkgcHJlc2VudCBpZiB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQgb24gYmVoYWxmIG9mIGFub3RoZXIgY2xpZW50IGFzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCByZXR1cm5lZCBieSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCwgZm9yIHRyYW5zZmVycyBjcmVhdGVkIHZpYSBUcmFuc2ZlciBVSS4gRm9yIHRyYW5zZmVycyBub3QgY3JlYXRlZCBieSBUcmFuc2ZlciBVSSwgdGhlIHZhbHVlIGlzIGBudWxsYC4gVGhpcyB3aWxsIGN1cnJlbnRseSBvbmx5IGJlIHBvcHVsYXRlZCBmb3IgUmZQIHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgaW50ZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZmVlIGFtb3VudCBkZWR1Y3RlZCBmcm9tIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBkdXJpbmcgYSB3aXJlIHJldHVybiwgaWYgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgd2lyZV9yZXR1cm5fZmVlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgYGNyZWF0ZWRgIGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU/OiBUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGV2ZW50cyBieSBldmVudCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGVzPzogQXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+O1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZnNldCBpbnRvIHRoZSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVyIGV2ZW50cyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVyIGV2ZW50cyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2V2ZW50czogQXJyYXk8VHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgbW9yZSBldmVudHMgdG8gYmUgcHVsbGVkIGZyb20gdGhlIGVuZHBvaW50IHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldHVybmVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgeW91ciBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgKGxhcmdlc3QpIGBldmVudF9pZGAgZmV0Y2hlZCB2aWEgdGhlIHN5bmMgZW5kcG9pbnQsIG9yIDAgaW5pdGlhbGx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2V2ZW50czogQXJyYXk8VHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgbW9yZSBldmVudHMgdG8gYmUgcHVsbGVkIGZyb20gdGhlIGVuZHBvaW50IHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldHVybmVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCB0aGlzIHRyYW5zZmVyIHJlcHJlc2VudHMuIEV2ZW50IHR5cGVzIHdpdGggcHJlZml4IGBzd2VlcGAgcmVwcmVzZW50cyBldmVudHMgZm9yIFBsYWlkIExlZGdlciBzd2VlcHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGBzZXR0bGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gIGBmdW5kc19hdmFpbGFibGVgOiBGdW5kcyBmcm9tIHRoZSB0cmFuc2ZlciBoYXZlIGJlZW4gcmVsZWFzZWQgZnJvbSBob2xkIGFuZCBhcHBsaWVkIHRvIHRoZSBsZWRnZXJcXCdzIGF2YWlsYWJsZSBiYWxhbmNlLiAoT25seSBhcHBsaWNhYmxlIHRvIEFDSCBkZWJpdHMuKSAgYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLiAgYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlcHRfc2V0dGxlZGA6IENyZWRpdHMgYXJlIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gb3IgZGViaXRzIGhhdmUgYmVlbiBkZWR1Y3RlZCBmcm9tIHRoZSBjdXN0b21lclxcJ3MgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudC4gIGByZXR1cm5fc3dlcHRgOiBEdWUgdG8gdGhlIHRyYW5zZmVyIGJlaW5nIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBmcm9tIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiAgYHN3ZWVwLnBlbmRpbmdgOiBBIG5ldyBsZWRnZXIgc3dlZXAgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHN3ZWVwLnBvc3RlZGA6IFRoZSBsZWRnZXIgc3dlZXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHN3ZWVwLnNldHRsZWRgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIGZ1bmRpbmcgYWNjb3VudC4gVGhpcyBtZWFucyB0aGF0IGZ1bmRzIHdpdGhkcmF3biBmcm9tIFBsYWlkIExlZGdlciBiYWxhbmNlIGhhdmUgcmVhY2hlZCB0aGUgZnVuZGluZyBhY2NvdW50LCBvciBmdW5kcyB0byBiZSBkZXBvc2l0ZWQgaW50byB0aGUgUGxhaWQgTGVkZ2VyIEJhbGFuY2UgaGF2ZSBiZWVuIHB1bGxlZCwgYW5kIHRoZSBob2xkIHBlcmlvZCBoYXMgYmVndW4uICBgc3dlZXAucmV0dXJuZWRgOiBBIHBvc3RlZCBsZWRnZXIgc3dlZXAgd2FzIHJldHVybmVkLiAgYHN3ZWVwLmZhaWxlZGA6IFRoZSBsZWRnZXIgc3dlZXAgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHN3ZWVwLmZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIGxlZGdlciBzd2VlcCBoYXZlIGJlZW4gcmVsZWFzZWQgZnJvbSBob2xkIGFuZCBhcHBsaWVkIHRvIHRoZSBsZWRnZXJcXCdzIGF2YWlsYWJsZSBiYWxhbmNlLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBkZWJpdHMuICBgcmVmdW5kLnBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHJlZnVuZC5jYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQuICBgcmVmdW5kLmZhaWxlZGA6IFRoZSByZWZ1bmQgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHJlZnVuZC5wb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZWZ1bmQuc2V0dGxlZGA6IFRoZSByZWZ1bmQgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiAgYHJlZnVuZC5yZXR1cm5lZGA6IEEgcG9zdGVkIHJlZnVuZCB3YXMgcmV0dXJuZWQuICBgcmVmdW5kLnN3ZXB0YDogVGhlIHJlZnVuZCB3YXMgc3dlcHQgZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGByZWZ1bmQucmV0dXJuX3N3ZXB0YDogRHVlIHRvIHRoZSByZWZ1bmQgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIEZ1bmRzQXZhaWxhYmxlID0gJ2Z1bmRzX2F2YWlsYWJsZScsXG4gICAgUmV0dXJuZWQgPSAncmV0dXJuZWQnLFxuICAgIFN3ZXB0ID0gJ3N3ZXB0JyxcbiAgICBTd2VwdFNldHRsZWQgPSAnc3dlcHRfc2V0dGxlZCcsXG4gICAgUmV0dXJuU3dlcHQgPSAncmV0dXJuX3N3ZXB0JyxcbiAgICBTd2VlcFBlbmRpbmcgPSAnc3dlZXAucGVuZGluZycsXG4gICAgU3dlZXBQb3N0ZWQgPSAnc3dlZXAucG9zdGVkJyxcbiAgICBTd2VlcFNldHRsZWQgPSAnc3dlZXAuc2V0dGxlZCcsXG4gICAgU3dlZXBSZXR1cm5lZCA9ICdzd2VlcC5yZXR1cm5lZCcsXG4gICAgU3dlZXBGYWlsZWQgPSAnc3dlZXAuZmFpbGVkJyxcbiAgICBTd2VlcEZ1bmRzQXZhaWxhYmxlID0gJ3N3ZWVwLmZ1bmRzX2F2YWlsYWJsZScsXG4gICAgUmVmdW5kUGVuZGluZyA9ICdyZWZ1bmQucGVuZGluZycsXG4gICAgUmVmdW5kQ2FuY2VsbGVkID0gJ3JlZnVuZC5jYW5jZWxsZWQnLFxuICAgIFJlZnVuZEZhaWxlZCA9ICdyZWZ1bmQuZmFpbGVkJyxcbiAgICBSZWZ1bmRQb3N0ZWQgPSAncmVmdW5kLnBvc3RlZCcsXG4gICAgUmVmdW5kU2V0dGxlZCA9ICdyZWZ1bmQuc2V0dGxlZCcsXG4gICAgUmVmdW5kUmV0dXJuZWQgPSAncmVmdW5kLnJldHVybmVkJyxcbiAgICBSZWZ1bmRTd2VwdCA9ICdyZWZ1bmQuc3dlcHQnLFxuICAgIFJlZnVuZFJldHVyblN3ZXB0ID0gJ3JlZnVuZC5yZXR1cm5fc3dlcHQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNmZXIgZXZlbnRzIGFyZSBhdmFpbGFibGUuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgLiBJZiBtdWx0aXBsZSB0cmFuc2ZlciBldmVudHMgb2NjdXIgd2l0aGluIGEgc2luZ2xlIG1pbnV0ZSwgb25seSBvbmUgd2ViaG9vayB3aWxsIGJlIGZpcmVkLCBzbyBhIHNpbmdsZSB3ZWJob29rIGluc3RhbmNlIG1heSBjb3JyZXNwb25kIHRvIG11bHRpcGxlIHRyYW5zZmVyIGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVmaW5lcyBhbiBleHBlY3RlZCBzd2VlcCBkYXRlIGFuZCBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlbWVudCBkYXRlIG9mIGEgc3dlZXAgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIHN3ZWVwX3NldHRsZW1lbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2N1bXVsYXRlZCBhbW91bnQgdGhhdCBoYXMgYmVlbiBzd2VwdCBieSBgc3dlZXBfc2V0dGxlbWVudF9kYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gICAgICovXG4gICAgc3dlcHRfc2V0dGxlZF9hbW91bnQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBldmVudCB0eXBlIGZvciBhIHRyYW5zZmVyIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXR1cm5lZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmFpbHVyZSBjb2RlLCBlLmcuIGBSMDFgLiAgQSBmYWlsdXJlIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXR1cm5lZGAuIFNlZSBbQUNIIHJldHVybiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzIGFuZCBbUlRQL1JmUCBlcnJvciBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI3J0cHJmcC1lcnJvci1jb2RlcykgZm9yIFJUUCBlcnJvciBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBmYWlsdXJlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9yaWdpbmF0b3JcXCdzIGZ1bmRpbmcgYWNjb3VudCwgbGlua2VkIHdpdGggUGxhaWQgTGluayBvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9yaWdpbmF0b3JcXCdzIGZ1bmRpbmcgYWNjb3VudCwgbGlua2VkIHdpdGggUGxhaWQgTGluayBvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRnVuZGluZ0FjY291bnRXaXRoRGlzcGxheU5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50V2l0aERpc3BsYXlOYW1lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBmb3IgdGhlIGZ1bmRpbmcgYWNjb3VudCB0aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRXaXRoRGlzcGxheU5hbWVcbiAgICAgKi9cbiAgICBkaXNwbGF5X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50V2l0aERpc3BsYXlOYW1lQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50V2l0aERpc3BsYXlOYW1lQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIGZvciB0aGUgZnVuZGluZyBhY2NvdW50IHRoYXQgaXMgZGlzcGxheWVkIGluIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZUFsbE9mXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBZGFwdGl2ZSBndWFyYW50ZWUgZGV0YWlscyBmb3IgYSB0cmFuc2ZlciwgaW5jbHVkaW5nIHRoZSBndWFyYW50ZWVkIGFtb3VudCBhbmQgc2V0dGxlbWVudCBzY2hlZHVsZS4gT21pdHRlZCB3aGVuIG5vIGd1YXJhbnRlZSB3YXMgYXR0ZW1wdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckd1YXJhbnRlZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckd1YXJhbnRlZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgY3VycmVudGx5IGNvdmVyZWQgYnkgUGxhaWRcXCdzIGd1YXJhbnRlZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFzIHNjaGVkdWxlZCB0cmFuY2hlcyByZWFjaCB0aGVpciBvYnNlcnZhdGlvbiB3aW5kb3cgZXhwaXJhdGlvbiBhbmQgYmVjb21lIGd1YXJhbnRlZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHdWFyYW50ZWVEZXRhaWxzXG4gICAgICovXG4gICAgZ3VhcmFudGVlZF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWRhcHRpdmUgZ3VhcmFudGVlIHNldHRsZW1lbnQgc2NoZWR1bGUgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyR3VhcmFudGVlU2NoZWR1bGVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHdWFyYW50ZWVEZXRhaWxzXG4gICAgICovXG4gICAgc2NoZWR1bGU6IEFycmF5PFRyYW5zZmVyR3VhcmFudGVlU2NoZWR1bGVJdGVtPjtcbn1cbi8qKlxuICogVGhlIGFkYXB0aXZlIGd1YXJhbnRlZSBvdXRjb21lIGZvciBhIHRyYW5zZmVyLiAgYEZVTExfSU5TVEFOVGA6IFRoZSBmdWxsIHRyYW5zZmVyIGFtb3VudCBpcyBndWFyYW50ZWVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGluc3RhbnRseS4gIGBQQVJUSUFMX0lOU1RBTlRfT05MWWA6IEEgcGFydGlhbCBhbW91bnQgaXMgZ3VhcmFudGVlZCBhbmQgYXZhaWxhYmxlIGluc3RhbnRseTsgdGhlIHJlbWFpbmRlciBpcyBub3QgZ3VhcmFudGVlZC4gIGBQQVJUSUFMX0lOU1RBTlRfV0lUSF9PQlNFUlZBVElPTl9XSU5ET1dgOiBBIHBhcnRpYWwgYW1vdW50IGlzIGd1YXJhbnRlZWQgaW5zdGFudGx5OyBhbiBhZGRpdGlvbmFsIGFtb3VudCBpcyBjb25kaXRpb25hbGx5IGd1YXJhbnRlZWQgc3ViamVjdCB0byBhbiBvYnNlcnZhdGlvbiB3aW5kb3cuICBgTk9UX0dVQVJBTlRFRURgOiBQbGFpZCBkaWQgbm90IHByb3ZpZGUgYSBndWFyYW50ZWUgZm9yIHRoaXMgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2Zlckd1YXJhbnRlZU91dGNvbWUge1xuICAgIEZ1bGxJbnN0YW50ID0gJ0ZVTExfSU5TVEFOVCcsXG4gICAgUGFydGlhbEluc3RhbnRPbmx5ID0gJ1BBUlRJQUxfSU5TVEFOVF9PTkxZJyxcbiAgICBQYXJ0aWFsSW5zdGFudFdpdGhPYnNlcnZhdGlvbldpbmRvdyA9ICdQQVJUSUFMX0lOU1RBTlRfV0lUSF9PQlNFUlZBVElPTl9XSU5ET1cnLFxuICAgIE5vdEd1YXJhbnRlZWQgPSAnTk9UX0dVQVJBTlRFRUQnXG59XG5cbi8qKlxuICogQSBzaW5nbGUgZW50cnkgaW4gdGhlIGFkYXB0aXZlIGd1YXJhbnRlZSBzZXR0bGVtZW50IHNjaGVkdWxlLCBkZXNjcmliaW5nIG9uZSB0cmFuY2hlIG9mIGd1YXJhbnRlZWQgZnVuZHMuIEFkZHMgYG9ic2VydmF0aW9uX3dpbmRvd19leHBpcmF0aW9uX3RpbWVgLCB3aGljaCBpcyBvbmx5IGtub3duIG9uY2UgYSB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR3VhcmFudGVlU2NoZWR1bGVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZ3VhcmFudGVlZCBhbW91bnQgZm9yIHRoaXMgc2NoZWR1bGUgZW50cnkgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYnVzaW5lc3MgZGF5cyBpbiB0aGUgb2JzZXJ2YXRpb24gd2luZG93IGZvciB0aGlzIHRyYW5jaGUuIGAwYCB3aGVuIHRoZSB0cmFuY2hlIGlzIG5vdCBzdWJqZWN0IHRvIGFuIG9ic2VydmF0aW9uIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIG9ic2VydmF0aW9uX3dpbmRvd19idXNpbmVzc19kYXlzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIG9ic2VydmF0aW9uIHdpbmRvdyBmb3IgdGhpcyB0cmFuY2hlIGV4cGlyZXMuIFByZXNlbnQgb25seSB3aGVuIHRoZSB0cmFuY2hlIGlzIHN1YmplY3QgdG8gYW4gb2JzZXJ2YXRpb24gd2luZG93LiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIG9ic2VydmF0aW9uX3dpbmRvd19leHBpcmF0aW9uX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHdWFyYW50ZWVTY2hlZHVsZUl0ZW1BbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR3VhcmFudGVlU2NoZWR1bGVJdGVtQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBvYnNlcnZhdGlvbiB3aW5kb3cgZm9yIHRoaXMgdHJhbmNoZSBleHBpcmVzLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgdHJhbmNoZSBpcyBzdWJqZWN0IHRvIGFuIG9ic2VydmF0aW9uIHdpbmRvdy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHdWFyYW50ZWVTY2hlZHVsZUl0ZW1BbGxPZlxuICAgICAqL1xuICAgIG9ic2VydmF0aW9uX3dpbmRvd19leHBpcmF0aW9uX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiAgQSBkZWNpc2lvbiByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgYEFQUFJPVkVEYCAtIFRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgcmVjZWl2ZWQgdGhlIGVuZCB1c2VyXFwncyBjb25zZW50IGFuZCBoYXMgYmVlbiBhcHByb3ZlZCBmb3IgcHJvY2Vzc2luZyBieSBQbGFpZC4gVGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIGZpZWxkIGlzIHNldCBpZiBQbGFpZCB3YXMgdW5hYmxlIHRvIGZldGNoIHRoZSBhY2NvdW50IGluZm9ybWF0aW9uLiBZb3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBmdXJ0aGVyIHJldmlldyBpcyByZWNvbW1lbmRlZCAoaS5lLiwgdXNlIExpbmsgaW4gdXBkYXRlIG1vZGUgdG8gcmUtYXV0aGVudGljYXRlIHlvdXIgdXNlciB3aGVuIGBkZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgYElURU1fTE9HSU5fUkVRVUlSRURgKS4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLiAgYERFQ0xJTkVEYCAtIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgaW50ZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHRoZSB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJJbnRlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXR1cm5lZCBvbmx5IGlmIGBhY2NvdW50X2lkYCB3YXMgc2V0IG9uIGludGVudCBjcmVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICByZXF1aXJlX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBmbG93IG9mIHRyYW5zZmVyIGZ1bmRzLiAgYFBBWU1FTlRgOiBUcmFuc2ZlcnMgZnVuZHMgZnJvbSBhbiBlbmQgdXNlclxcJ3MgYWNjb3VudCB0byB5b3VyIGJ1c2luZXNzIGFjY291bnQuICBgRElTQlVSU0VNRU5UYDogVHJhbnNmZXJzIGZ1bmRzIGZyb20geW91ciBidXNpbmVzcyBhY2NvdW50IHRvIGFuIGVuZCB1c2VyXFwncyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlIHtcbiAgICBQYXltZW50ID0gJ1BBWU1FTlQnLFxuICAgIERpc2J1cnNlbWVudCA9ICdESVNCVVJTRU1FTlQnXG59XG5cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBEZWZhdWx0cyB0byBgc2FtZS1kYXktYWNoYC4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBhY2hgLCB0aGUgU3RhbmRhcmQgQUNIIGN1dG9mZiBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBzYW1lLWRheS1hY2hgLCB0aGUgU2FtZSBEYXkgQUNIIGN1dG9mZiBpcyAzOjAwIFBNIEVhc3Rlcm4gVGltZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2VuZCB0aGUgcmVxdWVzdCAxNSBtaW51dGVzIHByaW9yIHRvIHRoZSBjdXRvZmYgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGltZSBmb3Igc3VibWlzc2lvbiBiZWZvcmUgdGhlIGN1dG9mZi4gSWYgdGhlIHRyYW5zZmVyIGlzIHByb2Nlc3NlZCBhZnRlciB0aGlzIGN1dG9mZiBidXQgYmVmb3JlIHRoZSBTdGFuZGFyZCBBQ0ggY3V0b2ZmLCBpdCB3aWxsIGJlIHNlbnQgb3ZlciBTdGFuZGFyZCBBQ0ggcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXMuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCB1c2luZyBgcnRwYCwgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYWNjb3VudCBiZWluZyBjcmVkaXRlZCBkb2VzIG5vdCBzdXBwb3J0IFJUUCwgdGhlIHRyYW5zZmVyIHdpbGwgYmUgc2VudCBvdmVyIEFDSCBhcyBsb25nIGFzIGFuIGBhY2hfY2xhc3NgIGlzIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0LiBJZiBSVFAgaXNuXFwndCBzdXBwb3J0ZWQgYnkgdGhlIGFjY291bnQgYW5kIG5vIGBhY2hfY2xhc3NgIGlzIHByb3ZpZGVkLCB0aGUgdHJhbnNmZXIgd2lsbCBmYWlsIHRvIGJlIHN1Ym1pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFJ0cCA9ICdydHAnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIFNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcyBvbmx5LiBJZiB1c2luZyBQbGFpZCBMZWRnZXIsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIGFuZCB5b3UgYXJlIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gT3RoZXJ3aXNlLCBQbGFpZCBMZWRnZXIgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiAxNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50OiBUcmFuc2ZlckludGVudENyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlckludGVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBjcmVhdGVkIHRocm91Z2ggdGhlIFVJLiBSZXR1cm5lZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXR1cm5lZCBvbmx5IGlmIGBhY2NvdW50X2lkYCB3YXMgc2V0IG9uIGludGVudCBjcmVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSByZWFzb24gZm9yIGEgZmFpbGVkIHRyYW5zZmVyIGludGVudC4gUmV0dXJuZWQgb25seSBpZiB0aGUgdHJhbnNmZXIgaW50ZW50IHN0YXR1cyBpcyBgZmFpbGVkYC4gTnVsbCBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbiB7XG4gICAgLyoqXG4gICAgICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByZWFzb24gZm9yIGEgZmFpbGVkIHRyYW5zZmVyIGludGVudCAoaS5lLiwgYW4gQVBJIGVycm9yIG9yIHRoZSBhdXRob3JpemF0aW9uIGJlaW5nIGRlY2xpbmVkKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgYXNzb2NpYXRlZCB3aXRoIGEgZmFpbGVkIHRyYW5zZmVyIGludGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50R2V0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50OiBUcmFuc2ZlckludGVudEdldDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIgaW50ZW50LiAgYFBFTkRJTkdgOiBUaGUgdHJhbnNmZXIgaW50ZW50IGlzIHBlbmRpbmcuIGBTVUNDRUVERURgOiBUaGUgdHJhbnNmZXIgaW50ZW50IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gYEZBSUxFRGA6IFRoZSB0cmFuc2ZlciBpbnRlbnQgd2FzIHVuYWJsZSB0byBiZSBjcmVhdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAnUEVORElORycsXG4gICAgU3VjY2VlZGVkID0gJ1NVQ0NFRURFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoaXMgYmFsYW5jZSBhdmFpbGFibGUgZm9yIHVzZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgcGVuZGluZyBmdW5kcyB0aGF0IGFyZSBpbiBwcm9jZXNzaW5nIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJCYWxhbmNlXG4gICAgICovXG4gICAgcGVuZGluZzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGN1c3RvbWVyIHRoYXQgb3ducyB0aGUgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgaXMgc28gUGxhaWQga25vd3Mgd2hpY2ggb2YgeW91ciBjdXN0b21lcnMgdG8gcGF5b3V0IG9yIGNvbGxlY3QgZnVuZHMuIE9ubHkgYXBwbGljYWJsZSBmb3IgW1BsYXRmb3JtIGN1c3RvbWVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS4gRG8gbm90IGluY2x1ZGUgaWYgeW91XFwncmUgcGF5aW5nIG91dCB0byB5b3Vyc2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgdGhlIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBMZWRnZXIgd2lsbCBiZSB1c2VkLiBJZiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgIGlzIHNwZWNpZmllZCwgdGhlIGBmdW5kaW5nX2FjY291bnRfaWRgIG11c3QgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGxlZGdlciBiYWxhbmNlIHRvIGRlcG9zaXQgdG8uIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGxlZGdlcl9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoaXMgd2lsbCBkZWZhdWx0IHRvIGlkIG9mIHRoZSBkZWZhdWx0IGxlZGdlciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgZGVwb3NpdGVkIGludG8gbGVkZ2VyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIGRlcG9zaXQuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgZGVwb3NpdCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBkZXBvc2l0IGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckFDSE5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2ZlckFDSE5ldHdvcms7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGVkZ2VyIHRvIHB1bGwgbW9uZXkgZnJvbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnJvbV9sZWRnZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGVkZ2VyIHRvIGNyZWRpdCBtb25leSB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgdG9fbGVkZ2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBtb3ZlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIEFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgZGlzdHJpYnV0ZS4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciBkaXN0cmlidXRlIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGRpc3RyaWJ1dGUgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBsZWRnZXIgZGlzdHJpYnV0ZSBvcGVyYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIGxlZGdlciBldmVudCBpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBsZWRnZXIgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudFxuICAgICAqL1xuICAgIGxlZGdlcl9ldmVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgbGVkZ2VyIHRoaXMgZXZlbnQgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50XG4gICAgICovXG4gICAgbGVkZ2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGVkZ2VyIGV2ZW50IGFzIGEgZGVjaW1hbCBzdHJpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNmZXIgc291cmNlIHRoYXQgdHJpZ2dlcmVkIHRoaXMgbGVkZ2VyIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWZ1bmQgc291cmNlIHRoYXQgdHJpZ2dlcmVkIHRoaXMgbGVkZ2VyIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc3dlZXAgc291cmNlIHRoYXQgdHJpZ2dlcmVkIHRoaXMgbGVkZ2VyIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICBzd2VlcF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgbGVkZ2VyIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgcGVuZGluZyBiYWxhbmNlIGFmdGVyIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudFxuICAgICAqL1xuICAgIHBlbmRpbmdfYmFsYW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgYXZhaWxhYmxlIGJhbGFuY2UgYWZ0ZXIgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50XG4gICAgICovXG4gICAgYXZhaWxhYmxlX2JhbGFuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBiYWxhbmNlIHRoYXQgd2FzIGltcGFjdGVkIGJ5IHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGxlZGdlciBldmVudCBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXIgZXZlbnRzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LiAoVGhpcyBmaWVsZCBpcyBzcGVjaWZpY2FsbHkgZm9yIHJlc2VsbGVycy4gQ2FsbGVyXFwncyBjbGllbnQgSUQgd2lsbCBiZSB1c2VkIGlmIHRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZC4pXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgY3JlYXRlZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIDIwMTktMTItMDZUMjI6MzU6NDlaKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3JlYXRlZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIDIwMTktMTItMDZUMjI6MzU6NDlaKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsZWRnZXIgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2V2ZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGVkZ2VyRXZlbnRTb3VyY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzb3VyY2VfdHlwZT86IExlZGdlckV2ZW50U291cmNlVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLCBzd2VlcCwgb3IgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNvdXJjZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJMZWRnZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWRnZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckxlZGdlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIGV2ZW50cyB0byBiZSBwdWxsZWQgZnJvbSB0aGUgZW5kcG9pbnQgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBnZXQuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGxlZGdlcl9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoaXMgd2lsbCBkZWZhdWx0IHRvIGlkIG9mIHRoZSBkZWZhdWx0IGxlZGdlciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgTGVkZ2VyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJMZWRnZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBMZWRnZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyBMZWRnZXIgaXMgdGhlIGNsaWVudFxcJ3MgZGVmYXVsdCBsZWRnZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19kZWZhdWx0OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYHNldHRsZWRgLCBgZmFpbGVkYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgbGVkZ2VyIHN3ZWVwIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLnBvc3RlZGAgIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLmZhaWxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAuc2V0dGxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAucmV0dXJuZWRgICBgc3dlZXAuc2V0dGxlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGUge1xuICAgIFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc3dlZXAuc2V0dGxlZCcsXG4gICAgUmV0dXJuZWQgPSAnc3dlZXAucmV0dXJuZWQnLFxuICAgIEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGN1c3RvbWVyIHRoYXQgb3ducyB0aGUgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgaXMgc28gUGxhaWQga25vd3Mgd2hpY2ggb2YgeW91ciBjdXN0b21lcnMgdG8gcGF5b3V0IG9yIGNvbGxlY3QgZnVuZHMuIE9ubHkgYXBwbGljYWJsZSBmb3IgW1BsYXRmb3JtIGN1c3RvbWVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS4gRG8gbm90IGluY2x1ZGUgaWYgeW91XFwncmUgcGF5aW5nIG91dCB0byB5b3Vyc2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHRoZSBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC4gSWYgYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYCBpcyBzcGVjaWZpZWQsIHRoZSBgZnVuZGluZ19hY2NvdW50X2lkYCBtdXN0IGJlbG9uZyB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggbGVkZ2VyIGJhbGFuY2UgdG8gd2l0aGRyYXcgZnJvbS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgbGVkZ2VyX2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhlIGxlZGdlciBiYWxhbmNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgd2l0aGRyYXcuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgd2l0aGRyYXcgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGBjcmVhdGVkYCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJzOiBBcnJheTxUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyBhdXRob3JpemF0aW9uIHVzYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYWlseSBjcmVkaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBkYWlseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhaWx5IGRlYml0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgZGFpbHlfZGViaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgY3JlZGl0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgbW9udGhseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgZGViaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBtb250aGx5X2RlYml0X3V0aWxpemF0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYWlseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgYW5kIGRlYml0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1vbnRobHlfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfZGViaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb250aGx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXR1cm5fcmF0ZXM/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTWV0cmljc0dldEF1dGhvcml6YXRpb25Vc2FnZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX3VzYWdlPzogVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgcmV0dXJuIHJhdGVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzXG4gICAgICovXG4gICAgbGFzdF82MGQ/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHJldHVybiByYXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB7XG4gICAgLyoqXG4gICAgICogVGhlIG92ZXJhbGwgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICBvdmVyYWxsX3JldHVybl9yYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmF1dGhvcml6ZWQgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFkbWluaXN0cmF0aXZlIHJldHVybiByYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsXG4gICAgICovXG4gICAgYWRtaW5pc3RyYXRpdmVfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGlzIHRoZSBBQkEgbnVtYmVyOyBmb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBBQ0ggbnVtYmVyIHVzZWQgaW4gYHJvdXRpbmdfbnVtYmVyYC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCBmb3IgdGhlIGNyZWF0ZWQgaXRlbSB0byBiZSBlbGlnaWJsZSBmb3Igd2lyZSB0cmFuc2ZlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBiYW5rIGFjY291bnQgKGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCwgdGhlIFN0YW5kYXJkIEFDSCBjdXRvZmYgaXMgODozMCBQTSBFYXN0ZXJuIFRpbWUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgc2FtZS1kYXktYWNoYCwgdGhlIFNhbWUgRGF5IEFDSCBjdXRvZmYgaXMgMzowMCBQTSBFYXN0ZXJuIFRpbWUuICBJdCBpcyByZWNvbW1lbmRlZCB0byBzZW5kIHRoZSByZXF1ZXN0IDE1IG1pbnV0ZXMgcHJpb3IgdG8gdGhlIGN1dG9mZiB0byBlbnN1cmUgdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBpbiB0aW1lIGZvciBzdWJtaXNzaW9uIGJlZm9yZSB0aGUgY3V0b2ZmLiBJZiB0aGUgdHJhbnNmZXIgaXMgcHJvY2Vzc2VkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIFN0YW5kYXJkIEFDSCBjdXRvZmYsIGl0IHdpbGwgYmUgc2VudCBvdmVyIFN0YW5kYXJkIEFDSCByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlczsgdGhpcyB3aWxsIGFwcGx5IHRvIGJvdGggbGVncyBvZiB0aGUgdHJhbnNmZXIgaWYgYXBwbGljYWJsZS4gVGhlIHRyYW5zYWN0aW9uIGxpbWl0IGZvciBhIFNhbWUgRGF5IEFDSCB0cmFuc2ZlciBpcyAkMSwwMDAsMDAwLiBBdXRob3JpemF0aW9uIHJlcXVlc3RzIHNlbnQgd2l0aCBhbiBhbW91bnQgZ3JlYXRlciB0aGFuICQxLDAwMCwwMDAgd2lsbCBmYWlsLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYHJ0cGAsICBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgcm91dGUgYmV0d2VlbiB0aGUgUmVhbC1UaW1lIFBheW1lbnRzIChSVFApIHJhaWwgYnkgVENIIG9yIEZlZE5vdyByYWlscyBhcyBuZWNlc3NhcnkuIElmIGEgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFzIGBydHBgIGFuZCB0aGUgY291bnRlcnBhcnR5IGFjY291bnQgaXMgbm90IGVsaWdpYmxlIGZvciBSVFAsIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCByZXF1ZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGBJTlZBTElEX0ZJRUxEYCBlcnJvciBjb2RlLiBUbyBwcmUtY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb3VudGVycGFydHkgYWNjb3VudCBjYW4gc3VwcG9ydCBSVFAsIGNhbGwgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBiZWZvcmUgY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYC4gIFdpcmUgdHJhbnNmZXJzIGFyZSBjdXJyZW50bHkgaW4gZWFybHkgYXZhaWxhYmlsaXR5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byBgd2lyZWAgYXMgYSBwYXltZW50IG5ldHdvcmssIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGB3aXJlYCwgdGhlIGB0eXBlYCBtdXN0IGJlIGBjcmVkaXRgOyB3aXJlIGRlYml0cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhlIGN1dG9mZiB0byBzdWJtaXQgYSB3aXJlIHBheW1lbnQgaXMgNjozMCBQTSBFYXN0ZXJuIFRpbWUgb24gYSBidXNpbmVzcyBkYXk7IHdpcmVzIHN1Ym1pdHRlZCBhZnRlciB0aGF0IHRpbWUgd2lsbCBiZSBwcm9jZXNzZWQgb24gdGhlIG5leHQgYnVzaW5lc3MgZGF5LiBUaGUgdHJhbnNhY3Rpb24gbGltaXQgZm9yIGEgd2lyZSBpcyAkOTk5LDk5OS45OS4gQXV0aG9yaXphdGlvbiByZXF1ZXN0cyBzZW50IHdpdGggYW4gYW1vdW50IGdyZWF0ZXIgdGhhbiAkOTk5LDk5OS45OSB3aWxsIGZhaWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBSdHAgPSAncnRwJyxcbiAgICBXaXJlID0gJ3dpcmUnXG59XG5cbi8qKlxuICogVGhlIG9yaWdpbmF0b3JcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR3by1sZXR0ZXIgY29kZSBmb3IgdGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyIGJlaW5nIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcHVibGljLWZhY2luZyBzdXJmYWNlcywgZS5nLiBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvci4gVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyBhbmQgc2hvdWxkIGJlIHN0b3JlZCBhc3NvY2lhdGVkIHdpdGggZW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmF0b3IuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGJ1c2luZXNzIG5hbWUgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZGJhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCBJRCBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICB0YXhfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGNyZWRpdF91c2FnZV9jb25maWd1cmF0aW9uPzogVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBkZWJpdF91c2FnZV9jb25maWd1cmF0aW9uPzogVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBOQUlDUyBjb2RlIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIG5haWNzX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGdW5kaW5nQWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50OiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnRXaXRoRGlzcGxheU5hbWV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lciAoaS5lLiB0aGUgb3JpZ2luYXRvcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RldGFpbGVkT3JpZ2luYXRvcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yOiBEZXRhaWxlZE9yaWdpbmF0b3I7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvcmlnaW5hdG9ycyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBvcmlnaW5hdG9ycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE9yaWdpbmF0b3I+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yczogQXJyYXk8T3JpZ2luYXRvcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIG9uYm9hcmRpbmcgb3JpZ2luYXRvciBoYXMgYmVlbiB1cGRhdGVkLiBDYWxsIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIHRvIGNoZWNrIHRoZSBsYXRlc3Qgc3RhdHVzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFxcXCJUUkFOU0ZFUlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFxcXCJQTEFURk9STV9PTkJPQVJESU5HX1VQREFURVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdG9zX2FjY2VwdGFuY2VfbWV0YWRhdGE6IFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogSVNPODYwMSB0aW1lc3RhbXAgaW5kaWNhdGluZyB0aGUgbW9zdCByZWNlbnQgdGltZSB0aGUgcGxhdGZvcm0gY29sbGVjdGVkIG9uYm9hcmRpbmcgZGF0YSBmcm9tIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9yZXZpZXdlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBQTEFURk9STV9PTkJPQVJESU5HX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIG9mIGEgcGVyc29uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuIElmIHByb3ZpZGVkLCBhIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDUwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuYW1lPzogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWU7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuIFBob25lIG51bWJlciBpbnB1dCBtYXkgYmUgdmFsaWRhdGVkIGFnYWluc3QgdmFsaWQgbnVtYmVyIHJhbmdlczsgbnVtYmVyIHN0cmluZ3MgdGhhdCBkbyBub3QgbWF0Y2ggYSByZWFsLXdvcmxkIHBob25lIG51bWJlcmluZyBzY2hlbWUgbWF5IGNhdXNlIHRoZSByZXF1ZXN0IHRvIGZhaWwsIGV2ZW4gaW4gdGhlIFNhbmRib3ggdGVzdCBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIGJpcnRoIG9mIHRoZSBwZXJzb24uIEZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBwZXJzb24gYW5kIHRoZSBvcmlnaW5hdG9yIHRoZXkgYXJlIHJlbGF0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxhdGlvbnNoaXBfdG9fb3JpZ2luYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBvd25lcnNoaXAgdGhpcyBwZXJzb24gaGFzIGluIHRoZSBvbmJvYXJkaW5nIGJ1c2luZXNzLiBPbmx5IGFwcGxpY2FibGUgdG8gYmVuZWZpY2lhbCBvd25lcnMgd2l0aCAyNSUgb3IgbW9yZSBvd25lcnNoaXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfcGVyY2VudGFnZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIHBlcnNvbiBhdCB0aGUgYnVzaW5lc3MuIE9ubHkgYXBwbGljYWJsZSB0byBjb250cm9sIHBlcnNvbnMgLSBmb3IgZXhhbXBsZSwgXFxcIkNFT1xcXCIsIFxcXCJQcmVzaWRlbnRcXFwiLCBcXFwiT3duZXJcXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0aXRsZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJRCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gc3VibWl0dGluZyBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZXJzb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyc29uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIElEIG51bWJlciBvZiB0aGUgcGVyc29uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgdGhlIHBlcnNvblxcJ3MgSUQgTnVtYmVyLiBBbHBoYS1udW1lcmljLCB3aXRoIGFsbCBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgc3RyaXBwZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SUROdW1iZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBJRE51bWJlclR5cGU7XG59XG4vKipcbiAqIFRoZSBwZXJzb25cXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogQSBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIGZvciBvcmlnaW5hdG9yIG9uYm9hcmRpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50XG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVVUlEIG9mIHRoZSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1aXJlbWVudC4gT25seSBwcmVzZW50IGZvciBpbmRpdmlkdWFsLXNjb3BlZCByZXF1aXJlbWVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50XG4gICAgICovXG4gICAgcGVyc29uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgcmVxdWlyZW1lbnQgc3VibWlzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcmVxdWlyZW1lbnQgYmVpbmcgc3VibWl0dGVkLiBTZWUgW1JlcXVpcmVtZW50IHR5cGUgc2NoZW1hIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMU5FUWtURDBzVks1MGlBUWk2eEhpZ3JleERVeFo0UXhYcVNFZlZfRkZUaVUvKSBmb3IgYSBsaXN0IG9mIHJlcXVpcmVtZW50IHR5cGVzIGFuZCBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvblxuICAgICAqL1xuICAgIHJlcXVpcmVtZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlcXVpcmVtZW50LCB3aGljaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IGRlcGVuZGluZyBvbiB0aGUgYHJlcXVpcmVtZW50X3R5cGVgLiBJZiBpdCBpcyBhbiBvYmplY3QsIHRoZSBvYmplY3Qgc2hvdWxkIGJlIEpTT04gbWFyc2hhbGVkIGludG8gYSBzdHJpbmcuIFNlZSBbUmVxdWlyZW1lbnQgdHlwZSBzY2hlbWEgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xTkVRa1REMHNWSzUwaUFRaTZ4SGlncmV4RFV4WjRReFhxU0VmVl9GRlRpVS8pIGZvciBhIGxpc3Qgb2YgcmVxdWlyZW1lbnQgdHlwZXMgYW5kIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBlcnNvbl9pZGAgb2YgdGhlIHBlcnNvbiB0aGUgcmVxdWlyZW1lbnQgc3VibWlzc2lvbiBpcyByZWxhdGVkIHRvLiBBIGBwZXJzb25faWRgIGlzIHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAuIFRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBmb3IgcmVxdWlyZW1lbnRzIHRoYXQgYXJlIG5vdCByZWxhdGVkIHRvIGEgcGVyc29uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAgICAgKi9cbiAgICBwZXJzb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IGEgbGlzdCBvZiByZXF1aXJlbWVudCBzdWJtaXNzaW9ucyB0aGF0IGFsbCByZWxhdGUgdG8gdGhlIG9yaWdpbmF0b3IuIE11c3QgY29udGFpbiBiZXR3ZWVuIDEgYW5kIDUwIHJlcXVpcmVtZW50IHN1Ym1pc3Npb25zLiBTZWUgW1JlcXVpcmVtZW50IHR5cGUgc2NoZW1hIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMU5FUWtURDBzVks1MGlBUWk2eEhpZ3JleERVeFo0UXhYcVNFZlZfRkZUaVUvKSBmb3IgYSBsaXN0IG9mIHJlcXVpcmVtZW50cyBhbmQgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVtZW50X3N1Ym1pc3Npb25zOiBBcnJheTxUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uPjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBhY2NlcHRhbmNlIG9mIFRlcm1zIG9mIFNlcnZpY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBUT1MgYWdyZWVtZW50IHdhcyBhY2NlcHRlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhXG4gICAgICovXG4gICAgYWdyZWVtZW50X2FjY2VwdGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBvcmlnaW5hdG9yIHdoZW4gdGhleSBhY2NlcHRlZCB0aGUgVE9TLiBGb3JtYXR0ZWQgYXMgYW4gSVB2NCBvciBJUHY2IElQIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9pcF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPODYwMSB0aW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIHRoZSBvcmlnaW5hdG9yIGFjY2VwdGVkIHRoZSBUT1NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhXG4gICAgICovXG4gICAgYWdyZWVtZW50X2FjY2VwdGVkX2F0OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSTCB0aGUgZW5kIGN1c3RvbWVyIHdpbGwgYmUgcmVkaXJlY3RlZCB0byBhZnRlciBjb21wbGV0aW5nIHF1ZXN0aW9ucyBpbiBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVUkwgdGhhdCB5b3Ugd2lsbCByZWRpcmVjdCB0aGUgZW5kIGN1c3RvbWVyIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgb25ib2FyZGluZ191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSByZWN1cnJpbmcgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSByZWN1cnJpbmcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZW5kIHVzZXIgaXMgaW5pdGlhdGluZyB0aGUgc3BlY2lmaWMgdHJhbnNmZXIgdGhlbXNlbHZlcyB2aWEgYW4gaW50ZXJhY3RpdmUgVUksIHRoaXMgc2hvdWxkIGJlIGB0cnVlYDsgZm9yIGF1dG9tYXRpYyByZWN1cnJpbmcgcGF5bWVudHMgd2hlcmUgdGhlIGVuZCB1c2VyIGlzIG5vdCBhY3R1YWxseSBpbml0aWF0aW5nIGVhY2ggaW5kaXZpZHVhbCB0cmFuc2ZlciwgaXQgc2hvdWxkIGJlIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfcHJlc2VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIHRoZSBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgY3JlYXRlZCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gTmV3IG9yaWdpbmF0aW9ucyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBgdGVzdF9jbG9ja2AgYWR2YW5jZXMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2ltdWxhdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3NhbmRib3gvI3NpbXVsYXRpbmctcmVjdXJyaW5nLXRyYW5zZmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyRGV2aWNlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyPzogUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVjaXNpb25fcmF0aW9uYWxlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXI6IFJlY3VycmluZ1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgYGNyZWF0ZWRgIGRhdGV0aW1lIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgYGNyZWF0ZWRgIGRhdGV0aW1lIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGBmdW5kaW5nX2FjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyczogQXJyYXk8UmVjdXJyaW5nVHJhbnNmZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTmV0d29ya3MgZWxpZ2libGUgZm9yIHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlY3VycmluZ05ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBSdHAgPSAncnRwJ1xufVxuXG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBiZSBleGVjdXRlZCBvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfdW5pdDogVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlY3VycmluZyBgaW50ZXJ2YWxfdW5pdHNgIGJldHdlZW4gb3JpZ2luYXRpb25zLiBUaGUgcmVjdXJyaW5nIGludGVydmFsIChiZWZvcmUgaG9saWRheSBhZGp1c3RtZW50KSBpcyBjYWxjdWxhdGVkIGJ5IG11bHRpcGx5aW5nIGBpbnRlcnZhbF91bml0YCBhbmQgYGludGVydmFsX2NvdW50YC4gRm9yIGV4YW1wbGUsIHRvIHNjaGVkdWxlIGEgcmVjdXJyaW5nIHRyYW5zZmVyIHdoaWNoIG9yaWdpbmF0ZXMgb25jZSBldmVyeSB0d28gd2Vla3MsIHNldCBgaW50ZXJ2YWxfdW5pdGAgPSBgd2Vla2AgYW5kIGBpbnRlcnZhbF9jb3VudGAgPSAyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSB0cmFuc2Zlci4gIElmIHRoZSBgaW50ZXJ2YWxfdW5pdGAgaXMgYHdlZWtgLCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDUgKEZyaWRheSkuICBJZiB0aGUgYGludGVydmFsX3VuaXRgIGlzIGBtb250aGAsIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgdHJhbnNmZXIgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgdHJhbnNmZXIgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSB0cmFuc2ZlciByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHRyYW5zZmVyIG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgdHJhbnNmZXIgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uICBUaGUgdHJhbnNmZXIgd2lsbCBiZSBvcmlnaW5hdGVkIG9uIHRoZSBuZXh0IGF2YWlsYWJsZSBiYW5raW5nIGRheSBpZiB0aGUgZGVzaWduYXRlZCBkYXkgaXMgYSBub24gYmFua2luZyBkYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIEZvciBgcnRwYCByZWN1cnJpbmcgdHJhbnNmZXJzLCBgc3RhcnRfZGF0ZWAgbXVzdCBiZSBpbiB0aGUgZnV0dXJlLiBPdGhlcndpc2UsIGlmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci4gIGBhY3RpdmVgOiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGN1cnJlbnRseSBhY3RpdmUuIGBjYW5jZWxsZWRgOiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudCBvciBQbGFpZC4gYGV4cGlyZWRgOiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQgYWxsIG9yaWdpbmF0aW9ucyBhY2NvcmRpbmcgdG8gaXRzIHJlY3VycmluZyBzY2hlZHVsZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyUmVjdXJyaW5nU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlZnVuZCB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNmZXIgdG8gcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSByZWZ1bmQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVyUmVmdW5kU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IFRyYW5zZmVyUmVmdW5kRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIFBsYWlkIExlZGdlciBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHJlZnVuZCB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBGb3IgYHJ0cGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBUcmFuc2FjdGlvbiBJZGVudGlmaWNhdGlvbiBudW1iZXIuIEZvciBgd2lyZWAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBJTUFEIChJbnB1dCBNZXNzYWdlIEFjY291bnRhYmlsaXR5IERhdGEpIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNmZXIgdG8gcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcmVmdW5kIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgcmVmdW5kLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgcmVmdW5kIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHJlZnVuZCBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZDogVHJhbnNmZXJSZWZ1bmQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgZXZlbnQgdHlwZSBmb3IgYSByZWZ1bmQgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSByZWZ1bmQgc3RhdHVzIGlzIGByZXR1cm5lZGAuIFNlZSBbQUNIIHJldHVybiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzIGFuZCBbUlRQL1JmUCBlcnJvciBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI3J0cHJmcC1lcnJvci1jb2RlcykgZm9yIFJUUCBlcnJvciBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAgICAgKi9cbiAgICBmYWlsdXJlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHJlZnVuZCBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgbW9yZSB2ZXJzYXRpbGUgYGZhaWx1cmVfY29kZWAsIHdoaWNoIGVuY29tcGFzc2VzIG5vbi1BQ0ggZmFpbHVyZSBjb2RlcyBhcyB3ZWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmQ6IFRyYW5zZmVyUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWZ1bmQuICBgcGVuZGluZ2A6IEEgbmV3IHJlZnVuZCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIGBwb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBDcmVkaXRzIGhhdmUgYmVlbiByZWZ1bmRlZCB0byB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuIGBjYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gYGZhaWxlZGA6IFRoZSByZWZ1bmQgaGFzIGZhaWxlZC4gYHJldHVybmVkYDogVGhlIHJlZnVuZCB3YXMgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlZnVuZFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIEEgcmVwYXltZW50IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhZnRlciBvbmUgb3IgbW9yZSBndWFyYW50ZWVkIHRyYW5zYWN0aW9ucyByZWNlaXZlIGEgcmV0dXJuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxpZ2libGUgcmV0dXJucyBpbiBhIGRheSwgdGhleSBhcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIGEgc2luZ2xlIHJlcGF5bWVudC4gIFJlcGF5bWVudHMgYXJlIHNlbnQgb3ZlciBBQ0gsIHdpdGggZnVuZHMgdHlwaWNhbGx5IGF2YWlsYWJsZSBvbiB0aGUgbmV4dCBiYW5raW5nIGRheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHJlcGF5bWVudCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlY2ltYWwgYW1vdW50IG9mIHRoZSByZXBheW1lbnQgYXMgaXQgYXBwZWFycyBvbiB5b3VyIGFjY291bnQgbGVkZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSByZXBheW1lbnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgYGNyZWF0ZWRgIGRhdGV0aW1lIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGBjcmVhdGVkYCBkYXRldGltZSBvZiByZXBheW1lbnRzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVwYXltZW50cyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlcGF5bWVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwYXltZW50czogQXJyYXk8VHJhbnNmZXJSZXBheW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHJldHVybiBvbiBhIEd1YXJhbnRlZWQgQUNIIHRyYW5zZmVyIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZCByZXBheW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZ3VhcmFudGVlZCB0cmFuc2ZlciB0aGF0IHdhcyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGByZXR1cm5lZGAgdHJhbnNmZXIgZXZlbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHJlcGF5bWVudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSByZXBheW1lbnQgdG8gcXVlcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVwYXltZW50cyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm4+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9yZXR1cm5zOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdW5pdCBvZiB0aGUgcmVjdXJyaW5nIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdCB7XG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBNb250aCA9ICdtb250aCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gTm90ZSB0aGF0IGZ1bmRzIGZyb20gcmVjZWl2ZWQgZGViaXRzIGFyZSBub3QgYXZhaWxhYmxlIHRvIGJlIG1vdmVkIG91dCBvZiB0aGUgTGVkZ2VyIHVudGlsIHRoZSB0cmFuc2ZlciByZWFjaGVzIGBmdW5kc19hdmFpbGFibGVgIHN0YXR1cy4gRm9yIGNyZWRpdCB0cmFuc2FjdGlvbnMsIGBzZXR0bGVkYCBtZWFucyB0aGUgZnVuZHMgaGF2ZSBiZWVuIGRlbGl2ZXJlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgYWNjb3VudC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSBzdWNjZXNzZnVsIGNyZWRpdCB0cmFuc2Zlci4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIChPbmx5IGFwcGxpY2FibGUgdG8gQUNIIGRlYml0cy4pIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2Zlci4gYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgY2FuY2VsbGVkIHRyYW5zZmVyLiBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSBmYWlsZWQgdHJhbnNmZXIuIGByZXR1cm5lZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXR1cm5lZC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSByZXR1cm5lZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc2V0dGxlZCcsXG4gICAgRnVuZHNBdmFpbGFibGUgPSAnZnVuZHNfYXZhaWxhYmxlJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCdcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBzd2VlcCBvZiBmdW5kcyB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBBIHN3ZWVwIGlzIGFzc29jaWF0ZWQgd2l0aCBtYW55IHN3ZWVwIGV2ZW50cyAoZXZlbnRzIG9mIHR5cGUgYHN3ZXB0YCBvciBgcmV0dXJuX3N3ZXB0YCkgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCBieSBpbnZva2luZyB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBzd2VlcF9pZGAuICBgc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIHRoZSB0cmFuc2ZlciBhbW91bnQgaXMgY3JlZGl0ZWQgb3IgZGViaXRlZCBmcm9tIHlvdXIgc3dlZXAgYWNjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgdHlwZWAgb2YgdGhlIHRyYW5zZmVyLiBgcmV0dXJuX3N3ZXB0YCBldmVudHMgb2NjdXIgd2hlbiBhIHRyYW5zZmVyIGlzIHJldHVybmVkIGFuZCBQbGFpZCB1bmRvZXMgdGhlIGNyZWRpdCBvciBkZWJpdC4gIFRoZSB0b3RhbCBzdW0gb2YgdGhlIGBzd2VwdGAgYW5kIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBpcyBlcXVhbCB0byB0aGUgYGFtb3VudGAgb2YgdGhlIHN3ZWVwIFBsYWlkIGNyZWF0ZXMgYW5kIG1hdGNoZXMgdGhlIGFtb3VudCBvZiB0aGUgZW50cnkgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXAge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIFBsYWlkIExlZGdlciBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2lnbmVkIGRlY2ltYWwgYW1vdW50IG9mIHRoZSBzd2VlcCBhcyBpdCBhcHBlYXJzIG9uIHlvdXIgc3dlZXAgYWNjb3VudCBsZWRnZXIgKGUuZy4gXFxcIi0xMC4wMFxcXCIpICBJZiBhbW91bnQgaXMgbm90IHByZXNlbnQsIHRoZSBzd2VlcCB3YXMgbmV0LXNldHRsZWQgdG8gemVybyBhbmQgb3V0c3RhbmRpbmcgZGViaXRzIGFuZCBjcmVkaXRzIGJldHdlZW4gdGhlIHN3ZWVwIGFjY291bnQgYW5kIFBsYWlkIGFyZSBiYWxhbmNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzd2VlcCBzZXR0bGVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHNldHRsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgd2hlbiBmdW5kcyBmcm9tIGEgbGVkZ2VyIGRlcG9zaXQgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhc3NvY2lhdGVkIGxlZGdlciBiYWxhbmNlLiBPbmx5IGFwcGxpZXMgdG8gZGVwb3NpdHMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBleHBlY3RlZF9mdW5kc19hdmFpbGFibGVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc3RhdHVzPzogU3dlZXBTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEZvciBgcnRwYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIFRyYW5zYWN0aW9uIElkZW50aWZpY2F0aW9uIG51bWJlci4gRm9yIGB3aXJlYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIElNQUQgKElucHV0IE1lc3NhZ2UgQWNjb3VudGFiaWxpdHkgRGF0YSkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBTd2VlcEZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN3ZWVwIChVVUlEKSBvciBhIHNob3J0ZW5lZCBmb3JtIGNvbnNpc3Rpbmcgb2YgdGhlIGZpcnN0IDggY2hhcmFjdGVycyBvZiB0aGUgaWRlbnRpZmllciAoOC1kaWdpdCBoZXhhZGVjaW1hbCBzdHJpbmcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGBjcmVhdGVkYCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzd2VlcHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBpbmNsdWRlZCBgdHJhbnNmZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PFRyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBzd2VlcCBmb3IgdGhlIHRyYW5zZmVyLiAgYHVuc3dlcHRgOiBUaGUgdHJhbnNmZXIgaGFzblxcJ3QgYmVlbiBzd2VwdCB5ZXQuIGBzd2VwdGA6IFRoZSB0cmFuc2ZlciB3YXMgc3dlcHQgdG8gdGhlIHN3ZWVwIGFjY291bnQuIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVyXFwncyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiBgcmV0dXJuX3N3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdWxsZWQgYmFjayBvciBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC4gYG51bGxgOiBUaGUgdHJhbnNmZXIgd2lsbCBuZXZlciBiZSBzd2VwdCAoZS5nLiBpZiB0aGUgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIG9yIHJldHVybmVkIGJlZm9yZSBiZWluZyBzd2VwdClcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3dlZXBTdGF0dXMge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgVW5zd2VwdCA9ICd1bnN3ZXB0JyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB0ZXN0IGNsb2NrIGZvciBhIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclRlc3RDbG9ja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYW5kIG9ubHkgaWYgYSBgdGVzdF9jbG9ja19pZGAgd2FzIGluY2x1ZGVkIGluIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHJlcXVlc3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2ltdWxhdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3NhbmRib3gvI3NpbXVsYXRpbmctcmVjdXJyaW5nLXRyYW5zZmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclRlc3RDbG9ja1xuICAgICAqL1xuICAgIHZpcnR1YWxfdGltZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBUaGUgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXguIFxcXCJTYW4gRnJhbmNpc2NvXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIChlLmcuLCBcXFwiVVNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci4gUGhvbmUgbnVtYmVyIGlucHV0IG1heSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHdpcmUgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlcldpcmVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJXaXJlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3aXJlIG9yaWdpbmF0b3IgdG8gdGhlIGJlbmVmaWNpYXJ5LiBNYXggMTQwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJXaXJlRGV0YWlsc1xuICAgICAqL1xuICAgIG1lc3NhZ2VfdG9fYmVuZWZpY2lhcnk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmZWUgYW1vdW50IGRlZHVjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHRyYW5zZmVyIGR1cmluZyBhIHdpcmUgcmV0dXJuLCBpZiBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyV2lyZURldGFpbHNcbiAgICAgKi9cbiAgICB3aXJlX3JldHVybl9mZWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2FsY3VsYXRlZCBUcnVzdCBJbmRleCBTY29yZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJ1c3RJbmRleFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0SW5kZXgge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdmVyYWxsIHRydXN0IGluZGV4IHNjb3JlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uZWQgbmFtZSBvZiB0aGUgVHJ1c3QgSW5kZXggbW9kZWwgdXNlZCBmb3Igc2NvcmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcnVzdEluZGV4XG4gICAgICovXG4gICAgbW9kZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJ1c3RJbmRleFN1YnNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJ1c3RJbmRleFxuICAgICAqL1xuICAgIHN1YnNjb3JlczogVHJ1c3RJbmRleFN1YnNjb3JlcyB8IG51bGw7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgVHJ1c3QgSW5kZXggU3Vic2NvcmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRydXN0SW5kZXhTdWJzY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0SW5kZXhTdWJzY29yZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YnNjb3JlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhTdWJzY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIENvbnRhaW5zIHN1Yi1zY29yZSBtZXRhZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJ1c3RJbmRleFN1YnNjb3Jlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0SW5kZXhTdWJzY29yZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcnVzdEluZGV4U3Vic2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhTdWJzY29yZXNcbiAgICAgKi9cbiAgICBkZXZpY2VfYW5kX2Nvbm5lY3Rpb24/OiBUcnVzdEluZGV4U3Vic2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcnVzdEluZGV4U3Vic2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhTdWJzY29yZXNcbiAgICAgKi9cbiAgICBiYW5rX2FjY291bnRfaW5zaWdodHM/OiBUcnVzdEluZGV4U3Vic2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBUcnVzdGVkIERldmljZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJldmlvdXMgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcnVzdGVkRGV2aWNlRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0ZWREZXZpY2VEYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcnVzdGVkRGV2aWNlRGF0YVxuICAgICAqL1xuICAgIHRydXN0X2xldmVsPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXZpY2VJZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJ1c3RlZERldmljZURhdGFcbiAgICAgKi9cbiAgICBkZXZpY2VfaWQ/OiBEZXZpY2VJZDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybD86IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGZvciBlZGl0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgYmVpbmcgc2NyZWVuZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWxwaGFiZXRpY2FsIGNoYXJhY3RlciwgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLCBhbmQgbm90IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZGF0YSBwZXJtaXNzaW9uZWQgYnkgdGhlIGVuZCB1c2VyIGR1cmluZyB0aGUgYXV0aG9yaXphdGlvbiBmbG93LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHlOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbmFtZT86IFVzZXJBY2NvdW50SWRlbnRpdHlOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIgaW4gW0UuMTY0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FLjE2NCkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy4gIE5vdGU6IGVtYWlsIGlzIGN1cnJlbnRseSBub3QgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZGF0ZSBvZiBiaXJ0aC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIFNvY2lhbCBTZWN1cml0eSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHNzbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHVzZXJcXCdzIFNvY2lhbCBTZWN1cml0eSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHNzbl9sYXN0XzQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWNvbmQgbGluZSBzdHJlZXQgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFZGl0IGNvdW50cyBvdmVyIHZhcmlvdXMgdGltZSBwZXJpb2RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZWRpdHMgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzXG4gICAgICovXG4gICAgZWRpdHNfY3VycmVudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZWRpdHMgaW4gdGhlIGxhc3QgMSBkYXlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c1xuICAgICAqL1xuICAgIGVkaXRzXzFkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBlZGl0cyBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRDb3VudHNcbiAgICAgKi9cbiAgICBlZGl0c18zMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGVkaXRzIGluIHRoZSBsYXN0IDM2NSBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRDb3VudHNcbiAgICAgKi9cbiAgICBlZGl0c18zNjVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBlZGl0c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzXG4gICAgICovXG4gICAgZWRpdHNfYWxsX3RpbWU/OiBudW1iZXI7XG59XG4vKipcbiAqIFN0YXRpc3RpY3MgdHJhY2tpbmcgdGhlIG51bWJlciBvZiBlZGl0cyBtYWRlIHRvIGlkZW50aXR5IGZpZWxkcyBvdmVyIHZhcmlvdXMgdGltZSBwZXJpb2RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5RWRpdEhpc3RvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5RWRpdEhpc3Rvcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5XG4gICAgICovXG4gICAgbmFtZT86IFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5XG4gICAgICovXG4gICAgZW1haWw/OiBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eUVkaXRDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0SGlzdG9yeVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eU9mZmljaWFsRG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0SGlzdG9yeVxuICAgICAqL1xuICAgIG9mZmljaWFsX2RvY3VtZW50PzogVXNlckFjY291bnRJZGVudGl0eU9mZmljaWFsRG9jdW1lbnQgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZSBhbmQgbGFzdCBuYW1lLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5TmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlOYW1lIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5TmFtZVxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9mZmljaWFsIGlkZW50aXR5IGRvY3VtZW50IGVkaXQgc3RhdGlzdGljcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eU9mZmljaWFsRG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5T2ZmaWNpYWxEb2N1bWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5T2ZmaWNpYWxEb2N1bWVudFxuICAgICAqL1xuICAgIHNzbj86IFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzO1xufVxuLyoqXG4gKiBBbiBJdGVtIGNyZWF0ZWQgZHVyaW5nIGEgTGF5ZXIgYXV0aG9yaXphdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYCB3ZWJob29rIGlzIGZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBzZW50IG9ubHkgZm9yIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdGhhdCBhbGxvdyBhY2NvdW50LWxldmVsIHBlcm1pc3Npb25zIHJldm9jYXRpb24gdGhyb3VnaCB0aGVpciBwb3J0YWxzLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgUGxhaWQtZGVyaXZlZCBkYXRhIHlvdSBoYXZlIHN0b3JlZCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV2b2tlZCBhY2NvdW50LiAgSWYgeW91IGFyZSB1c2luZyBBdXRoIGFuZCByZWNlaXZlIHRoaXMgd2ViaG9vaywgdGhpcyB3ZWJob29rIGluZGljYXRlcyB0aGF0IHRoZSBUQU4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXZva2VkIGFjY291bnQgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgbmV3IHRyYW5zZmVycy4gWW91IHNob3VsZCBub3QgY3JlYXRlIG5ldyBBQ0ggdHJhbnNmZXJzIGZvciB0aGUgYWNjb3VudCB0aGF0IHdhcyByZXZva2VkIHVudGlsIGFjY2VzcyBoYXMgYmVlbiByZS1ncmFudGVkLiAgWW91IGNhbiByZXF1ZXN0IHRoZSB1c2VyIHRvIHJlLWdyYW50IGFjY2VzcyB0byB0aGVpciBhY2NvdW50IGJ5IHNlbmRpbmcgdGhlbSB0aHJvdWdoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gQWx0ZXJuYXRpdmVseSwgdGhleSBtYXkgcmUtZ3JhbnQgYWNjZXNzIGRpcmVjdGx5IHRocm91Z2ggdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gIEFmdGVyIHRoZSB1c2VyIGhhcyByZS1ncmFudGVkIGFjY2VzcywgQXV0aCBjdXN0b21lcnMgc2hvdWxkIGNhbGwgdGhlIGF1dGggZW5kcG9pbnQgYWdhaW4gdG8gb2J0YWluIHRoZSBuZXcgVEFOLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRSZXZva2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX0FDQ09VTlRfUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEV2ZW50IGRhdGEgZm9yIHVzZXIgYWNjb3VudCBzZXNzaW9uIHRyYWNraW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGV2ZW50IG9jY3VycmVkIGluIElTTyA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIG91dGNvbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50XG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyX2FjY291bnQvc2Vzc2lvbi9ldmVudC9zZW5kYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGNvaG9ydCBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb2hvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRTZXNzaW9uRXZlbnR9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudDogVXNlckFjY291bnRTZXNzaW9uRXZlbnQ7XG59XG4vKipcbiAqIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyX2FjY291bnQvc2Vzc2lvbi9ldmVudC9zZW5kYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBlbmQgdXNlciBMYXllciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHk6IFVzZXJBY2NvdW50SWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxVc2VyQWNjb3VudEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxVc2VyQWNjb3VudEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdEhpc3Rvcnl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHlfZWRpdF9oaXN0b3J5PzogVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEhvbWUgYWRkcmVzcyBmb3IgdGhlIHVzZXIuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBub3QgcHJvdmlkZWQsIGFkZHJlc3Mgd2l0aCBvbmx5IGNvdW50cnkgY29kZSBvciBmdWxsIGFkZHJlc3MuICBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZS4gXFxcIlN1YmRpdmlzaW9uXFxcIiBpcyBhIGdlbmVyaWMgdGVybSBmb3IgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIGV0Yy4gRm9yIHRoZSBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgdXNlci1iYXNlZCBwcm9kdWN0cy4gVXNlci1iYXNlZCBwcm9kdWN0cyBpbmNsdWRlIEZpbmFuY2lhbCBNYW5hZ2VtZW50IHByb2R1Y3RzLCBQcm90ZWN0IHByb2R1Y3RzLCBDUkEgcHJvZHVjdHMsIGFuZCBzdWJzY3JpcHRpb24gcHJvZHVjdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyQmFzZWRQcm9kdWN0cyB7XG4gICAgQ3JhQmFzZVJlcG9ydCA9ICdjcmFfYmFzZV9yZXBvcnQnLFxuICAgIENyYUluY29tZUluc2lnaHRzID0gJ2NyYV9pbmNvbWVfaW5zaWdodHMnLFxuICAgIENyYVBhcnRuZXJJbnNpZ2h0cyA9ICdjcmFfcGFydG5lcl9pbnNpZ2h0cycsXG4gICAgQ3JhTmV0d29ya0luc2lnaHRzID0gJ2NyYV9uZXR3b3JrX2luc2lnaHRzJyxcbiAgICBDcmFDYXNoZmxvd0luc2lnaHRzID0gJ2NyYV9jYXNoZmxvd19pbnNpZ2h0cycsXG4gICAgQ3JhTW9uaXRvcmluZyA9ICdjcmFfbW9uaXRvcmluZycsXG4gICAgQ3JhTGVuZFNjb3JlID0gJ2NyYV9sZW5kX3Njb3JlJyxcbiAgICBDcmFQbGFpZENyZWRpdFNjb3JlID0gJ2NyYV9wbGFpZF9jcmVkaXRfc2NvcmUnLFxuICAgIEludmVzdG1lbnRzID0gJ2ludmVzdG1lbnRzJyxcbiAgICBMaWFiaWxpdGllcyA9ICdsaWFiaWxpdGllcycsXG4gICAgUHJvdGVjdExpbmtlZEJhbmsgPSAncHJvdGVjdF9saW5rZWRfYmFuaycsXG4gICAgUHJvdGVjdFRyYW5zYWN0aW9ucyA9ICdwcm90ZWN0X3RyYW5zYWN0aW9ucycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ3RyYW5zYWN0aW9ucydcbn1cblxuLyoqXG4gKiBVc2VyQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NsaWVudFVzZXJJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IENsaWVudFVzZXJJZGVudGl0eSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIGEgQ1JBIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5PzogQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHlvdXIgaW50ZWdyYXRpb24gd2l0aCB0aGUgVXNlciBBUEkgcHJlZGF0ZXMgRGVjZW1iZXIgMTAsIDIwMjUsIHNldCB0aGlzIGZpZWxkIHRvIGB0cnVlYCB0byBvcHQgaW50byB0aGUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcy8pLiBXaGVuIGVuYWJsZWQsIHlvdSBjYW4gdXNlIHRoZSBgaWRlbnRpdHlgIGZpZWxkIGluc3RlYWQgb2YgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXRoX3VwZ3JhZGVkX3VzZXI/OiBib29sZWFuO1xufVxuLyoqXG4gKiBVc2VyQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmQge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGFPdmVydmlldyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGB1c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGB1c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWZyZXNoIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxSZWZyZXNoUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXN1bHRzPzogQXJyYXk8UmVmcmVzaFJlc3VsdD47XG59XG4vKipcbiAqIFVzZXJHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBwcm92aWRlZCB1c2VyIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBvZiB1c2VyIGNyZWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgb2YgbGFzdCB1c2VyIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkZW50aXR5PzogQ2xpZW50VXNlcklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogSUQgbnVtYmVyIHN1Ym1pdHRlZCBieSB0aGUgdXNlciwgY3VycmVudGx5IHVzZWQgb25seSBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0LiBJZiB0aGUgdXNlciBoYXMgbm90IHN1Ym1pdHRlZCB0aGlzIGRhdGEgeWV0LCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLiBPdGhlcndpc2UsIGJvdGggZmllbGRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlcklETnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlcklETnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiB0aGUgaWRlbnRpdHkgZG9jdW1lbnQgdHlwZWQgaW4gYnkgdGhlIHVzZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC4gRm9yIHNwZWNpZmljIGZvcm1hdCByZXF1aXJlbWVudHMgYnkgSUQgdHlwZSwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaWQtbnVtYmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SUROdW1iZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBJRE51bWJlclR5cGU7XG59XG4vKipcbiAqIFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9pZGVudGl0eS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlcklkZW50aXR5UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvaWRlbnRpdHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySWRlbnRpdHlSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJZGVudGl0eVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklkZW50aXR5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9pdGVtcy9hc3NvY2lhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHVzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFVzZXJJdGVtc0Fzc29jaWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL2l0ZW1zL2Fzc29jaWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckl0ZW1zQXNzb2NpYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySXRlbXNBc3NvY2lhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0Fzc29jaWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VySXRlbXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckl0ZW1zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJJdGVtc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL2l0ZW1zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckl0ZW1zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9pdGVtcy9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySXRlbXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIHRvIGJlIGRlbGV0ZWQuIEFsbCBJdGVtcyBmb3IgcmVtb3ZhbCBtdXN0IGJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAuIE90aGVyd2lzZSwgdGhlIGVudGlyZSBvcGVyYXRpb24gd2lsbCBlcnJvciBhbmQgbm8gSXRlbXMgd2lsbCBiZSBkZWxldGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFVzZXJJdGVtc1JlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL2l0ZW1zL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckl0ZW1zUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySXRlbXNSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc1JlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfUEVSTUlTU0lPTl9SRVZPS0VEYCB3ZWJob29rIG1heSBiZSBmaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhleSBwcmV2aW91c2x5IGdyYW50ZWQgdG8gYWNjZXNzIGFuIEl0ZW0uIElmIHRoZSBlbmQgdXNlciByZXZva2VkIHRoZWlyIHBlcm1pc3Npb25zIHRocm91Z2ggUGxhaWQgKHN1Y2ggYXMgdmlhIHRoZSBQbGFpZCBQb3J0YWwgb3IgYnkgY29udGFjdGluZyBQbGFpZCBzdXBwb3J0KSwgdGhlIHdlYmhvb2sgd2lsbCBmaXJlLiBJZiB0aGUgZW5kIHVzZXIgcmV2b2tlZCB0aGVpciBwZXJtaXNzaW9ucyBkaXJlY3RseSB0aHJvdWdoIHRoZSBpbnN0aXR1dGlvbiwgdGhpcyB3ZWJob29rIG1heSBub3QgYWx3YXlzIGZpcmUsIHNpbmNlIHNvbWUgaW5zdGl0dXRpb25zXFwnIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFRvIGF0dGVtcHQgdG8gcmVzdG9yZSB0aGUgSXRlbSwgaXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuIERlcGVuZGluZyBvbiB0aGUgZXhhY3QgcHJvY2VzcyB0aGUgZW5kIHVzZXIgdXNlZCB0byByZXZva2UgcGVybWlzc2lvbnMsIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gbGF1bmNoIHVwZGF0ZSBtb2RlIGZvciB0aGUgSXRlbS4gSWYgeW91IGVuY291bnRlciBhbiBlcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXBkYXRlIG1vZGUgb24gYW4gSXRlbSB3aXRoIHJldm9rZWQgcGVybWlzc2lvbnMsIGNyZWF0ZSBhIGZyZXNoIExpbmsgdG9rZW4gZm9yIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdoZW4gd29ya2luZyB3aXRoIHRva2VuaXplZCBhY2NvdW50IG51bWJlcnMgd2l0aCBBdXRoIG9yIFRyYW5zZmVyLCB0aGUgYWNjb3VudCBudW1iZXIgcHJvdmlkZWQgYnkgUGxhaWQgd2lsbCBubyBsb25nZXIgd29yayBmb3IgY3JlYXRpbmcgdHJhbnNmZXJzIG9uY2UgdXNlciBwZXJtaXNzaW9uIGhhcyBiZWVuIHJldm9rZWQsIGV4Y2VwdCBmb3IgVVMgQmFuayBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVhc29uIGZvciB0ZXJtaW5hdGluZyB1c2VyLWJhc2VkIHByb2R1Y3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZWFzb25Db2RlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclByb2R1Y3RzVGVybWluYXRlUmVhc29uQ29kZSB7XG59XG4vKipcbiAqIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9wcm9kdWN0cy90ZXJtaW5hdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclByb2R1Y3RzVGVybWluYXRlUmVhc29uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlOiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZWFzb25Db2RlO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgY29udGV4dCBvciBkZXRhaWxzIGFib3V0IHRoZSByZWFzb24gZm9yIHRlcm1pbmF0aW5nIHVzZXItYmFzZWQgcHJvZHVjdHMuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBgcmVhc29uX25vdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWFzb25fbm90ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeSB7XG4gICAgT3RoZXIgPSAnT1RIRVInLFxuICAgIFNhbGFyeSA9ICdTQUxBUlknLFxuICAgIFVuZW1wbG95bWVudCA9ICdVTkVNUExPWU1FTlQnLFxuICAgIENhc2ggPSAnQ0FTSCcsXG4gICAgR2lnRWNvbm9teSA9ICdHSUdfRUNPTk9NWScsXG4gICAgUmVudGFsID0gJ1JFTlRBTCcsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NISUxEX1NVUFBPUlQnLFxuICAgIE1pbGl0YXJ5ID0gJ01JTElUQVJZJyxcbiAgICBSZXRpcmVtZW50ID0gJ1JFVElSRU1FTlQnLFxuICAgIExvbmdUZXJtRGlzYWJpbGl0eSA9ICdMT05HX1RFUk1fRElTQUJJTElUWScsXG4gICAgQmFua0ludGVyZXN0ID0gJ0JBTktfSU5URVJFU1QnXG59XG5cbi8qKlxuICogVGhlIHBheSBmcmVxdWVuY3kgb2YgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVXNlclN0YXRlZEluY29tZVNvdXJjZUZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknXG59XG5cbi8qKlxuICogVGhlIHBheSB0eXBlIC0gYEdST1NTYCwgYE5FVGAsIG9yIGBVTktOT1dOYCBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVXNlclN0YXRlZEluY29tZVNvdXJjZVBheVR5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgR3Jvc3MgPSAnR1JPU1MnLFxuICAgIE5ldCA9ICdORVQnXG59XG5cbi8qKlxuICogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBBUEkgYGNsaWVudF9pZGAgb2YgdGhlIHRoaXJkLXBhcnR5IGNsaWVudCB0aGUgdG9rZW4gd2lsbCBiZSBzaGFyZWQgd2l0aC4gVGhlIHRva2VuIHdpbGwgb25seSBiZSB2YWxpZCBmb3IgdGhlIHNwZWNpZmllZCBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwaXJhdGlvbiBkYXRlIGFuZCB0aW1lIGZvciB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGUgZXhwaXJhdGlvbiBpcyByZXN0cmljdGVkIHRvIGEgbWF4aW11bSBvZiAyNCBob3VycyBmcm9tIHRoZSB0b2tlblxcJ3MgY3JlYXRpb24gdGltZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgdG9rZW4gd2lsbCBhdXRvbWF0aWNhbGx5IGV4cGlyZSBhZnRlciAyNCBob3Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3RoaXJkX3BhcnR5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYHVzZXIvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGB1c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVmcmVzaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxSZWZyZXNoUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBBcnJheTxSZWZyZXNoUmVzdWx0Pjtcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2xpZW50VXNlcklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5PzogQ2xpZW50VXNlcklkZW50aXR5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWYWxpZGF0aW9uU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VcbiAgICAgKi9cbiAgICBWYWxpZGF0aW9uU291cmNlTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VSZWZlcmVuY2VJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VmFsaWRhdGlvblNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VzXG4gICAgICovXG4gICAgVkFMSURBVElPTl9TT1VSQ0U6IEFycmF5PFZhbGlkYXRpb25Tb3VyY2U+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2FzIG5vdCB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFmdGVyIHNldmVuIGRheXMgc2luY2UgdGhlIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0IHdhcyBtYWRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IFJlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQXNzZXRzO1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVUNDRVNTRlVMXFxcImAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaCB3YXMgc3VjY2Vzc2Z1bC4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9OT1RfRk9VTkRcXFwiYCBObyBuZXcgZGF0YSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXMge1xuICAgIFN0YXR1c1VzZXJQcmVzZW5jZVJlcXVpcmVkID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NUQVRVU19VU0VSX1BSRVNFTkNFX1JFUVVJUkVEJyxcbiAgICBTdWNjZXNzZnVsID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUwnLFxuICAgIE5vdEZvdW5kID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUVEXFxcImA6IFRoZSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgYFxcXCJVTlZFUklGSUVEXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBwZXJmb3JtZWQuICBgXFxcIk5FRURTX0lORk9cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiB3YXMgYXR0ZW1wdGVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBtaXNzaW5nIGluZm9ybWF0aW9uLiAgXFxcImBVTkFCTEVfVE9fVkVSSUZZYFxcXCI6IFRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBcXFwiVU5LTk9XTlxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBWZXJpZmllZCA9ICdWRVJJRklFRCcsXG4gICAgVW52ZXJpZmllZCA9ICdVTlZFUklGSUVEJyxcbiAgICBOZWVkc0luZm8gPSAnTkVFRFNfSU5GTycsXG4gICAgVW5hYmxlVG9WZXJpZnkgPSAnVU5BQkxFX1RPX1ZFUklGWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgdmVyaWZ5X3Ntc2Agc3RlcC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZ5U01TRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVNNU0RldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZnlTTVNEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBWZXJpZnlTTVNEZXRhaWxzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhIHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciB0aGUgYHZlcmlmeV9zbXNgIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlci1zdWJtaXR0ZWQgcGhvbmUgbnVtYmVyLiBQaG9uZSBudW1iZXIgZWRpdHMsIGFuZCBpbiBzb21lIGNhc2VzIGVycm9yIGhhbmRsaW5nIGR1ZSB0byBlZGdlIGNhc2VzIGxpa2UgcmF0ZSBsaW1pdGluZywgbWF5IGdlbmVyYXRlIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U01TVmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZ5U01TRGV0YWlsc1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbnM6IEFycmF5PFNNU1ZlcmlmaWNhdGlvbj47XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGB2ZXJpZnlfc21zYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnZlcmlmeV9zbXNgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZ5U01TRGV0YWlsc1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGF4X3llYXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBTb2NpYWwgU2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBTZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBTb2NpYWwgU2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfOT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgb3RoZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzPzogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyQm94MTIge1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMkJveDEyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJPdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIFNvY2lhbCBTZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgU2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gU29jaWFsIFNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94Xzk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG90aGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlPjtcbn1cbi8qKlxuICogVzIgc3RhdGUgYW5kIGxvY2FsIHdhZ2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxpdHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXRlX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xufVxuLyoqXG4gKiBXYWxsZXRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUsIHVzZWQgd2l0aCBlLXdhbGxldHMgYW5kIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldElTT0N1cnJlbmN5Q29kZSB7XG4gICAgR2JwID0gJ0dCUCcsXG4gICAgRXVyID0gJ0VVUidcbn1cblxuLyoqXG4gKiBXYWxsZXRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IFdhbGxldElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCBlLXdhbGxldCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gZS13YWxsZXRzIGNyZWF0ZWQgYmVmb3JlIHRoYXQgZS13YWxsZXQuIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gZS13YWxsZXRzIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGUtd2FsbGV0cyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdhbGxldExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZS13YWxsZXRzXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldD59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldHM6IEFycmF5PFdhbGxldD47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGUgbGF0ZXN0IGUtd2FsbGV0IHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbElCQU59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgc2NoZW1lIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBBWU9VVGAgYW5kIGBSRUZVTkRgLiAgYEZBU1RFUl9QQVlNRU5UU2A6IFRoZSBzdGFuZGFyZCBwYXltZW50IHNjaGVtZSB3aXRoaW4gdGhlIFVLLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSYDogVGhlIHN0YW5kYXJkIHBheW1lbnQgdG8gYSBiZW5lZmljaWFyeSB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UYDogSW5zdGFudCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRQYXltZW50U2NoZW1lIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIEZhc3RlclBheW1lbnRzID0gJ0ZBU1RFUl9QQVlNRU5UUycsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVyID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXJJbnN0YW50ID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlQnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgd2FsbGV0LiAgYFVOS05PV05gOiBUaGUgd2FsbGV0IHN0YXR1cyBpcyB1bmtub3duLiAgYEFDVElWRWA6IFRoZSB3YWxsZXQgaXMgYWN0aXZlIGFuZCByZWFkeSB0byBzZW5kIG1vbmV5IHRvIGFuZCByZWNlaXZlIG1vbmV5IGZyb20uICBgQ0xPU0VEYDogVGhlIHdhbGxldCBpcyBjbG9zZWQuIEFueSB0cmFuc2FjdGlvbnMgbWFkZSB0byBvciBmcm9tIHRoaXMgd2FsbGV0IHdpbGwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRTdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgQ2xvc2VkID0gJ0NMT1NFRCdcbn1cblxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LiAgYFJFQ0FMTGA6IGEgdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHNlbmRpbmcgYmFuayBoYXMgcmVxdWVzdGVkIHRoZSByZXR1cm4gb2YgZnVuZHMgZHVlIHRvIGEgZnJhdWQgY2xhaW0sIHRlY2huaWNhbCBlcnJvciwgb3Igb3RoZXIgaXNzdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LiAgYEFDQ09VTlRfRlVORElOR2A6IGFuIGluY29taW5nIHRyYW5zZmVyIGZyb20gYW4gYWxsb3dsaXN0ZWQgYWNjb3VudC4gTm90IGF1dG9tYXRpY2FsbHkgcmVmdW5kZWQuICBgQVVUT19SRUZVTkRgOiBhbiBvdXRnb2luZyByZWZ1bmQgYXV0b21hdGljYWxseSBpbml0aWF0ZWQgYnkgUGxhaWQgaW4gcmVzcG9uc2UgdG8gYW4gdW5leHBlY3RlZCBgQkFOS19UUkFOU0ZFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBXYWxsZXRUcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHNjaGVtZT86IFdhbGxldFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCB3aGVuIHRoZSB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX3VwZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblBheWVlVmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheWVlX3ZlcmlmaWNhdGlvbl9zdGF0dXM/OiBXYWxsZXRUcmFuc2FjdGlvblBheWVlVmVyaWZpY2F0aW9uU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBpZCB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IGZvciB0cmFuc2FjdGlvbiB0eXBlcyBgUElTX1BBWV9JTmAgYW5kIGBSRUZVTkRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygd2FsbGV0IHRyYW5zYWN0aW9ucyB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHJlbGF0ZWRfdHJhbnNhY3Rpb25zPzogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbj47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25UeXBlRW51bSB7XG4gICAgQmFua1RyYW5zZmVyID0gJ0JBTktfVFJBTlNGRVInLFxuICAgIFBheW91dCA9ICdQQVlPVVQnLFxuICAgIFBpc1BheUluID0gJ1BJU19QQVlfSU4nLFxuICAgIFJlZnVuZCA9ICdSRUZVTkQnLFxuICAgIEZ1bmRzU3dlZXAgPSAnRlVORFNfU1dFRVAnLFxuICAgIFJldHVybiA9ICdSRVRVUk4nLFxuICAgIFJlY2FsbCA9ICdSRUNBTEwnLFxuICAgIEFjY291bnRGdW5kaW5nID0gJ0FDQ09VTlRfRlVORElORycsXG4gICAgQXV0b1JlZnVuZCA9ICdBVVRPX1JFRlVORCdcbn1cblxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IFdhbGxldElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldCB0cmFuc2FjdGlvblxcJ3MgY291bnRlcnBhcnR5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHkge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHlcXCdzIGJpcnRoZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZSBvZiB0aGUgY291bnRlcnBhcnR5XFwncyBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDUyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIGZvciBhIFdhbGxldCBUcmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWwge1xuICAgIC8qKlxuICAgICAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmFuayBhY2NvdW50IG51bWJlcnMuIEV4YWN0bHkgb25lIG9mIElCQU4gb3IgQmFjcyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbCB8IG51bGw7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLiBFbnN1cmUgdGhhdCB0aGUgYHJlZmVyZW5jZWAgZmllbGQgaXMgdW5pcXVlIGZvciBlYWNoIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3JpZ2luYXRpbmdGdW5kU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpbmdfZnVuZF9zb3VyY2U/OiBPcmlnaW5hdGluZ0Z1bmRTb3VyY2UgfCBudWxsO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlcnJvciBjb2RlIG9mIGEgZmFpbGVkIHRyYW5zYWN0aW9uLiBFcnJvciBjb2RlcyBpbmNsdWRlOiBgRVhURVJOQUxfU1lTVEVNYDogVGhlIHRyYW5zYWN0aW9uIHdhcyBkZWNsaW5lZCBieSBhbiBleHRlcm5hbCBzeXN0ZW0uIGBFWFBJUkVEYDogVGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QgaGFzIGV4cGlyZWQuIGBDQU5DRUxMRURgOiBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCB3YXMgcmVzY2luZGVkLiBgSU5WQUxJRGA6IFRoZSB0cmFuc2FjdGlvbiBkaWQgbm90IG1lZXQgY2VydGFpbiBjcml0ZXJpYSwgc3VjaCBhcyBhbiBpbmFjdGl2ZSBhY2NvdW50IG9yIG5vIHZhbGlkIGNvdW50ZXJwYXJ0eSwgZXRjLiBgQUNDT1VOVF9JTlZBTElEYDogVGhlIHRyYW5zYWN0aW9uIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSB0aGUgd2FsbGV0IGFjY291bnQgaXMgaW52YWxpZCBvciBpbmFjdGl2ZS4gYEFVVEhFTlRJQ0FUSU9OX0ZBSUxFRGA6IFRoZSB0cmFuc2FjdGlvbiBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2UgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgd2FsbGV0IHByb3ZpZGVyIGZhaWxlZC4gYFVOS05PV05gOiBUaGUgdHJhbnNhY3Rpb24gd2FzIHVuc3VjY2Vzc2Z1bCwgYnV0IHRoZSBleGFjdCBjYXVzZSBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHtcbiAgICBFeHRlcm5hbFN5c3RlbSA9ICdFWFRFUk5BTF9TWVNURU0nLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCcsXG4gICAgQ2FuY2VsbGVkID0gJ0NBTkNFTExFRCcsXG4gICAgSW52YWxpZCA9ICdJTlZBTElEJyxcbiAgICBBY2NvdW50SW52YWxpZCA9ICdBQ0NPVU5UX0lOVkFMSUQnLFxuICAgIEF1dGhlbnRpY2F0aW9uRmFpbGVkID0gJ0FVVEhFTlRJQ0FUSU9OX0ZBSUxFRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2FjdGlvbiB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LiAgYFJFQ0FMTGA6IGEgdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHNlbmRpbmcgYmFuayBoYXMgcmVxdWVzdGVkIHRoZSByZXR1cm4gb2YgZnVuZHMgZHVlIHRvIGEgZnJhdWQgY2xhaW0sIHRlY2huaWNhbCBlcnJvciwgb3Igb3RoZXIgaXNzdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LiAgYEFDQ09VTlRfRlVORElOR2A6IGFuIGluY29taW5nIHRyYW5zZmVyIGZyb20gYW4gYWxsb3dsaXN0ZWQgYWNjb3VudC4gTm90IGF1dG9tYXRpY2FsbHkgcmVmdW5kZWQuICBgQVVUT19SRUZVTkRgOiBhbiBvdXRnb2luZyByZWZ1bmQgYXV0b21hdGljYWxseSBpbml0aWF0ZWQgYnkgUGxhaWQgaW4gcmVzcG9uc2UgdG8gYW4gdW5leHBlY3RlZCBgQkFOS19UUkFOU0ZFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHR5cGU6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNjaGVtZT86IFdhbGxldFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCB3aGVuIHRoZSB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25QYXllZVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheWVlX3ZlcmlmaWNhdGlvbl9zdGF0dXM/OiBXYWxsZXRUcmFuc2FjdGlvblBheWVlVmVyaWZpY2F0aW9uU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBpZCB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IGZvciB0cmFuc2FjdGlvbiB0eXBlcyBgUElTX1BBWV9JTmAgYW5kIGBSRUZVTkRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygd2FsbGV0IHRyYW5zYWN0aW9ucyB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXRlZF90cmFuc2FjdGlvbnM/OiBBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWNhbGwgPSAnUkVDQUxMJyxcbiAgICBBY2NvdW50RnVuZGluZyA9ICdBQ0NPVU5UX0ZVTkRJTkcnLFxuICAgIEF1dG9SZWZ1bmQgPSAnQVVUT19SRUZVTkQnXG59XG5cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlLiBTZXQgdGhpcyBmcm9tIGBuZXh0X2N1cnNvcmAgcmVjZWl2ZWQgaW4gdGhlIHByZXZpb3VzIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gdGhhdCB0cmFuc2FjdGlvbiBhbmQgdHJhbnNhY3Rpb25zIGNyZWF0ZWQgYmVmb3JlIGl0LiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRyYW5zYWN0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQWRkaXRpb25hbCB3YWxsZXQgdHJhbnNhY3Rpb24gb3B0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRoaDptbTpzc1opIGZvciBmaWx0ZXJpbmcgdHJhbnNhY3Rpb25zLCBpbmNsdXNpdmUgb2YgdGhlIHByb3ZpZGVkIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMgb2YgYW4gZS13YWxsZXQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHdhbGxldF9pZGBcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSB0aGF0LCB3aGVuIHVzZWQgYXMgdGhlIG9wdGlvbmFsIGBjdXJzb3JgIHBhcmFtZXRlciB0byBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YCwgd2lsbCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNhY3Rpb24gYXMgaXRzIGZpcnN0IGVudHJ5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgb2YgcGF5ZWUgdmVyaWZpY2F0aW9uIGNoZWNrIGZvciBFVVIgcGF5b3V0cy4gUGF5ZWUgdmVyaWZpY2F0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBwYXllZSBuYW1lIHByb3ZpZGVkIG1hdGNoZXMgdGhlIGFjY291bnQgaG9sZGVyIG5hbWUgYXQgdGhlIGRlc3RpbmF0aW9uIGluc3RpdHV0aW9uLiAgYEZVTExfTUFUQ0hgOiBUaGUgcGF5ZWUgbmFtZSBmdWxseSBtYXRjaGVzIHRoZSBhY2NvdW50IGhvbGRlci4gIGBQQVJUSUFMX01BVENIYDogVGhlIHBheWVlIG5hbWUgcGFydGlhbGx5IG1hdGNoZXMgdGhlIGFjY291bnQgaG9sZGVyLiAgYE5PX01BVENIYDogVGhlIHBheWVlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgaG9sZGVyLiAgYEVSUk9SYDogQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBheWVlIHZlcmlmaWNhdGlvbi4gIGBDSEVDS19OT1RfUE9TU0lCTEVgOiBQYXllZSB2ZXJpZmljYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZC4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGFwcGxpY2FibGUgRVVSIHBheW91dCB0cmFuc2FjdGlvbnMgYW5kIHdpbGwgYmUgYG51bGxgIGZvciBvdGhlciB0cmFuc2FjdGlvbiB0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uUGF5ZWVWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEZ1bGxNYXRjaCA9ICdGVUxMX01BVENIJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAnUEFSVElBTF9NQVRDSCcsXG4gICAgTm9NYXRjaCA9ICdOT19NQVRDSCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIENoZWNrTm90UG9zc2libGUgPSAnQ0hFQ0tfTk9UX1BPU1NJQkxFJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9ucyBhcmUgcmVsYXRlZCB3aGVuIHRoZXkgaGF2ZSBhIGxvZ2ljYWwgY29ubmVjdGlvbi4gIEZvciBleGFtcGxlLCBhIGBQQVlPVVRgIHRyYW5zYWN0aW9uIGNhbiBiZSByZXR1cm5lZCBieSB0aGUgc2VuZGVyLCBjcmVhdGluZyBhIGBSRVRVUk5gIHRyYW5zYWN0aW9uLiBFYWNoIGBQQVlPVVRgIHRyYW5zYWN0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGNvcnJlc3BvbmRpbmcgYFJFVFVSTmAgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiByZXZlcnNhbC4gIFRoZXNlIHJlbGF0aW9uc2hpcHMgYXJlIGJpLWRpcmVjdGlvbmFsLCBtZWFuaW5nIHRoYXQgYm90aCBlbnRpdGllcyBoYXZlIHJlZmVyZW5jZXMgdG8gZWFjaCBvdGhlci4gRm9yIGluc3RhbmNlLCB3aGVuIGEgdHJhbnNhY3Rpb24gb2YgdHlwZSBSRVRVUk4gb2NjdXJzLCBpdCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGJlaW5nIHJldHVybmVkLiBMaWtld2lzZSwgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGhhcyBhIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBSRVRVUk4gdHJhbnNhY3Rpb24gdGhhdCByZXByZXNlbnRzIHRoZSByZXR1cm4uICBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciB0cmFuc2FjdGlvbnMgb2YgdHlwZSBgUkVUVVJOYCwgYEZVTkRTX1NXRUVQYCwgYFJFRlVORGAgYW5kIGBQQVlPVVRgLiAgVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgYFBJU19QQVlfSU5gIHBheW1lbnQgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGBSRUZVTkRgIHRyYW5zYWN0aW9ucyBpcyBvbmx5IGF2YWlsYWJsZSB0aHJvdWdoIGByZWZ1bmRfaWRzYCBwcm9wZXJ0eSBpbiB0aGUgcGF5bWVudCBvYmplY3QuIFNlZVtgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtZ2V0LXJlc3BvbnNlLXJlZnVuZC1pZHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWxhdGVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb25cbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblxuICAgICAqL1xuICAgIHR5cGU/OiBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblR5cGVFbnVtIHtcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgdXBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZmV0Y2ggdHJhbnNhY3Rpb25zIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYmFzZTY0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuIFNldCB0aGlzIHRvIGBuZXh0X2N1cnNvcmAgcmVjZWl2ZWQgZnJvbSB0aGUgcHJldmlvdXMgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIHRoZSByZXNwb25zZSB3aWxsIG9ubHkgY29udGFpbiB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhhdCB0cmFuc2FjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhbiBBc3NldCBSZXBvcnQgdG8gYmUgcmV0dXJuZWQgd2l0aCBtaXNzaW5nIGFjY291bnQgb3duZXIgaW5mb3JtYXRpb24uIEluIHN1Y2ggY2FzZXMsIHRoZSBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgdHlwZSwgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEFTU0VUX1JFUE9SVF9XQVJOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBPV05FUlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IGFjY291bnQtb3duZXIgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS5gSU5WRVNUTUVOVFNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IEludmVzdG1lbnRzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggQ3JlZGl0IGFuZCBEZXBvc2l0b3J5IGFjY291bnRzIGFyZSB1bmF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBXYXJuaW5nV2FybmluZ0NvZGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FybmluZ1dhcm5pbmdDb2RlRW51bSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBJbnZlc3RtZW50c1VuYXZhaWxhYmxlID0gJ0lOVkVTVE1FTlRTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlydGhfY2VydGlmaWNhdGVgIC0gQSBjZXJ0aWZpY2F0ZSBvZiBiaXJ0aCAgYGRyaXZlcnNfbGljZW5zZWAgLSBBIGxpY2Vuc2UgdG8gb3BlcmF0ZSBhIG1vdG9yIHZlaGljbGUgIGBpbW1pZ3JhdGlvbl9udW1iZXJgIC0gSW1taWdyYXRpb24gb3IgcmVzaWRlbmNlIGRvY3VtZW50cyAgYG1pbGl0YXJ5X2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBieSBhIG1pbGl0YXJ5IGdyb3VwICBgb3RoZXJgIC0gQW55IGRvY3VtZW50IG5vdCBjb3ZlcmVkIGJ5IG90aGVyIGNhdGVnb3JpZXMgIGBwYXNzcG9ydGAgLSBBbiBvZmZpY2lhbCBwYXNzcG9ydCBpc3N1ZWQgYnkgYSBnb3Zlcm5tZW50ICBgcGVyc29uYWxfaWRlbnRpZmljYXRpb25gIC0gQW55IGdlbmVyaWMgcGVyc29uYWwgaWRlbnRpZmljYXRpb24gdGhhdCBpcyBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcmF0aW9uX2NhcmRgIC0gSWRlbnRpZmljYXRpb24gdGhhdCBlbnRpdGxlcyB0aGUgaG9sZGVyIHRvIHJhdGlvbnMgIGBzc25gIC0gVW5pdGVkIFN0YXRlcyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyICBgc3R1ZGVudF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYW4gZWR1Y2F0aW9uYWwgaW5zdGl0dXRpb24gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzICBgdHJhdmVsX2RvY3VtZW50YCAtIFZpc2FzLCBlbnRyeSBwZXJtaXRzLCByZWZ1Z2VlIGRvY3VtZW50cywgZXRjLiAgYHZvdGVyX2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2Ygdm90aW5nXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGUge1xuICAgIEJpcnRoQ2VydGlmaWNhdGUgPSAnYmlydGhfY2VydGlmaWNhdGUnLFxuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSW1taWdyYXRpb25OdW1iZXIgPSAnaW1taWdyYXRpb25fbnVtYmVyJyxcbiAgICBNaWxpdGFyeUlkID0gJ21pbGl0YXJ5X2lkJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFBlcnNvbmFsSWRlbnRpZmljYXRpb24gPSAncGVyc29uYWxfaWRlbnRpZmljYXRpb24nLFxuICAgIFJhdGlvbkNhcmQgPSAncmF0aW9uX2NhcmQnLFxuICAgIFNzbiA9ICdzc24nLFxuICAgIFN0dWRlbnRJZCA9ICdzdHVkZW50X2lkJyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnLFxuICAgIFRyYXZlbERvY3VtZW50ID0gJ3RyYXZlbF9kb2N1bWVudCcsXG4gICAgVm90ZXJJZCA9ICd2b3Rlcl9pZCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBlbnRpdHkgc2NyZWVuaW5nIHJldmlld1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBjaGFuZ2VzIHRvIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0Pn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaGl0czogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSByZXZpZXcgZm9yIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBjb25maXJtZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgY29uZmlybWVkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM/OiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmllbGRzIHRvIHJlc2V0IGJhY2sgdG8gbnVsbFxuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmaWVsZCB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIG51bGxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQge1xuICAgIEFzc2lnbmVlID0gJ2Fzc2lnbmVlJ1xufVxuXG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIGZyb20gYSBnb3Zlcm5tZW50IHdhdGNobGlzdCBvciBQRVAgbGlzdCB0aGF0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBzY3JlZW5pbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nIGhpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHJldmlld19zdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZmlyc3RfYWN0aXZlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGluYWN0aXZlX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgbGlzdF9jb2RlOiBJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXZlcnNhbCBpZGVudGlmaWVyIGZvciBhIHdhdGNobGlzdCBpbmRpdmlkdWFsIHRoYXQgaXMgc3RhYmxlIGFjcm9zcyBzZWFyY2hlcyBhbmQgdXBkYXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBwbGFpZF91aWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc291cmNlIHNhbmN0aW9uIG9yIHdhdGNobGlzdC4gV2hlbiBvbmUgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHNvdXJjZV91aWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3ViLXByb2dyYW0gZGVzaWduYXRpb25zIHRoYXQgbWF5IGJlIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3QgZW50cnkgYnkgdGhlIGlzc3VpbmcgYXV0aG9yaXR5LiBGb3IgT0ZBQyBTRE4gZW50cmllcyB0aGVzZSBhcmUgdGhlIHByb2dyYW0gY29kZXMgcHVibGlzaGVkIGluIHRoZSBTRE4gbGlzdCAoZm9yIGV4YW1wbGUgYFNER1RgIGZvciBTcGVjaWFsbHkgRGVzaWduYXRlZCBHbG9iYWwgVGVycm9yaXN0cywgYFNETlRLYCBmb3IgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmFyY290aWNzIFRyYWZmaWNraW5nIEtpbmdwaW5zLCBgSVJBTmAsIGBSVVNTSUEtRU8xNDAyNGApLiBOZXcgY29kZXMgYXJlIGFkZGVkIGJ5IHNhbmN0aW9uaW5nIGF1dGhvcml0aWVzIHdpdGhvdXQgcHJpb3Igbm90aWNlLCBzbyBjYWxsZXJzIHNob3VsZCB0cmVhdCB1bmtub3duIHZhbHVlcyBhcyBvcGFxdWUgc3RyaW5ncyByYXRoZXIgdGhhbiBlbnVtIG1lbWJlcnMuIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzdWJfcHJvZ3JhbXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NjcmVlbmluZ0hpdEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IFNjcmVlbmluZ0hpdEFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY3JlZW5pbmdIaXREYXRhfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBkYXRhPzogU2NyZWVuaW5nSGl0RGF0YTtcbn1cbi8qKlxuICogTG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGxvY2F0aW9uIHN0cmluZywgcG90ZW50aWFsbHkgaW5jbHVkaW5nIGVsZW1lbnRzIGxpa2Ugc3RyZWV0LCBjaXR5LCBwb3N0YWwgY29kZXMgYW5kIGNvdW50cnkgY29kZXMuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSBhIGNvbXBsZXRlIG9yIHdlbGwtZm9ybWF0dGVkIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zXG4gICAgICovXG4gICAgZnVsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY3VycmVudCBzdGF0ZSBvZiByZXZpZXcuIEFsbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHMgYmVnaW4gaW4gYSBgcGVuZGluZ19yZXZpZXdgIHN0YXRlIGJ1dCBjYW4gYmUgY2hhbmdlZCBieSBjcmVhdGluZyBhIHJldmlldy4gV2hlbiBhIGhpdCBpcyBpbiB0aGUgYHBlbmRpbmdfcmV2aWV3YCBzdGF0ZSwgaXQgd2lsbCBhbHdheXMgc2hvdyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHdhdGNobGlzdCBkYXRhIFBsYWlkIGhhcyBhdmFpbGFibGUgYW5kIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIGxhdGVzdCBjdXN0b21lciBpbmZvcm1hdGlvbiBzYXZlZCBpbiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZy4gT25jZSBhIGhpdCBoYXMgYmVlbiBtYXJrZWQgYXMgYGNvbmZpcm1lZGAgb3IgYGRpc21pc3NlZGAgaXQgd2lsbCBubyBsb25nZXIgYmUgdXBkYXRlZCBzbyB0aGF0IHRoZSBzdGF0ZSBpcyBhcyBpdCB3YXMgd2hlbiB0aGUgcmV2aWV3IHdhcyBmaXJzdCBjb25kdWN0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXMge1xuICAgIENvbmZpcm1lZCA9ICdjb25maXJtZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIERpc21pc3NlZCA9ICdkaXNtaXNzZWQnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBjaGFuZ2VzIHRvIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgaGl0cyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzaWduZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3QgcHJvZ3JhbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGluZGl2aWR1YWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgSW5kaXZpZHVhbHNcXFwiLCBcXFwiVVMgQ2FyZGhvbGRlcnNcXFwiLCBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXMgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtczogQXJyYXk8SW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSBzY3JlZW5pbmcgcmV2aWV3XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBjb25maXJtZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJldmlldyBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGNvbmZpcm1lZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM/OiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzaWduZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmllbGRzIHRvIHJlc2V0IGJhY2sgdG8gbnVsbFxuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZD59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVzZXRfZmllbGRzPzogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmaWVsZCB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIG51bGxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkIHtcbiAgICBBc3NpZ25lZSA9ICdhc3NpZ25lZSdcbn1cblxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIGlucHV0cyBmb3IgY3JlYXRpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gTXVzdCBiZSBiZXR3ZWVuIDQgYW5kIDMyIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNhbm5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JldmlldyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgY29uZmlybWVkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgY3JlYXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgc2NyZWVuaW5nIGlzIHN0aWxsIHBlbmRpbmcgcmV2aWV3LCBoYXMgYmVlbiByZWplY3RlZCwgb3IgaGFzIGJlZW4gY2xlYXJlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cyB7XG4gICAgUmVqZWN0ZWQgPSAncmVqZWN0ZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIENsZWFyZWQgPSAnY2xlYXJlZCdcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGF0IGFyZSBleHBsaWNpdGx5IG1hcmtlZCBhcyBsb3cgcXVhbGl0eSBlaXRoZXIgYnkgdGhlaXIgYHNvdXJjZWAgbGlzdCwgb3IgYnkgYHBsYWlkYCBieSBhIHNlcmllcyBvZiBhZGRpdGlvbmFsIGNoZWNrcyBkb25lIGJ5IFBsYWlkLiBQbGFpZCBkb2VzIG5vdCBldmVyIHN1cmZhY2UgYSBoaXQgYXMgYSByZXN1bHQgb2YgYSB3ZWFrIG5hbWUgYWxvbmUuIElmIGEgbmFtZSBoYXMgbm8gcXVhbGl0eSBpc3N1ZXMsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbm9uZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uIHtcbiAgICBOb25lID0gJ25vbmUnLFxuICAgIFNvdXJjZSA9ICdzb3VyY2UnLFxuICAgIFBsYWlkID0gJ3BsYWlkJ1xufVxuXG4vKipcbiAqIFRoZSBQbGFpZCBlbnZpcm9ubWVudCB0aGUgd2ViaG9vayB3YXMgc2VudCBmcm9tXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXMge1xuICAgIFNhbmRib3ggPSAnc2FuZGJveCcsXG4gICAgUHJvZHVjdGlvbiA9ICdwcm9kdWN0aW9uJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIHR5cGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdlYmhvb2tUeXBlIHtcbiAgICBBdXRoID0gJ0FVVEgnLFxuICAgIEhvbGRpbmdzID0gJ0hPTERJTkdTJyxcbiAgICBJbnZlc3RtZW50c1RyYW5zYWN0aW9ucyA9ICdJTlZFU1RNRU5UU19UUkFOU0FDVElPTlMnLFxuICAgIEl0ZW0gPSAnSVRFTScsXG4gICAgTGlhYmlsaXRpZXMgPSAnTElBQklMSVRJRVMnLFxuICAgIFRyYW5zYWN0aW9ucyA9ICdUUkFOU0FDVElPTlMnLFxuICAgIEFzc2V0cyA9ICdBU1NFVFMnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB3ZWJob29rIGlzIHVwZGF0ZWQuIFRoaXMgd2lsbCBiZSBzZW50IHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IElEICggYGtpZGAgKSBmcm9tIHRoZSBKV1QgaGVhZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAga2V5X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SldLUHVibGljS2V5fVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBrZXk6IEpXS1B1YmxpY0tleTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgcHJlLXRheCBlYXJuaW5ncywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgZWFybmluZ3MgYWZ0ZXIgYW55IHRheCB3aXRoaG9sZGluZ3MsIGJlbmVmaXQgcGF5bWVudHMgb3IgZGVkdWN0aW9ucywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCBhIGZpeGVkIGluY29tZSBzZWN1cml0eVxcJ3MgZXhwZWN0ZWQgcmF0ZSBvZiByZXR1cm4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlpZWxkUmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlpZWxkUmF0ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpeGVkIGluY29tZSBzZWN1cml0eVxcJ3MgZXhwZWN0ZWQgcmF0ZSBvZiByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWWllbGRSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZaWVsZFJhdGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBZaWVsZFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBZaWVsZFJhdGVUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgcmF0ZSB3aGljaCBpbmRpY2F0ZXMgaG93IHRoZSBwcmVkaWN0ZWQgeWllbGQgd2FzIGNhbGN1bGF0ZWQuIEl0IGlzIG9uZSBvZjogIGBjb3Vwb25gOiB0aGUgYW5udWFsaXplZCBpbnRlcmVzdCByYXRlIGZvciBzZWN1cml0aWVzIHdpdGggYSBvbmUteWVhciB0ZXJtIG9yIGxvbmdlciwgc3VjaCBhcyB0cmVhc3VyeSBub3RlcyBhbmQgYm9uZHMuICBgY291cG9uX2VxdWl2YWxlbnRgOiB0aGUgY2FsY3VsYXRlZCBlcXVpdmFsZW50IGZvciB0aGUgYW5udWFsaXplZCBpbnRlcmVzdCByYXRlIGZhY3RvcmluZyBpbiB0aGUgZGlzY291bnQgcmF0ZSBhbmQgdGltZSB0byBtYXR1cml0eSwgZm9yIHNob3J0ZXIgdGVybSwgbm9uLWludGVyZXN0LWJlYXJpbmcgc2VjdXJpdGllcyBzdWNoIGFzIHRyZWFzdXJ5IGJpbGxzLiAgYGRpc2NvdW50YDogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIHByZXNlbnQgdmFsdWUgb3IgY29zdCBpcyBkaXNjb3VudGVkIGZyb20gdGhlIGZ1dHVyZSB2YWx1ZSB1cG9uIG1hdHVyaXR5LCBhbHNvIGtub3duIGFzIHRoZSBmYWNlIHZhbHVlLiAgYHlpZWxkYDogdGhlIHRvdGFsIHByZWRpY3RlZCByYXRlIG9mIHJldHVybiBmYWN0b3JpbmcgaW4gYm90aCB0aGUgZGlzY291bnQgcmF0ZSBhbmQgdGhlIGNvdXBvbiByYXRlLCBhcHBsaWNhYmxlIHRvIHNlY3VyaXRpZXMgc3VjaCBhcyBleGNoYW5nZS10cmFkZWQgYm9uZHMgd2hpY2ggY2FuIGJvdGggYmUgaW50ZXJlc3QtYmVhcmluZyBhcyB3ZWxsIGFzIHNvbGQgYXQgYSBkaXNjb3VudCBvZmYgaXRzIGZhY2UgdmFsdWUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBZaWVsZFJhdGVUeXBlIHtcbiAgICBDb3Vwb24gPSAnY291cG9uJyxcbiAgICBDb3Vwb25FcXVpdmFsZW50ID0gJ2NvdXBvbl9lcXVpdmFsZW50JyxcbiAgICBEaXNjb3VudCA9ICdkaXNjb3VudCcsXG4gICAgWWllbGQgPSAneWllbGQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlkXFwncyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdDsgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgTm90ZTogSWYgeW91IGFyZSBnZXR0aW5nIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgcHVycG9zZSBvZiBhc3Nlc3NpbmcgdGhlIHJldHVybiByaXNrIG9mIGEgcHJvcG9zZWQgQUNIIHRyYW5zYWN0aW9uLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYC9zaWduYWwvZXZhbHVhdGVgIGluc3RlYWQgb2YgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuIGAvc2lnbmFsL2V2YWx1YXRlYCByZXR1cm5zIHRoZSBzYW1lIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uIGFuZCBhbHNvIHByb3ZpZGVzIGFjY2VzcyB0byBTaWduYWwgUnVsZXMsIHdoaWNoIHByb3ZpZGVzIG5vLWNvZGUgdHJhbnNhY3Rpb24gYnVzaW5lc3MgbG9naWMgY29uZmlndXJhdGlvbiwgYmFja3Rlc3RpbmcgYW5kIHJlY29tbWVuZGF0aW9ucyBmb3IgdHVuaW5nIHlvdXIgdHJhbnNhY3Rpb24gYWNjZXB0YW5jZSBsb2dpYywgYW5kIHRoZSBhYmlsaXR5IHRvIGVhc2lseSBzd2l0Y2ggYmV0d2VlbiBCYWxhbmNlIGFuZCBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGFzIG5lZWRlZCBmb3IgdWx0cmEtbG93LWxhdGVuY3ksIE1MLXBvd2VyZWQgcmlzayBhc3Nlc3NtZW50cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbQmFsYW5jZSBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvI2JhbGFuY2UtaW50ZWdyYXRpb24tb3B0aW9ucykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNCYWxhbmNlR2V0OiBhc3luYyAoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0JhbGFuY2VHZXQnLCAnYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCcsIGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyAtLSB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50cyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0OiBhc3luYyAoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYWNjb3VudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0dldCcsICdhY2NvdW50c0dldFJlcXVlc3QnLCBhY2NvdW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhY2NvdW50c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldDogYXN5bmMgKGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FwcGxpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXBwbGljYXRpb25HZXQnLCAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JywgYXBwbGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hcHBsaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gdGhlIEdTRXMgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0JywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHkgaW4gUERGIGZvcm1hdC4gVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0aGF0IHdhcyBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0OiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldCcsICdhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydENyZWF0ZScsICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0RmlsdGVyOiBhc3luYyAoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEZpbHRlcicsICdhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QnLCBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldDogYXN5bmMgKGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRHZXQnLCAnYXNzZXRSZXBvcnRHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UGRmR2V0OiBhc3luYyAoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydFBkZkdldCcsICdhc3NldFJlcG9ydFBERkdldFJlcXVlc3QnLCBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZWZyZXNoOiBhc3luYyAoYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydFJlZnJlc2gnLCAnYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCcsIGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZW1vdmUnLCAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQ6IGFzeW5jIChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2F1dGhHZXQnLCAnYXV0aEdldFJlcXVlc3QnLCBhdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC92ZXJpZnlgIGVuZHBvaW50IHZlcmlmaWVzIGJhbmsgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIGFuZCAob3B0aW9uYWxseSkgYWNjb3VudCBvd25lciBuYW1lcyBhZ2FpbnN0IFBsYWlkXFwncyBkYXRhYmFzZSB2aWEgW0RhdGFiYXNlIEF1dGhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9kYXRhYmFzZS1hdXRoLykuIEl0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhY2NvdW50IG51bWJlcnMgdGhhdCB3ZXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoZSBQbGFpZCBMaW5rIGZsb3cuICBUaGlzIGVuZHBvaW50IGlzIGN1cnJlbnRseSBpbiBFYXJseSBBdmFpbGFiaWxpdHk7IGNvbnRhY3Qgc2FsZXMgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFZlcmlmeSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoVmVyaWZ5UmVxdWVzdH0gYXV0aFZlcmlmeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoVmVyaWZ5OiBhc3luYyAoYXV0aFZlcmlmeVJlcXVlc3Q6IEF1dGhWZXJpZnlSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2F1dGhWZXJpZnlSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhdXRoVmVyaWZ5JywgJ2F1dGhWZXJpZnlSZXF1ZXN0JywgYXV0aFZlcmlmeVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2F1dGgvdmVyaWZ5YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGF1dGhWZXJpZnlSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXQnLCAnYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsOiBhc3luYyAoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDYW5jZWwnLCAnYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNyZWF0ZTogYXN5bmMgKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQ3JlYXRlJywgJ2JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgUGxhaWQtaW5pdGlhdGVkIEFDSCBvciBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdCcsICdiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRTeW5jJywgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckdldCcsICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdDogYXN5bmMgKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTGlzdCcsICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudCcsICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdCcsICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgdG8gZ2V0IHJpc2sgaW5zaWdodHMgZm9yIGEgbGlua2VkIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIHJpc2sgb2YgYSBiYW5rIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdH0gYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlOiBhc3luYyAoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlJywgJ2JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0JywgYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uRHVwbGljYXRlR2V0OiBhc3luYyAoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25EdXBsaWNhdGVHZXQnLCAnYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCcsIGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9kdXBsaWNhdGUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydENyZWF0ZTogYXN5bmMgKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Q6IEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0Q3JlYXRlJywgJ2JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QnLCBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgSUQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0R2V0OiBhc3luYyAoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRHZXQnLCAnYmVhY29uUmVwb3J0R2V0UmVxdWVzdCcsIGJlYWNvblJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydExpc3Q6IGFzeW5jIChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydExpc3QnLCAnYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QnLCBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0OiBhc3luYyAoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldCcsICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QnLCBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0OiBhc3luYyAoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QnLCAnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCcsIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhbGwgQWNjb3VudHMgbGlua2VkIHRvIHRoaXMgQmVhY29uIFVzZXIuIFRoZSBpbnNpZ2h0cyBmb3IgZWFjaCBhY2NvdW50IGFyZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQ6IGFzeW5jIChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdDogQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQnLCAnYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QnLCBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvYWNjb3VudF9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlOiBhc3luYyAoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyQ3JlYXRlJywgJ2JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0JywgYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckdldDogYXN5bmMgKGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlckdldCcsICdiZWFjb25Vc2VyR2V0UmVxdWVzdCcsIGJlYWNvblVzZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgQmVhY29uIFVzZXJcXCdzIGhpc3RvcnlcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0fSBiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckhpc3RvcnlMaXN0OiBhc3luYyAoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VySGlzdG9yeUxpc3QnLCAnYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCcsIGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYHJlamVjdGVkYCwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBjbGVhcmVkYCwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgY2xlYXJlZGAuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBwZW5kaW5nX3Jldmlld2AuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclJldmlldzogYXN5bmMgKGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlclJldmlldycsICdiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCcsIGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9yZXZpZXdgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0gb3IgYWRkIG5ldyBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIuICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYW4gaWRlbnRpdHkgZGF0YSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdH0gYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyVXBkYXRlOiBhc3luYyAoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyVXBkYXRlJywgJ2JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0JywgYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL2V3YV9yZXBvcnQvdjEvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhbiBFYXJuZWQgV2FnZSBBY2Nlc3MgKEVXQSkgc2NvcmUgdGhhdCBxdWFudGlmaWVzIHRoZSBkZWxpbnF1ZW5jeSByaXNrIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGl0ZW0uIFRoZSBzY29yZSBpcyBkZXJpdmVkIGZyb20gYSBjb21iaW5hdGlvbiBvZiBjYXNoZmxvdyBwYXR0ZXJucyBhbmQgbmV0d29yay1iYXNlZCBiZWhhdmlvcmFsIGZlYXR1cmVzLiAgVGhlIHJlc3BvbnNlIHJldHVybnMgYSBsaXN0IG9mIEVXQSBzY29yZXMsIHdoZXJlIGVhY2ggc2NvcmUgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWwgYWR2YW5jZSBhbW91bnQgcmFuZ2UuIFRoZXNlIHNjb3JlcyBlc3RpbWF0ZSB0aGUgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQgZm9yIGFkdmFuY2VzIHdpdGhpbiB0aGF0IHJhbmdlLiAgU2NvcmUgcmFuZ2U6IDEtOTkgIEludGVycHJldGF0aW9uOiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIGEgZ3JlYXRlciBsaWtlbGlob29kIG9mIHJlcGF5bWVudC4gIFRoaXMgZW5kcG9pbnQgZW5hYmxlcyBjbGllbnRzIHRvIGFzc2VzcyByZXBheW1lbnQgcmlzayBhbmQgbWFrZSBkYXRhLWRyaXZlbiBkZWNpc2lvbnMgd2hlbiBkZXRlcm1pbmluZyBlbGlnaWJpbGl0eSBvciBsaW1pdHMgZm9yIGVhcm5lZCB3YWdlIGFkdmFuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgRVdBIFNjb3JlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JldGFFd2FSZXBvcnRWMUdldFJlcXVlc3R9IGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZXRhRXdhUmVwb3J0VjFHZXQ6IGFzeW5jIChiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0OiBCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JldGFFd2FSZXBvcnRWMUdldCcsICdiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0JywgYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9ld2FfcmVwb3J0L3YxL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIHJlY29yZC4gWW91IGNhbiBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgeW91IGhhdmUgYXZhaWxhYmxlLiBJZiBhbnkgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgbWlzc2luZyBmb3IgdGhlIHByb2R1Y3RzIHlvdSBpbnRlbmQgdG8gdXNlLCBpdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgYHJlcXVpcmVtZW50c19kdWVgIGZpZWxkIG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZTogYXN5bmMgKGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3Q6IEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlJywgJ2JldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QnLCBiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZXRhaWxzIG9mIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0fSBiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0OiBhc3luYyAoYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdDogQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZXRhUGFydG5lckN1c3RvbWVyVjFHZXQnLCAnYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCcsIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIGVuZCBjdXN0b21lciByZWNvcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYW4gZXhpc3RpbmcgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1c2luZXNzIHZlcmlmaWNhdGlvbiB0byBjaGVjayBhIGJ1c2luZXNzXFwncyBpZGVudGl0eSBhbmQgcmlzayBwcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdidXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZScsICdidXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBidXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2J1c2luZXNzX3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgc3BlY2lmaWMgYnVzaW5lc3MgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0OiBhc3luYyAoYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdidXNpbmVzc1ZlcmlmaWNhdGlvbkdldCcsICdidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QnLCBidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2J1c2luZXNzX3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYGNhc2hmbG93X3JlcG9ydGAsIG9yIGlmIGl0IHdhc25cXCd0LCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXRzIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0R2V0OiBhc3luYyAoY2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0OiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXNoZmxvd1JlcG9ydEdldCcsICdjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QnLCBjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9pbnNpZ2h0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyBpbnNpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBJbnNpZ2h0cyBhcmUgb25seSBjYWxjdWxhdGVkIG9uIGNyZWRpdCBhbmQgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyBpbnNpZ2h0cyBkYXRhIGluIENhc2hmbG93IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQ6IGFzeW5jIChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQnLCAnY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QnLCBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY2FzaGZsb3dfcmVwb3J0L2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCBpcyBhbiBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbSAoZ2l2ZW4gYW4gYGl0ZW1faWRgKS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgQ2FzaGZsb3cgUmVwb3J0IGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiAgQWZ0ZXIgY2FsbGluZyBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCBhbGVydGluZyBjbGllbnRzIHRoYXQgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGNhbiB0aGVuIGJlIGluZ2VzdGVkIHZpYSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIG9yIHRoZSB3ZWJob29rIHdpbGwgY29udGFpbiBhbiBlcnJvciBjb2RlIGluZm9ybWluZyB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmVmcmVzaGluZyB0cmFuc2FjdGlvbnMgZGF0YS4gIE5vdGUgdGhhdCB0aGUgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKS4gSWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2QgZm9yIHJlcXVlc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2FzaGZsb3dSZXBvcnRSZWZyZXNoOiBhc3luYyAoY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXNoZmxvd1JlcG9ydFJlZnJlc2gnLCAnY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCcsIGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGBjYXNoZmxvd19yZXBvcnRgLCBvciBpZiBpdCB3YXNuXFwndCwgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldDogYXN5bmMgKGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXQnLCAnY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBsZWdhY3kgY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gW3VzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9wZmMtbWlncmF0aW9uLykgaW5zdGVhZCBvZiB0aGUgbGVnYWN5IGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgbGVnYWN5IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXRlZ29yaWVzR2V0OiBhc3luYyAoYm9keTogb2JqZWN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NhdGVnb3JpZXNHZXQnLCAnYm9keScsIGJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NhdGVnb3JpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gRXh0cmVtZWx5IHJlY2VudCBldmVudHMgKG9jY3VycmluZyB3aXRoaW4gdGhlIHBhc3QgMTIgaG91cnMpIG1heSBub3QgYmUgYXZhaWxhYmxlIHZpYSB0aGlzIGVuZHBvaW50LiBVcCB0byB0aHJlZSB5ZWFycyBvZiBjb25zZW50IGxvZ3Mgd2lsbCBiZSBhdmFpbGFibGUgdmlhIHRoZSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zZW50RXZlbnRzR2V0OiBhc3luYyAoY29uc2VudEV2ZW50c0dldFJlcXVlc3Q6IENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjb25zZW50RXZlbnRzR2V0JywgJ2NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0JywgY29uc2VudEV2ZW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NvbnNlbnQvZXZlbnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUERGIFJlcG9ydHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3R9IGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN1bWVyUmVwb3J0UGRmR2V0OiBhc3luYyAoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0OiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjb25zdW1lclJlcG9ydFBkZkdldCcsICdjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QnLCBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NvbnN1bWVyX3JlcG9ydC9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEJhc2UgUmVwb3J0IGZvciB5b3VyIHVzZXIsIGFsbG93aW5nIHlvdSB0byByZWNlaXZlIGNvbXByZWhlbnNpdmUgYmFuayBhY2NvdW50IGFuZCBjYXNoIGZsb3cgZGF0YS4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0JywgJ2NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2Jhc2VfcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzLCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX2Nhc2hmbG93X2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0JywgJ2NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2Nhc2hmbG93X2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCB0byByZWZyZXNoIGRhdGEgaW4gYW4gZXhpc3RpbmcgcmVwb3J0LiBBIENvbnN1bWVyIFJlcG9ydCB3aWxsIGxhc3QgZm9yIDI0IGhvdXJzIGJlZm9yZSBleHBpcmluZzsgeW91IHNob3VsZCBjYWxsIGFueSBgL2dldGAgZW5kcG9pbnRzIG9uIHRoZSByZXBvcnQgYmVmb3JlIGl0IGV4cGlyZXMuIElmIGEgcmVwb3J0IGV4cGlyZXMsIHlvdSBjYW4gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBhZ2FpbiB0byByZS1nZW5lcmF0ZSBpdCBhbmQgcmVmcmVzaCB0aGUgZGF0YSBpbiB0aGUgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIG9yIGNyZWF0ZSBhIENvbnN1bWVyIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRDcmVhdGU6IGFzeW5jIChjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0Q3JlYXRlJywgJ2NyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBOT1RFOiBUaGUgZm9sbG93aW5nIHNjaGVtYSB3YXMgdXBkYXRlZCBpbiBBcHJpbCAyMDI2IHRvIHJlZmxlY3QgdGhlIHJlc3BvbnNlIHdoZW4gdGhlIHByb3ZpZGVkIHZlcnNpb24gaXMgXFxcIklJMlxcXCIuIFBsZWFzZSBzZWUgW3RoaXMgZG9jdW1lbnRdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWtRa1E3Rk9nRmFDNG4tc1VHVWs3NGhvWFpOWV9MX25KZUN1TWU3S2VpcDQvZWRpdD90YWI9dC4wI2hlYWRpbmc9aC5ydWRhbXppbnVzMmkpIGZvciBndWlkYW5jZSBvbiBtaWdyYXRpbmcgdG8gSUkyIGlmIHlvdSBhcmUgY3VycmVudGx5IHVzaW5nIHRoZSBJSTEgdmVyc2lvbiwgYW5kIFt0aGlzIHNlY3Rpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWtRa1E3Rk9nRmFDNG4tc1VHVWs3NGhvWFpOWV9MX25KZUN1TWU3S2VpcDQvZWRpdD90YWI9dC4wI2Jvb2ttYXJrPWlkLnRkY2Myd3BrMGg2MCkgZm9yIGFuIGV4YW1wbGUgSUkxIHJlc3BvbnNlIGFsb25nIHdpdGggaXRzIFtkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMzZjODVuMmlyY3FrI2hlYWRpbmc9aC43OWR3cjVjMWlzemwpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBMZW5kU2NvcmUgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzLCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX2xlbmRfc2NvcmVgIHByb2R1Y3Qgb3IgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCB3aXRoIHRoZSBgY3JhX2xlbmRfc2NvcmVgIHByb2R1Y3QsIFBsYWlkIHdpbGwgZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIExlbmRTY29yZSBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXQnLCAnY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2xlbmRfc2NvcmUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgcHJvZHVjdCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbmV0d29ya19pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgUGxhaWQgd2lsbCBnZW5lcmF0ZSB0aGUgYXR0cmlidXRlcyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0OiBhc3luYyAoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmVkaXRfcGFydG5lcl9pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBjYWxsIG91ciBwYXJ0bmVycyB0byBnZW5lcmF0ZSB0aGUgaW5zaWdodHMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgb3B0aW9uYWxseSBwcm92aWRlIHBhcmFtZXRlcnMgdW5kZXIgYG9wdGlvbnNgIHRvIGNvbmZpZ3VyZSB3aGljaCBpbnNpZ2h0cyB5b3Ugd2FudCB0byByZWNlaXZlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSBwYXJ0bmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0JywgJ2NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9wYXJ0bmVyX2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgIHJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnQgQ29uc3VtZXIgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJ5IGRlZmF1bHQsIHRoZSBtb3N0IHJlY2VudCBCYXNlIFJlcG9ydCAoaWYgaXQgZXhpc3RzKSBmb3IgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZC4gVG8gcmVxdWVzdCB0aGF0IHRoZSBtb3N0IHJlY2VudCBQYXJ0bmVyIEluc2lnaHRzIG9yIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIFBERiBhcyB3ZWxsLCB1c2UgdGhlIGBhZGQtb25zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBDb25zdW1lciBSZXBvcnQgYXMgYSBQREZcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0UGRmR2V0OiBhc3luYyAoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFDaGVja1JlcG9ydFBkZkdldCcsICdjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGhvbWUgbGVuZGluZyByZXBvcnRzIGZvciBhIHVzZXIuIFRvIG9idGFpbiBhIFZvQSBvciBFbXBsb3ltZW50IFJlZnJlc2ggcmVwb3J0LCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBgY3JhX2Jhc2VfcmVwb3J0YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIG9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHZhcmlvdXMgaG9tZSBsZW5kaW5nIHJlcG9ydHMgZm9yIGEgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0JywgJ2NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LCBzcGVjaWZpY2FsbHkgZm9ybWF0dGVkIGZvciBIb21lIExlbmRpbmcgdmVyaWZpY2F0aW9uIHVzZSBjYXNlcy4gQmVmb3JlIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgZW5zdXJlIHRoYXQgeW91XFwndmUgY3JlYXRlZCBhIFZPQSByZXBvcnQgdGhyb3VnaCBMaW5rIG9yIHRoZSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCwgYW5kIGhhdmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vay4gIFRoZSByZXNwb25zZSB0byBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFZlcmlmaWNhdGlvbiBQREZcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0OiBhc3luYyAoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldCcsICdjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NyZWRpdF9wcm9maWxlL3JlcG9ydC9nZXRgIHJldHJpZXZlcyBhIGNyZWRpdCBwcm9maWxlIHJlcG9ydCBmb3IgYSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IGZvciBhIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0OiBhc3luYyAoY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0JywgJ2NyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0JywgY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9jcmVkaXRfcHJvZmlsZS9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyOiBhc3luYyAoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyJywgJ2NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0JywgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHNcbiAgICAgICAgICogQHBhcmFtIHtDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdH0gY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1JlZ2lzdGVyOiBhc3luYyAoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1JlZ2lzdGVyJywgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JywgY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNVbnJlZ2lzdGVyOiBhc3luYyAoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1VucmVnaXN0ZXInLCAnY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCcsIGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdXBkYXRlYCB1cGRhdGVzIGxvYW4gaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzIGFuZCBwYXltZW50IGhpc3RvcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBsb2FuIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVXBkYXRlOiBhc3luYyAoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1VwZGF0ZScsICdjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QnLCBjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIENhc2ggRmxvdyBVcGRhdGVzIHJlcG9ydCBieSBwYXNzaW5nIGluIHRoZSBgdXNlcl9pZGAgcmVmZXJyZWQgdG8gaW4gdGhlIHdlYmhvb2sgeW91IHJlY2VpdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldDogYXN5bmMgKGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0JywgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QnLCBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIHRvIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIGxpbmtlZCBDUkEgSXRlbSwgd2hpY2ggYXJlIHVwZGF0ZWQgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSAoYmVzdC1lZmZvcnQpLiBJbiB0aGUgY3VycmVudCBDYXNoIEZsb3cgVXBkYXRlcyBiZXRhIGV4cGVyaWVuY2UsIG9ubHkgb25lIEl0ZW0gcGVyIHVzZXIgbWF5IGJlIHN1YnNjcmliZWQgZm9yIG1vbml0b3JpbmcgdXBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlOiBhc3luYyAoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCcsIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL3N1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byB1bnN1YnNjcmliZSBmcm9tIHByZXZpb3VzbHkgc3Vic2NyaWJlZCBNb25pdG9yaW5nIEluc2lnaHRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbnN1YnNjcmliZSBmcm9tIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlOiBhc3luYyAoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZScsICdjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QnLCBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL3Vuc3Vic2NyaWJlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAgcmV0dXJucyBjYXNoIGZsb3cgaW5zaWdodHMgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhUGFydG5lckluc2lnaHRzR2V0OiBhc3luYyAoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFQYXJ0bmVySW5zaWdodHNHZXQnLCAnY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcsIGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBheW1lbnRUb2tlbjogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlYXRlUGF5bWVudFRva2VuJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBhIHBhcnRpY2lwYXRpbmcgR292ZXJubWVudC1TcG9uc29yZWQgRW50ZXJwcmlzZSAoR1NFKSBpZiB5b3UgcGFydGljaXBhdGUgaW4gRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0gb3IgdXRpbGl6ZSBGcmVkZGllIE1hY1xcJ3MgTG9hbiBQcm9kdWN0IEFkdmlzb3LCriAoTFBBwq4pIEFzc2V0IGFuZCBJbmNvbWUgTW9kZWxlciAoQUlNKS4gQW4gQXVkaXQgQ29weSB0b2tlbiBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCAocmVzdWx0IG9mIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGApLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZTogYXN5bmMgKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUnLCAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JywgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIHRoZSBlbXBsb3ltZW50IHJlcG9ydChzKSBkZXJpdmVkIGZyb20gYmFuayB0cmFuc2FjdGlvbiBkYXRhIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rRW1wbG95bWVudEdldDogYXN5bmMgKGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0VtcGxveW1lbnRHZXQnLCAnY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0JywgY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZUdldDogYXN5bmMgKGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0luY29tZUdldCcsICdjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgYSBzcGVjaWZpZWQgdXNlciBpbiBQREYgZm9ybWF0LiAgQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBQREYgZm9ybWF0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVBkZkdldDogYXN5bmMgKGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0luY29tZVBkZkdldCcsICdjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCBpcyBkZXByZWNhdGVkLiBUaGUgYmFja2VuZCBpbXBsZW1lbnRhdGlvbiB3YXMgcmVtb3ZlZCAocmV0dXJucyBhbiBgVW5pbXBsZW1lbnRlZGAgZXJyb3IgYXQgcnVudGltZSksIGFuZCB0aGUgZW5kcG9pbnQgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGRvY3VtZW50ZWQgQVBJIHN1cmZhY2UuIFRvIHJlZnJlc2ggQmFuayBJbmNvbWUgZGF0YSBmb3IgYW4gZXhpc3RpbmcgdXNlciwgc2VuZCB0aGUgdXNlciB0aHJvdWdoIExpbmtcXCdzIHVwZGF0ZSBtb2RlIHNvIHRoZXkgY2FuIGNvbmZpcm0gdGhlaXIgaW5jb21lIHNvdXJjZXMuIEZvciBhIGZ1bGx5IGJhY2tlbmQgcmVmcmVzaCwgbWlncmF0ZSB0byBDUkEgSW5jb21lIEluc2lnaHRzIGFuZCBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoOiBhc3luYyAoY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lUmVmcmVzaCcsICdjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZTogYXN5bmMgKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUnLCAnY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGAgcmV0dXJucyBwYXJzZWQgZGF0YSBmcm9tIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB1c2VycyBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gSWYgeW91ciBhY2NvdW50IGlzIG5vdCBlbmFibGVkIGZvciBEb2N1bWVudCBQYXJzaW5nLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQ6IGFzeW5jIChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldCcsICdjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0JywgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RW1wbG95bWVudEdldDogYXN5bmMgKGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0RW1wbG95bWVudEdldCcsICdjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCcsIGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0OiBhc3luYyAoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldCcsICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnLCBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVHZXQnLCAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGU6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2s6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjaycsICdjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5Q3JlYXRlOiBhc3luYyAoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUNyZWF0ZScsICdjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5R2V0OiBhc3luYyAoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUdldCcsICdjcmVkaXRSZWxheUdldFJlcXVlc3QnLCBjcmVkaXRSZWxheUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVBkZkdldDogYXN5bmMgKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlQZGZHZXQnLCAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JywgY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaDogYXN5bmMgKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZWZyZXNoJywgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVtb3ZlOiBhc3luYyAoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVJlbW92ZScsICdjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QnLCBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcsIGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldDogYXN5bmMgKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0U2Vzc2lvbnNHZXQnLCAnY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0JywgY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgRGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0OiBhc3luYyAoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkYXNoYm9hcmRVc2VyR2V0JywgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Rhc2hib2FyZF91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFib3V0IGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdWRpdCBvciB0cmFjayB0aGUgbGlzdCBvZiByZXZpZXdlcnMgZm9yIE1vbml0b3IsIEJlYWNvbiwgYW5kIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBEYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJMaXN0OiBhc3luYyAoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkYXNoYm9hcmRVc2VyTGlzdCcsICdkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QnLCBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWRcXCdzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95ZXJzU2VhcmNoOiBhc3luYyAoZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3llcnNTZWFyY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdlbXBsb3llcnNTZWFyY2gnLCAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcsIGVtcGxveWVyc1NlYXJjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2VtcGxveWVycy9zZWFyY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgZW1wbG95bWVudHMgdGhyb3VnaCBhIHVzZXIgcGF5cm9sbCB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0OiBhc3luYyAoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0JywgJ2VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgY29uc2VudCBncmFudCBieSBpdHMgaWRlbnRpZmllclxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgRkRYIENvbnNlbnQgR3JhbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnNlbnRJZCBDb25zZW50IEdyYW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeENvbnNlbnRzR2V0OiBhc3luYyAoY29uc2VudElkOiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY29uc2VudElkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhDb25zZW50c0dldCcsICdjb25zZW50SWQnLCBjb25zZW50SWQpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9jb25zZW50cy97Y29uc2VudElkfWBcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgeyR7XCJjb25zZW50SWRcIn19YCwgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjb25zZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXZvY2F0aW9uIGhpc3Rvcnkgb2YgYSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEZEWCBDb25zZW50IEdyYW50IHJldm9jYXRpb24gcmVjb3Jkc1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Q29uc2VudHNSZXZvY2F0aW9uR2V0OiBhc3luYyAoY29uc2VudElkOiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY29uc2VudElkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhDb25zZW50c1Jldm9jYXRpb25HZXQnLCAnY29uc2VudElkJywgY29uc2VudElkKVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH0vcmV2b2NhdGlvbmBcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgeyR7XCJjb25zZW50SWRcIn19YCwgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjb25zZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcHBlbmRzIGEgUkVWT0tFRCBzdGF0dXMgcmVjb3JkIHRvIHRoZSBuYW1lZCBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBGRFggQ29uc2VudCBHcmFudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeENvbnNlbnRzUmV2b2tlOiBhc3luYyAoY29uc2VudElkOiBzdHJpbmcsIHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjb25zZW50SWQnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZkeENvbnNlbnRzUmV2b2tlJywgJ2NvbnNlbnRJZCcsIGNvbnNlbnRJZClcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlcXVlc3RCb2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhDb25zZW50c1Jldm9rZScsICdyZXF1ZXN0Qm9keScsIHJlcXVlc3RCb2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH0vcmV2b2NhdGlvbmBcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgeyR7XCJjb25zZW50SWRcIn19YCwgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjb25zZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQVVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2VuZXJpYyB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBGRFggRXZlbnQgTm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Tm90aWZpY2F0aW9uczogYXN5bmMgKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ZEWE5vdGlmaWNhdGlvbicgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZmR4Tm90aWZpY2F0aW9ucycsICdmRFhOb3RpZmljYXRpb24nLCBmRFhOb3RpZmljYXRpb24pXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9ub3RpZmljYXRpb25zYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGZEWE5vdGlmaWNhdGlvbiwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldFJlY2lwaWVudDogYXN5bmMgKHJlY2lwaWVudElkOiBzdHJpbmcsIG9BVVRIU1RBVEVJRD86IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZWNpcGllbnRJZCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZ2V0UmVjaXBpZW50JywgJ3JlY2lwaWVudElkJywgcmVjaXBpZW50SWQpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9yZWNpcGllbnQve3JlY2lwaWVudElkfWBcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgeyR7XCJyZWNpcGllbnRJZFwifX1gLCBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHJlY2lwaWVudElkKSkpO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICBpZiAob0FVVEhTVEFURUlEICE9PSB1bmRlZmluZWQgJiYgb0FVVEhTVEFURUlEICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ09BVVRILVNUQVRFLUlEJ10gPSBTdHJpbmcob0FVVEhTVEFURUlEKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIFJlY2lwaWVudHNcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldFJlY2lwaWVudHM6IGFzeW5jIChvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L3JlY2lwaWVudHNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YCB0byByZXRyaWV2ZSBpZGVudGl0eSBkZXRhaWxzIHdoZW4gdXNpbmcgW0lkZW50aXR5IERvY3VtZW50IFVwbG9hZF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS9pZGVudGl0eS1kb2N1bWVudC11cGxvYWQvKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQ6IGFzeW5jIChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldCcsICdpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0JywgaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQ6IGFzeW5jIChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5R2V0JywgJ2lkZW50aXR5R2V0UmVxdWVzdCcsIGlkZW50aXR5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgb3IgYC9zaWduYWwvZXZhbHVhdGVgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eU1hdGNoUmVxdWVzdH0gaWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eU1hdGNoOiBhc3luYyAoaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5TWF0Y2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eU1hdGNoJywgJ2lkZW50aXR5TWF0Y2hSZXF1ZXN0JywgaWRlbnRpdHlNYXRjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlSZWZyZXNoOiBhc3luYyAoaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVJlZnJlc2gnLCAnaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCcsIGlkZW50aXR5UmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5L3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGU6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2F1dG9maWxsL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgYW5kL29yIGB1c2VyX2lkYCBmaWVsZC4gQXQgbGVhc3Qgb25lIG9mIHRoZXNlIHR3byBmaWVsZHMgbXVzdCBiZSBwcm92aWRlZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgYHVzZXJfaWRgIGlzIHByb3ZpZGVkLCB0aGVyZSBtdXN0IGJlIGFuIGFzc29jaWF0ZWQgdXNlciBvdGhlcndpc2UgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4gICBJZiB5b3UgZG9uXFwndCBrbm93IHdoZXRoZXIgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBleGlzdHMgZm9yIGEgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgLCB5b3UgY2FuIHNwZWNpZnkgYFxcXCJpc19pZGVtcG90ZW50XFxcIjogdHJ1ZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gV2l0aCBpZGVtcG90ZW5jeSBlbmFibGVkLCBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBhc3NvY2lhdGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kL29yIGB1c2VyX2lkYCwgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bm1vZGlmaWVkIHdpdGggYSBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgIElmIGB1c2VyX2lkYCBpcyBub3QgcHJvdmlkZWQsIHlvdSBjYW4gYWxzbyB1c2UgdGhpcyBlbmRwb2ludCB0byBzdXBwbHkgaW5mb3JtYXRpb24geW91IGFscmVhZHkgaGF2ZSBjb2xsZWN0ZWQgYWJvdXQgdGhlIHVzZXI7IGlmIGFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCwgdGhlIHNjcmVlbnMgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZW0gd2lsbCBiZSBza2lwcGVkIGR1cmluZyB0aGUgTGluayBmbG93LiBJZiBgdXNlcl9pZGAgaXMgcHJvdmlkZWQsIHVzZXIgaW5mb3JtYXRpb24gY2FuIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5LiBQbGVhc2UgdXNlIHRoZSBgL3VzZXIvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdXNlciBkYXRhIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQ6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0JywgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0JywgJ2lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnk6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnknLCAnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL3JldHJ5YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGJlZ2lucyB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHJldHVybmluZyBhbiBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgdW5kZXIgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTGluayBpbnN0YW5jZSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGdvIHRocm91Z2ggdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gUGxhaWQgd2lsbCBmaXJlIGFuIGBJTkNPTUVgIHdlYmhvb2sgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIFBheXJvbGwgSW5jb21lIGZsb3csIG9yIHdoZW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZTogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlJywgJ2luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQ6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkJywgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQ6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0JywgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gYW5kIHJldHVybnMgYSBgcHJlY2hlY2tfaWRgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHByb3ZpZGluZyB0aGUgYHByZWNoZWNrX2lkYCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSBgcHJlY2hlY2tfaWRgIGNhbiBzdGlsbCBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGVpdGhlciBgZW1wbG95ZXJgIG9yIGB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vuc2AgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjazogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2snLCAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9uXFwncyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudFxcJ3MgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldDogYXN5bmMgKGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zR2V0JywgJ2luc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXRCeUlkOiBhc3luYyAoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXRCeUlkJywgJ2luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0JywgaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNTZWFyY2g6IGFzeW5jIChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc1NlYXJjaCcsICdpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0JywgaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL3NlYXJjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNBdXRoR2V0OiBhc3luYyAoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c0F1dGhHZXQnLCAnaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCcsIGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0hvbGRpbmdzR2V0OiBhc3luYyAoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c0hvbGRpbmdzR2V0JywgJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudCBob2xkaW5ncyBhbmQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW2BJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYW5kIGhvbGRpbmdzIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIE5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaDogYXN5bmMgKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNSZWZyZXNoJywgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnLCBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0OiBhc3luYyAoaXNzdWVzR2V0UmVxdWVzdDogSXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpc3N1ZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpc3N1ZXNHZXQnLCAnaXNzdWVzR2V0UmVxdWVzdCcsIGlzc3Vlc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lzc3Vlcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXNzdWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWFyY2ggZm9yIGFuIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyczogIGBpdGVtX2lkYCwgYGxpbmtfc2Vzc2lvbl9pZGAgb3IgTGluayBzZXNzaW9uIGByZXF1ZXN0X2lkYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBgSXNzdWVgIG9iamVjdHMsIHdpdGggYW4gZW1wdHkgbGlzdCBpbmRpY2F0aW5nIHRoYXQgbm8gaXNzdWVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuIEF0IGxlYXN0IG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgbXVzdCBiZSBwcm92aWRlZCB0byBwZXJmb3JtIHRoZSBzZWFyY2guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBmb3IgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNTZWFyY2hSZXF1ZXN0fSBpc3N1ZXNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzU2VhcmNoOiBhc3luYyAoaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpc3N1ZXNTZWFyY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpc3N1ZXNTZWFyY2gnLCAnaXNzdWVzU2VhcmNoUmVxdWVzdCcsIGlzc3Vlc1NlYXJjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lzc3Vlcy9zZWFyY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXNzdWVzU2VhcmNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgYSB1c2VyIHRvIHN1YnNjcmliZSB0byB1cGRhdGVzIG9uIGEgc3BlY2lmaWMgYElzc3VlYCB1c2luZyBhIFBPU1QgbWV0aG9kLiBTdWJzY3JpYmVycyB3aWxsIHJlY2VpdmUgd2ViaG9vayBub3RpZmljYXRpb25zIHdoZW4gdGhlIGlzc3VlIHN0YXR1cyBjaGFuZ2VzLCBwYXJ0aWN1bGFybHkgd2hlbiByZXNvbHZlZC5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU3Vic2NyaWJlUmVxdWVzdH0gaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1N1YnNjcmliZTogYXN5bmMgKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXNzdWVzU3Vic2NyaWJlJywgJ2lzc3Vlc1N1YnNjcmliZVJlcXVlc3QnLCBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pc3N1ZXMvc3Vic2NyaWJlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlOiBhc3luYyAoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlJywgJ2l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0JywgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWN0aXZpdHlMaXN0OiBhc3luYyAoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQWN0aXZpdHlMaXN0JywgJ2l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0JywgaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYWN0aXZpdHkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlclxcJ3MgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlclxcJ3MgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3Q6IGFzeW5jIChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BcHBsaWNhdGlvbkxpc3QnLCAnaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUnLCAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVubGluayBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbi4gT24gYW4gdW5saW5rIHJlcXVlc3QsIFBsYWlkIHdpbGwgaW1tZWRpYXRlbHkgcmV2b2tlIHRoZSBBcHBsaWNhdGlvblxcJ3MgYWNjZXNzIHRvIHRoZSBVc2VyXFwncyBkYXRhLiAgVGhlIFVzZXIgd2lsbCBoYXZlIHRvIHJlZG8gdGhlIE9BdXRoIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaW4gb3JkZXIgdG8gcmVzdG9yZSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBlbmRwb2ludCBvbmx5IHJlbW92ZXMgb25nb2luZyBkYXRhIGFjY2VzcyBwZXJtaXNzaW9ucywgdGhlcmVmb3JlIHRoZSBVc2VyIHdpbGwgbmVlZCB0byByZWFjaCBvdXQgdG8gdGhlIEFwcGxpY2F0aW9uIGl0c2VsZiBpbiBvcmRlciB0byBkaXNhYmxlIGFuZCBkZWxldGUgdGhlaXIgYWNjb3VudCBhbmQgZGVsZXRlIGFueSBkYXRhIHRoYXQgdGhlIEFwcGxpY2F0aW9uIGFscmVhZHkgcmVjZWl2ZWQgKGlmIHRoZSBBcHBsaWNhdGlvbiBkb2VzIG5vdCBkbyBzbyBieSBkZWZhdWx0KS4gIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBpbiByZWFsIHRpbWUgYXMgdGhlIFVzZXIgaXMgdW5saW5raW5nIGFuIEFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2UgaXMgcmVmbGVjdGVkIGFzIHNvb24gYXMgcG9zc2libGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVubGluayBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25Vbmxpbms6IGFzeW5jIChpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BcHBsaWNhdGlvblVubGluaycsICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHB1YmxpYyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQ3JlYXRlUHVibGljVG9rZW46IGFzeW5jIChpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1DcmVhdGVQdWJsaWNUb2tlbicsICdpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JywgaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtR2V0OiBhc3luYyAoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtR2V0JywgJ2l0ZW1HZXRSZXF1ZXN0JywgaXRlbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtSW1wb3J0OiBhc3luYyAoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1JbXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtSW1wb3J0JywgJ2l0ZW1JbXBvcnRSZXF1ZXN0JywgaXRlbUltcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vaW1wb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1JbXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHRlcm1pbmF0ZSBhbiBJdGVtLiBPbmNlIHRlcm1pbmF0ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaXMgbm8gbG9uZ2VyIHZhbGlkLCBiaWxsaW5nIGZvciB0aGUgSXRlbVxcJ3MgcHJvZHVjdHMgaXMgZW5kZWQsIGFuZCByZWxldmFudCB3ZWJob29rcyBhcmUgZmlyZWQuICBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIG9mZmJvYXJkIHVzZXJzIG9yIGRpc2Nvbm5lY3QgYWNjb3VudHMgbGlua2VkIHZpYSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgVGVybWluYXRlIHByb2R1Y3RzIGZvciBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZTogYXN5bmMgKGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Q6IEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVByb2R1Y3RzVGVybWluYXRlJywgJ2l0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QnLCBpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3Byb2R1Y3RzL3Rlcm1pbmF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtUHVibGljVG9rZW5FeGNoYW5nZScsICdpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QnLCBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIENhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgYSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIHdoZW4gb2ZmYm9hcmRpbmcgdXNlcnMgb3IgaWYgYSB1c2VyIGNob29zZXMgdG8gZGlzY29ubmVjdCBhbiBhY2NvdW50IGxpbmtlZCB2aWEgUGxhaWQuIEZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBMaWFiaWxpdGllcywgYW5kIEludmVzdG1lbnRzLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIHJlcXVpcmVkIHRvIGVuZCBzdWJzY3JpcHRpb24gYmlsbGluZyBmb3IgdGhlIEl0ZW0sIHVubGVzcyB0aGUgZW5kIHVzZXIgcmV2b2tlZCBwZXJtaXNzaW9uIChlLmcuIHZpYSBbaHR0cHM6Ly9teS5wbGFpZC5jb20vXShodHRwczovL215LnBsYWlkLmNvbS8pKS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtTdWJzY3JpcHRpb24gZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jc3Vic2NyaXB0aW9uLWZlZSkuICBPbiBhIFRyaWFsIHBsYW4sIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgZG9lcyBub3QgaW1wYWN0IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIFRyaWFsIEl0ZW1zIChiYW5rIGNvbm5lY3Rpb25zKSB5b3UgaGF2ZSBhdmFpbGFibGUuICBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgYWNjZXNzIHRvIHRoZW0gc3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVJlbW92ZTogYXN5bmMgKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVJlbW92ZScsICdpdGVtUmVtb3ZlUmVxdWVzdCcsIGl0ZW1SZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGU6IGFzeW5jIChpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1XZWJob29rVXBkYXRlJywgJ2l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCcsIGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQ6IGFzeW5jIChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaWFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpYWJpbGl0aWVzR2V0JywgJ2xpYWJpbGl0aWVzR2V0UmVxdWVzdCcsIGxpYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUNyZWF0ZTogYXN5bmMgKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua0RlbGl2ZXJ5Q3JlYXRlJywgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnLCBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlHZXQ6IGFzeW5jIChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUdldCcsICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgYHBheW1lbnRfaW5pdGlhdGlvbmAgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgYGxpbmtfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJRCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZTogYXN5bmMgKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlJywgJ2xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QnLCBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlOiBhc3luYyAobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5DcmVhdGUnLCAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBCeSBkZWZhdWx0LCB0aGlzIGVuZHBvaW50IHdpbGwgb25seSByZXR1cm4gY29tcGxldGUgZXZlbnQgZGF0YSBmb3IgSG9zdGVkIExpbmsgc2Vzc2lvbnMuIFRvIHVzZSBgL2xpbmsvdG9rZW4vZ2V0YCB0byByZXRyaWV2ZSBldmVudCBkYXRhIGZvciBub24tSG9zdGVkLUxpbmsgc2Vzc2lvbnMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCB0aGF0IHlvdXIgYWNjb3VudCBiZSBlbmFibGVkIGZvciBMaW5rIGV2ZW50cy4gSWYgeW91IGRvIG5vdCBoYXZlIGFuIGFjY291bnQgbWFuYWdlciwgeW91IGNhbiBzdWJtaXQgdGhpcyByZXF1ZXN0IHZpYSBhIHN1cHBvcnQgdGlja2V0LiBFbmFibGVtZW50IGZvciBMaW5rIGV2ZW50cyB3aWxsIGFsc28gY2F1c2UgeW91IHRvIHJlY2VpdmUgYWRkaXRpb25hbCB3ZWJob29rcyByZWxhdGVkIHRvIExpbmsgZXZlbnRzLCBzdWNoIGFzIHRoZSBgU0VTU0lPTl9GSU5JU0hFRGAgYW5kIGBFVkVOVFNgIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldDogYXN5bmMgKGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua1Rva2VuR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua1Rva2VuR2V0JywgJ2xpbmtUb2tlbkdldFJlcXVlc3QnLCBsaW5rVG9rZW5HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL3Rva2VuL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiBUbyBhY2Nlc3MgdGhpcyBlbmRwb2ludCwgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIE5vdGU6IGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGNoZWNrIGZvciBMYXllciBlbGlnaWJpbGl0eSBpbiB0aGUgZnJvbnRlbmQuIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjaGVja2luZyBMYXllciBlbGlnaWJpbGl0eSBpZiBhIGZyb250ZW5kIGNoZWNrIGlzIG5vdCBwb3NzaWJsZSBmb3IgeW91ciB1c2UgY2FzZS4gRm9yIGluc3RydWN0aW9ucyBvbiBwZXJmb3JtaW5nIGEgZnJvbnRlbmQgZWxpZ2liaWxpdHkgY2hlY2ssIHNlZSB0aGUgW0xheWVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGF5ZXIvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge05ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG5ldHdvcmtTdGF0dXNHZXQ6IGFzeW5jIChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbmV0d29ya1N0YXR1c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ25ldHdvcmtTdGF0dXNHZXQnLCAnbmV0d29ya1N0YXR1c0dldFJlcXVlc3QnLCBuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbmV0d29yay9zdGF0dXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvb2F1dGgvaW50cm9zcGVjdGAgcmV0dXJucyBtZXRhZGF0YSBhYm91dCBhbiBhY2Nlc3MgdG9rZW4gb3IgcmVmcmVzaCB0b2tlbi4gIE5vdGU6IFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgbWV0YWRhdGEgYWJvdXQgYW4gT0F1dGggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtPQXV0aEludHJvc3BlY3RSZXF1ZXN0fSBvQXV0aEludHJvc3BlY3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgb2F1dGhJbnRyb3NwZWN0OiBhc3luYyAob0F1dGhJbnRyb3NwZWN0UmVxdWVzdDogT0F1dGhJbnRyb3NwZWN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdvQXV0aEludHJvc3BlY3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdvYXV0aEludHJvc3BlY3QnLCAnb0F1dGhJbnRyb3NwZWN0UmVxdWVzdCcsIG9BdXRoSW50cm9zcGVjdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL29hdXRoL2ludHJvc3BlY3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQob0F1dGhJbnRyb3NwZWN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL29hdXRoL3Jldm9rZWAgcmV2b2tlcyBhbiBhY2Nlc3Mgb3IgcmVmcmVzaCB0b2tlbiwgcHJldmVudGluZyBhbnkgZnVydGhlciB1c2UuIElmIGEgcmVmcmVzaCB0b2tlbiBpcyByZXZva2VkLCBhbGwgYWNjZXNzIGFuZCByZWZyZXNoIHRva2VucyBkZXJpdmVkIGZyb20gaXQgYXJlIGFsc28gcmV2b2tlZCwgaW5jbHVkaW5nIGV4Y2hhbmdlZCB0b2tlbnMuICBOb3RlOiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIGFuIE9BdXRoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7T0F1dGhSZXZva2VSZXF1ZXN0fSBvQXV0aFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBvYXV0aFJldm9rZTogYXN5bmMgKG9BdXRoUmV2b2tlUmVxdWVzdDogT0F1dGhSZXZva2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ29BdXRoUmV2b2tlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnb2F1dGhSZXZva2UnLCAnb0F1dGhSZXZva2VSZXF1ZXN0Jywgb0F1dGhSZXZva2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9vYXV0aC9yZXZva2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQob0F1dGhSZXZva2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvb2F1dGgvdG9rZW5gIGlzc3VlcyBhbiBhY2Nlc3MgdG9rZW4gYW5kIHJlZnJlc2ggdG9rZW4gZGVwZW5kaW5nIG9uIHRoZSBgZ3JhbnRfdHlwZWAgcHJvdmlkZWQuIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgb3IgcmVmcmVzaCBhbiBPQXV0aCBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtPQXV0aFRva2VuUmVxdWVzdH0gb0F1dGhUb2tlblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBvYXV0aFRva2VuOiBhc3luYyAob0F1dGhUb2tlblJlcXVlc3Q6IE9BdXRoVG9rZW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ29BdXRoVG9rZW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdvYXV0aFRva2VuJywgJ29BdXRoVG9rZW5SZXF1ZXN0Jywgb0F1dGhUb2tlblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL29hdXRoL3Rva2VuYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKG9BdXRoVG9rZW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLiBUbyBjcmVhdGUgZW5kIGN1c3RvbWVycywgaXQgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudCBvbmx5LCBldmVuIHdoZW4gY3JlYXRpbmcgU2FuZGJveCBBUEkga2V5cy4gSWYgY2FsbGVkIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBpdCB3aWxsIHJldHVybiBhIHNhbXBsZSByZXNwb25zZSwgYnV0IG5vIGN1c3RvbWVyIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIEFQSSBrZXlzIHdpbGwgbm90IGJlIHZhbGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyQ3JlYXRlOiBhc3luYyAocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUnLCAncGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCcsIHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgZnVsbCBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyRW5hYmxlOiBhc3luYyAocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJFbmFibGUnLCAncGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCcsIHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJHZXQ6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckdldCcsICdwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQnLCAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIGZ1bGwgUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZTogYXN5bmMgKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyUmVtb3ZlJywgJ3BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldCcsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQmFjcyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudFxcJ3MgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci4gIFBvbGxpbmcgZm9yIHN0YXR1cyB1cGRhdGVzIGluIFByb2R1Y3Rpb24gaXMgaGlnaGx5IGRpc2NvdXJhZ2VkLiBSZXBlYXRlZGx5IGNhbGxpbmcgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHRvIGNoZWNrIGEgcGF5bWVudFxcJ3Mgc3RhdHVzIGlzIHVucmVsaWFibGUgYW5kIG1heSB0cmlnZ2VyIEFQSSByYXRlIGxpbWl0cy4gT25seSB0aGUgYHBheW1lbnRfc3RhdHVzX3VwZGF0ZWAgd2ViaG9vayBzaG91bGQgYmUgdXNlZCB0byByZWNlaXZlIHJlYWwtdGltZSBzdGF0dXMgdXBkYXRlcyBpbiBQcm9kdWN0aW9uLiAgSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudHMgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3N1cHBvcnQucGxhaWQuY29tL2hjL2VuLXVzL2FydGljbGVzLzI3ODk1ODI2OTQ3NzM1LVdoYXQtUGxhaWQtcHJvZHVjdHMtYXJlLXN1cHBvcnRlZC1pbi1lYWNoLWNvdW50cnktYW5kLXJlZ2lvbikgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHByb2ZpbGUuIFRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUNyZWF0ZTogYXN5bmMgKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVDcmVhdGUnLCAncGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVHZXQ6IGFzeW5jIChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlR2V0JywgJ3BheW1lbnRQcm9maWxlR2V0UmVxdWVzdCcsIHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdFxcJ3MgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlUmVtb3ZlOiBhc3luYyAocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZVJlbW92ZScsICdwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QnLCBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgYWNjb3VudCBiYWxhbmNlIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQWNjb3VudEdldDogYXN5bmMgKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQWNjb3VudEdldCcsICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcsIHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcsIHNhdmluZ3MsIG9yIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBdXRoR2V0OiBhc3luYyAocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JBdXRoR2V0JywgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYWxhbmNlR2V0OiBhc3luYyAocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYWxhbmNlR2V0JywgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUnLCAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0OiBhc3luYyAocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJZGVudGl0eUdldCcsICdwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2g6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2gnLCAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudCBhdXRob3JpemVkIGJ5IGEgcHJvY2Vzc29yIHRva2VuLCBpbmNsdWRpbmcgYWNjb3VudCBudW1iZXJzLCBhY2NvdW50IG93bmVycywgaG9sZGluZ3MsIGFuZCBkYXRhIHByb3ZlbmFuY2UgaW5mb3JtYXRpb24uICBUbyByZWNlaXZlIEludmVzdG1lbnRzIEF1dGggd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgYWNjb3VudCBhdXRoZW50aWNhdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldDogYXN5bmMgKHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0JywgJ3Byb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnLCBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSW52ZXN0bWVudCBIb2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAncHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgaW52ZXN0bWVudCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIEludmVzdG1lbnRzIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldDogYXN5bmMgKHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQnLCAncHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdH0gcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQ6IGFzeW5jIChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0JywgJ3Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCcsIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgeW91IGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgUGxhaWQgd2lsbCBub3JtYWxseSBpbmZlciB0aGUgb3V0Y29tZSBmcm9tIHlvdXIgU2lnbmFsIFJ1bGVzLiBIb3dldmVyLCBpZiB5b3UgYXJlIG5vdCB1c2luZyBTaWduYWwgUnVsZXMsIGlmIHRoZSBTaWduYWwgUnVsZXMgb3V0Y29tZSB3YXMgYFJFVklFV2AsIG9yIGlmIHlvdSB0YWtlIGEgZGlmZmVyZW50IGFjdGlvbiB0aGFuIHRoZSBvbmUgZGV0ZXJtaW5lZCBieSB0aGUgU2lnbmFsIFJ1bGVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAuIFRoaXMgaGVscHMgaW1wcm92ZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUgYWNjdXJhY3kgZm9yIHlvdXIgYWNjb3VudCBhbmQgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgdGhlIHJ1bGUgcGVyZm9ybWFuY2UgYW5kIHJ1bGUgdHVuaW5nIGNhcGFiaWxpdGllcyBpbiB0aGUgRGFzaGJvYXJkLiBJZiB5b3VyIGVmZmVjdGl2ZSBkZWNpc2lvbiBjaGFuZ2VzIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgYWdhaW4gZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBjb3JyZWN0IFBsYWlkXFwncyByZWNvcmRzLiAgSWYgeW91IGFyZSB1c2luZyBQbGFpZCBUcmFuc2ZlciBhcyB5b3VyIHBheW1lbnQgcHJvY2Vzc29yLCB5b3UgYWxzbyBkbyBub3QgbmVlZCB0byBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLCBhcyBQbGFpZCBjYW4gaW5mZXIgb3V0Y29tZXMgZnJvbSB5b3VyIFRyYW5zZmVyIGFjdGl2aXR5LiAgSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQ6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0JywgJ3Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHVzZXMgUnVsZXNldHMgdGhhdCBhcmUgY29uZmlndXJlZCBvbiB0aGUgZW5kIGN1c3RvbWVyXFwncyBEYXNoYm9hcmQgYW5kIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIHByb2R1Y3Qgb3IgdGhlIEJhbGFuY2UgcHJvZHVjdC4gV2hpY2ggcHJvZHVjdCBpcyB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgYHJ1bGVzZXRfa2V5YCB0aGF0IHlvdSBwcm92aWRlLiBOb3RlIHRoYXQgb25seSBjdXN0b21lci1jb25maWd1cmVkIHJ1bGVzZXRzIHdvcmsgd2l0aCB0aGlzIGVuZHBvaW50OyBhcyBhIHByb2Nlc3NvciBwYXJ0bmVyLCB5b3UgY2Fubm90IGNyZWF0ZSBvciBjb25maWd1cmUgeW91ciBvd24gcnVsZXNldHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2lnbmFsIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgaGF2ZSBoaWdoZXIgbGF0ZW5jeSBpZiBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLCBvciB3aGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQuIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJlcXVlc3QgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlJywgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUHJlcGFyZScsICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQnLCAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2FuIGJlIG1vZGlmaWVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YC4gVG8gcmV2b2tlIHRoZSBwcm9jZXNzb3JcXCdzIGFjY2VzcywgdGhlIGVudGlyZSBJdGVtIG11c3QgYmUgZGVsZXRlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0OiBhc3luYyAocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0JywgJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUnLCAncHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCcsIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2VyXFwncyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldDogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0JywgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZy4gZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9maWxlTmV0d29ya1N0YXR1c0dldDogYXN5bmMgKHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQnLCAncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0JywgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcHV0ZSBhIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmUgZm9yIGEgdXNlci4gVGhlIG1vZGVsIHNlbGVjdGVkIGRldGVybWluZXMgd2hhdCBpcyBzY29yZWQgYW5kIHdoYXQgYWRkaXRpb25hbCBmaWVsZHMgdGhlIHJlc3BvbnNlIGNvbnRhaW5zLiBGb3IgZXhhbXBsZSwgYHRpLWxpbmstc2Vzc2lvbi0yLjBgIHNjb3JlcyBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24gZm9yIGZyYXVkIHJpc2s7IGBjYXNoLWFkdmFuY2Utb25ib2FyZGluZy0xLjBgIHNjb3JlcyByZXBheW1lbnQgcmlzayBmb3IgYSBmaXJzdC10aW1lIGNhc2ggYWR2YW5jZSBhbmQgYWRkaXRpb25hbGx5IHBvcHVsYXRlcyBwZXItYW1vdW50LWJ1Y2tldCBzdWJzY29yZXMuIENhc2gtYWR2YW5jZSBtb2RlbHMgcmVxdWlyZSB0aGF0IHRoZSB1c2VyIGhhdmUgYSBQbGFpZCBJdGVtIHdpdGggVHJhbnNhY3Rpb25zIGVuYWJsZWQsIG9yIGFuIEFzc2V0cyBSZXBvcnQsIGJlZm9yZSBzY29yaW5nLiAgVGhlIGVuZHBvaW50IHJldHVybnMgSFRUUCA0MDAgd2l0aCBgZXJyb3JfdHlwZWAgPSBgSU5WQUxJRF9SRVFVRVNUYCBhbmQgYGVycm9yX2NvZGVgID0gYEZBSUxFRF9QUkVDT05ESVRJT05gIHdoZW4gYSByZXF1aXJlZCBwcmVjb25kaXRpb24gaXMgbm90IG1ldDogZm9yIGxpbmstc2Vzc2lvbiBtb2RlbHMsIHdoZW4gdGhlIExpbmsgc2Vzc2lvbiBoYXMgbm90IGNvbXBsZXRlZDsgZm9yIGNhc2gtYWR2YW5jZSBtb2RlbHMsIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCBzdWNjZXNzZnVsbHkgbGlua2VkIGFueSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBDb21wdXRlIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmVzIGFuZCBzdWJzY29yZXNcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0Q29tcHV0ZVJlcXVlc3R9IHByb3RlY3RDb21wdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RDb21wdXRlOiBhc3luYyAocHJvdGVjdENvbXB1dGVSZXF1ZXN0OiBQcm90ZWN0Q29tcHV0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdENvbXB1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm90ZWN0Q29tcHV0ZScsICdwcm90ZWN0Q29tcHV0ZVJlcXVlc3QnLCBwcm90ZWN0Q29tcHV0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb3RlY3QvY29tcHV0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm90ZWN0Q29tcHV0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBldmVudCBpbmNsdWRpbmcgVHJ1c3QgSW5kZXggc2NvcmUgYW5kIGZyYXVkIGF0dHJpYnV0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvdGVjdEV2ZW50R2V0OiBhc3luYyAocHJvdGVjdEV2ZW50R2V0UmVxdWVzdDogUHJvdGVjdEV2ZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm90ZWN0RXZlbnRHZXQnLCAncHJvdGVjdEV2ZW50R2V0UmVxdWVzdCcsIHByb3RlY3RFdmVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb3RlY3QvZXZlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb3RlY3RFdmVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIG5ldyBldmVudCB0byBlbnJpY2ggdXNlciBkYXRhIGFuZCBvcHRpb25hbGx5IGdldCBhIFRydXN0IEluZGV4IHNjb3JlIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RFdmVudFNlbmRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RFdmVudFNlbmQ6IGFzeW5jIChwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdDogUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb3RlY3RFdmVudFNlbmQnLCAncHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QnLCBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvdGVjdC9ldmVudC9zZW5kYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIFByb3RlY3QgcmVwb3J0IHRvIGRvY3VtZW50IGZyYXVkIGluY2lkZW50cywgaW52ZXN0aWdhdGlvbiBvdXRjb21lcywgb3Igb3RoZXIgcmlzayBldmVudHMuIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXBvcnQgdmFyaW91cyB0eXBlcyBvZiBpbmNpZGVudHMgaW5jbHVkaW5nIGFjY291bnQgdGFrZW92ZXJzLCBpZGVudGl0eSBmcmF1ZCwgdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucywgYW5kIG90aGVyIHNlY3VyaXR5IGV2ZW50cy4gVGhlIHJlcG9ydGVkIGRhdGEgaGVscHMgaW1wcm92ZSBmcmF1ZCBkZXRlY3Rpb24gbW9kZWxzIGFuZCBwcm92aWRlcyB2YWx1YWJsZSBmZWVkYmFjayB0byBlbmhhbmNlIHRoZSBvdmVyYWxsIHNlY3VyaXR5IG9mIHRoZSBQbGFpZCBuZXR3b3JrLiBSZXBvcnRzIGNhbiBiZSBjcmVhdGVkIGZvciBjb25maXJtZWQgaW5jaWRlbnRzIHRoYXQgaGF2ZSBiZWVuIGZ1bGx5IGludmVzdGlnYXRlZCwgb3IgZm9yIHN1c3BlY3RlZCBpbmNpZGVudHMgdGhhdCByZXF1aXJlIGZ1cnRoZXIgcmV2aWV3LiBZb3UgY2FuIGFzc29jaWF0ZSByZXBvcnRzIHdpdGggc3BlY2lmaWMgdXNlcnMsIHNlc3Npb25zLCBvciB0cmFuc2FjdGlvbnMgdG8gcHJvdmlkZSBjb21wcmVoZW5zaXZlIGNvbnRleHQgYWJvdXQgdGhlIGluY2lkZW50LiBFYWNoIHJlcG9ydCBtdXN0IGluY2x1ZGUgYHVzZXJfaWRgLCBvciBhbiBgaW5jaWRlbnRfZXZlbnRgIHdpdGggYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBpZGVudGlmaWVyOiBgbGlua19zZXNzaW9uX2lkYCwgYGlkdl9zZXNzaW9uX2lkYCwgYHByb3RlY3RfZXZlbnRfaWRgLCBgc2lnbmFsX2NsaWVudF90cmFuc2FjdGlvbl9pZGAsIG9yIGBhY2Nlc3NfdG9rZW5gLiBDb250ZXh0IGZpZWxkcyBzdWNoIGFzIGBpbnRlcm5hbF9yZWZlcmVuY2VgLCBgdGltZWAsIGBhbW91bnRgLCBhbmQgYGJhbmtfYWNjb3VudGAgZG8gbm90IHNhdGlzZnkgdGhpcyBpZGVudGlmaWVyIHJlcXVpcmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBQcm90ZWN0IHJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0fSBwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RSZXBvcnRDcmVhdGU6IGFzeW5jIChwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdDogUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb3RlY3RSZXBvcnRDcmVhdGUnLCAncHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QnLCBwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvdGVjdC9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGdldCBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgYXMgaXQgcmVsYXRlcyB0byB0aGVpciBmcmF1ZCBwcm9maWxlIHdpdGggUHJvdGVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFByb3RlY3QgdXNlciBpbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSBwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RVc2VySW5zaWdodHNHZXQ6IGFzeW5jIChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdDogUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb3RlY3RVc2VySW5zaWdodHNHZXQnLCAncHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCBwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvdGVjdC91c2VyL2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vaycsICdzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlOiBhc3luYyAoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZTogYXN5bmMgKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0OiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZScsICdzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCcsIHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9vaycsICdzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vYXBwbGljYXRpb24vc2VlZGAgY3JlYXRlcyBhIHRlc3QgY29ubmVjdGVkIGFwcGxpY2F0aW9uIG9uIGFuIGV4aXN0aW5nIFBlcm1pc3Npb25zIE1hbmFnZXIgSXRlbVxcJ3MgbG9naW4uIFRoZSBzZWVkZWQgYXBwbGljYXRpb24gd2lsbCBhcHBlYXIgaW4gc3Vic2VxdWVudCBjYWxscyB0byBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGAuICBUaGUgYGFjY2Vzc190b2tlbmAgbXVzdCBiZWxvbmcgdG8gYSBQZXJtaXNzaW9ucyBNYW5hZ2VyIEl0ZW0gY3JlYXRlZCB2aWEgYC9pdGVtL2ltcG9ydGAgaW4gU2FuZGJveC4gVGhlIGBhcHBsaWNhdGlvbl9pZGAgaWRlbnRpZmllcyB0aGUgYXBwbGljYXRpb24gdG8gc2VlZCBhcyBhIGNvbm5lY3RlZCBhcHAuIFRvIGRpc2Nvbm5lY3QgYSBzZWVkZWQgYXBwbGljYXRpb24sIHVzZSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYC5cbiAgICAgICAgICogQHN1bW1hcnkgU2VlZCBhIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBQZXJtaXNzaW9ucyBNYW5hZ2VyIHNhbmRib3ggaXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdH0gc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWQ6IGFzeW5jIChzYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3Q6IFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkJywgJ3NhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCcsIHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL2FwcGxpY2F0aW9uL3NlZWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIHNpbXVsYXRpbmcgYSBkZWZhdWx0IHVwZGF0ZSBldmVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdCBhcyBzcGVjaWZpZWQgd2l0aCB0aGUgYHdlYmhvb2tfdHlwZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gVmFsaWQgU2FuZGJveCBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgdHlwZXMgaW5jbHVkZTogYEFVVEhgLCBgSURFTlRJVFlgLCBgVFJBTlNBQ1RJT05TYCwgYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2AsIGBMSUFCSUxJVElFU2AsIGBIT0xESU5HU2AuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIHByb2R1Y3QsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IEZpcmVkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgYWNjb3VudCBpcyBhdmFpbGFibGUgb24gdGhlIEl0ZW0gYW5kIHlvdSBjYW4gbGF1bmNoIHVwZGF0ZSBtb2RlIHRvIHJlcXVlc3QgYWNjZXNzIHRvIGl0LiAgYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmA6IEZpcmVkIHdoZW4gYSBnaXZlbiBTYW1lLURheSBNaWNyby1kZXBvc2l0IEl0ZW0gaXMgdmVyaWZpZWQgdmlhIFNNUyB2ZXJpZmljYXRpb24uICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBQRU5ESU5HX0RJU0NPTk5FQ1RgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2lsbCBzdG9wIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlIChlLmcuIGR1ZSB0byBhIHBsYW5uZWQgYmFuayBtaWdyYXRpb24pIGFuZCBtdXN0IGJlIHNlbnQgdGhyb3VnaCB1cGRhdGUgbW9kZSB0byBjb250aW51ZSB3b3JraW5nLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25zXFwnIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1GaXJlV2ViaG9vaycsICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIHlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtUmVzZXRMb2dpbjogYXN5bmMgKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1SZXNldExvZ2luJywgJ3NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QnLCBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXM6IGFzeW5jIChzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzJywgJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCcsIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9BdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT0F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3R9IHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzOiBhc3luYyAoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cycsICdzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QnLCBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbjogYXN5bmMgKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbicsICdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQYXltZW50U2ltdWxhdGUnLCAnc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHVibGljVG9rZW5DcmVhdGU6IGFzeW5jIChzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZScsICdzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0Jywgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNhY3Rpb25zL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIG5ldyB0cmFuc2FjdGlvbnMgZm9yIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIHVwIHRvIDEwIHRyYW5zYWN0aW9ucyB0byBhbnkgSXRlbSBhdCBhIHRpbWUuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBJdGVtcyB0aGF0IHdlcmUgY3JlYXRlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCB1c2luZyB0aGUgYHVzZXJfdHJhbnNhY3Rpb25zX2R5bmFtaWNgIHRlc3QgdXNlci4gWW91IGNhbiB1c2UgdGhpcyB0byBhZGQgdHJhbnNhY3Rpb25zIHRvIHRlc3QgdGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50cy4gIEN1c3RvbSB0cmFuc2FjdGlvbnMgYXJlIG9ubHkgYXBwbGllZCB0byB0aGUgZGVwb3NpdG9yeSBhY2NvdW50LiBTdXBwb3J0IGZvciBwZXItYWNjb3VudCB0YXJnZXRpbmcgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBzYW5kYm94IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGUnLCAnc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2FjdGlvbnMvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2U6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2UnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldDogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0JywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdDogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdCcsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCB5b3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFVzZXJSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VXNlclJlc2V0TG9naW4nLCAnc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2Vzc2lvbi90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgTGF5ZXIuIFRoZSByZXR1cm5lZCBMaW5rIHRva2VuIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgdGhlIExpbmsgU0RLLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgTGluayB0b2tlbiBmb3IgTGF5ZXJcbiAgICAgICAgICogQHBhcmFtIHtTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0fSBzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2Vzc2lvblRva2VuQ3JlYXRlOiBhc3luYyAoc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdDogU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzZXNzaW9uVG9rZW5DcmVhdGUnLCAnc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCcsIHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Nlc3Npb24vdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgeW91IGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLiBUaGlzIGhlbHBzIGltcHJvdmUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGFjY3VyYWN5IGZvciB5b3VyIGFjY291bnQgYW5kIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoZSBydWxlIHBlcmZvcm1hbmNlIGFuZCBydWxlIHR1bmluZyBjYXBhYmlsaXRpZXMgaW4gdGhlIERhc2hib2FyZC4gSWYgeW91ciBlZmZlY3RpdmUgZGVjaXNpb24gY2hhbmdlcyBhZnRlciBjYWxsaW5nIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCwgYXMgUGxhaWQgY2FuIGluZmVyIG91dGNvbWVzIGZyb20geW91ciBUcmFuc2ZlciBhY3Rpdml0eS4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxEZWNpc2lvblJlcG9ydCcsICdzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEJlZm9yZSB1c2luZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBydWxlc2V0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKSBpbiB0aGUgRGFzaGJvYXJkIHVuZGVyIFsqKlNpZ25hbC0+UnVsZXMqKl0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3NpZ25hbC9yaXNrLXByb2ZpbGVzKS4gIGAvc2lnbmFsL2V2YWx1YXRlYCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIG9yIHRoZSBCYWxhbmNlIHByb2R1Y3QuIFdoaWNoIHByb2R1Y3QgaXMgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGBydWxlc2V0X2tleWAgdGhhdCB5b3UgcHJvdmlkZS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtTaWduYWwgUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSBoYXZlIGhpZ2hlciBsYXRlbmN5IHdoZW4gdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldC4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmVxdWVzdCBkYXRhLiBCYWxhbmNlLW9ubHkgcnVsZXNldHMgbWF5IGhhdmUgbGF0ZW5jeSBvZiB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmU7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZTogYXN5bmMgKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbEV2YWx1YXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRXZhbHVhdGUnLCAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0Jywgc2lnbmFsRXZhbHVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyB1c2VkIHRvIGRldmVsb3AgYSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUgb24gSXRlbXMgd2hlcmUgYHNpZ25hbGAgd2FzIGFkZGVkIGluIHRoZSBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5IGJ1dCBub3QgaW4gdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgIGFycmF5LiBJZiBgL3NpZ25hbC9wcmVwYXJlYCBpcyBza2lwcGVkIG9uIGFuIEl0ZW0gdGhhdCBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBQbGFpZCB3aWxsIGhhdmUgYWNjZXNzIHRvIGxlc3MgZGF0YSBmb3IgY29tcHV0aW5nIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuICBJZiB5b3VyIGludGVncmF0aW9uIGlzIHB1cmVseSBCYWxhbmNlLW9ubHksIHRoaXMgZW5kcG9pbnQgd2lsbCBoYXZlIG5vIGVmZmVjdCwgYXMgQmFsYW5jZS1vbmx5IHJ1bGVzZXRzIGRvIG5vdCBjYWxjdWxhdGUgYSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYW4gSXRlbSB0byBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUHJlcGFyZTogYXN5bmMgKHNpZ25hbFByZXBhcmVSZXF1ZXN0OiBTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUHJlcGFyZScsICdzaWduYWxQcmVwYXJlUmVxdWVzdCcsIHNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcHJlcGFyZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxQcmVwYXJlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZHMgaW50byB5b3VyIHNjb3JlcyBhbmQgdHVuZSBydWxlIGxvZ2ljLiBJZiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGVuZHBvaW50IHdpbGwgbm90IGltcGFjdCBzY29yZXMgKGFzIEJhbGFuY2UgZG9lcyBub3QgdXNlIHNjb3JlcyksIGJ1dCBpcyBuZWNlc3NhcnkgdG8gdmlldyBhY2N1cmF0ZSB0cmFuc2FjdGlvbiBvdXRjb21lcyBhbmQgdHVuZSBydWxlIGxvZ2ljIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFNjaGVkdWxlUmVxdWVzdH0gc2lnbmFsU2NoZWR1bGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsU2NoZWR1bGU6IGFzeW5jIChzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzaWduYWxTY2hlZHVsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFNjaGVkdWxlJywgJ3NpZ25hbFNjaGVkdWxlUmVxdWVzdCcsIHNpZ25hbFNjaGVkdWxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3NjaGVkdWxlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNEb3dubG9hZDogYXN5bmMgKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c0Rvd25sb2FkJywgJ3N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QnLCBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzTGlzdDogYXN5bmMgKHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3N0YXRlbWVudHNMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c0xpc3QnLCAnc3RhdGVtZW50c0xpc3RSZXF1ZXN0Jywgc3RhdGVtZW50c0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBzdGF0ZW1lbnRzIGRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzUmVmcmVzaDogYXN5bmMgKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c1JlZnJlc2gnLCAnc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0Jywgc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VuaGFuY2U6IGFzeW5jICh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0VuaGFuY2UnLCAndHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VucmljaDogYXN5bmMgKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zRW5yaWNoJywgJ3RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvZW5yaWNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0aGUgSXRlbSB3YXMgbGFzdCB1cGRhdGVkLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNHZXQnLCAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlclxcJ3MgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoZSBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBUcmFuc2FjdGlvbnMgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAuICBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIG9wdGlvbmFsIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVmcmVzaCcsICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZTogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUnLCAndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3Q6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdCcsICd0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlJywgJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nLiBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jOiBhc3luYyAodHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNTeW5jJywgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JywgdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQ6IGFzeW5jICh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCcsICd0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIEEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCB0byBjcmVhdGUgYSB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWw6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCcsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6ICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGdldCBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIG9mIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUnLCAndHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogKERlcHJlY2F0ZWQpIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckJhbGFuY2VHZXQ6IGFzeW5jICh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQmFsYW5jZUdldCcsICd0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYW5jZWw6IGFzeW5jICh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FuY2VsJywgJ3RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYW4gYWNjb3VudCB0byBiZSB1c2VkIHdpdGggVHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgd29ya3Mgb24gYWxsIFRyYW5zZmVyLWNhcGFibGUgSXRlbXMsIGluY2x1ZGluZyB0aG9zZSBjcmVhdGVkIGJ5IGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhcGFiaWxpdGllc0dldDogYXN5bmMgKHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQnLCAndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0JywgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldDogYXN5bmMgKHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0JywgJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QnLCB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IGlzIHJldHJ5YWJsZSBhbmQgaWRlbXBvdGVudDsgaWYgYSB0cmFuc2ZlciB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgaXQgd2lsbCByZXR1cm4gdGhlIHRyYW5zZmVyIGRldGFpbHMgd2l0aG91dCBjcmVhdGluZyBhIG5ldyB0cmFuc2Zlci4gQSB0cmFuc2ZlciBtYXkgc3RpbGwgYmUgY3JlYXRlZCBpZiBhIDUwMCBlcnJvciBpcyByZXR1cm5lZDsgdG8gZGV0ZWN0IHRoaXMgc2NlbmFyaW8sIHVzZSBbVHJhbnNmZXIgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3JlY29uY2lsaW5nLXRyYW5zZmVycy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDcmVhdGU6IGFzeW5jICh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ3JlYXRlJywgJ3RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW91XFwnbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIGBtdWx0aXBhcnQvZm9ybS1kYXRhYC4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkOiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkJywgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JywgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0OiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCcsICd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QnLCB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jICh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRMaXN0JywgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgNTAwIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJFdmVudFN5bmMnLCAndHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JywgdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9ldmVudC9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgLiBPbmUgb2YgYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAgbXVzdCBiZSBwb3B1bGF0ZWQgYnV0IG5vdCBib3RoLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckdldDogYXN5bmMgKHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJHZXQnLCAndHJhbnNmZXJHZXRSZXF1ZXN0JywgdHJhbnNmZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRDcmVhdGU6IGFzeW5jICh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVySW50ZW50Q3JlYXRlJywgJ3RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudEdldFJlcXVlc3R9IHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50R2V0OiBhc3luYyAodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudEdldCcsICd0cmFuc2ZlckludGVudEdldFJlcXVlc3QnLCB0cmFuc2ZlckludGVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEZXBvc2l0OiBhc3luYyAodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckRlcG9zaXQnLCAndHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gbGVkZ2VycywgaWYgeW91IGhhdmUgbXVsdGlwbGUuIElmIHlvdVxcJ3JlIGEgcGxhdGZvcm0sIHlvdSBjYW4gbW92ZSBmdW5kcyBiZXR3ZWVuIG9uZSBvZiB5b3VyIGxlZGdlcnMgYW5kIG9uZSBvZiB5b3VyIGN1c3RvbWVyXFwncyBsZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZTogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlJywgJ3RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBsZWRnZXIgZXZlbnRzIGZvciBhIHNwZWNpZmljIGxlZGdlciBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGxlZGdlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0OiBhc3luYyAodHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckV2ZW50TGlzdCcsICd0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9ldmVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckdldDogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJHZXQnLCAndHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXc6IGFzeW5jICh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXcnLCAndHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QnLCB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGlzdDogYXN5bmMgKHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMaXN0JywgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnLCB0cmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLiAgSW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZW5kcG9pbnQgcmV0dXJucyBzdGF0aWMgcGxhY2Vob2xkZXIgdmFsdWVzIHJhdGhlciB0aGFuIG1ldHJpY3MgY29tcHV0ZWQgZnJvbSB5b3VyIFNhbmRib3ggdHJhbnNmZXIgYWN0aXZpdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0OiBhc3luYyAodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1ldHJpY3NHZXQnLCAndHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCcsIHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBwcmV2aW91c2x5LXZlcmlmaWVkIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBvciBbc3VwcG9ydF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQpLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUnLCAndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IGZ1bmRpbmcgYWNjb3VudCBmb3IgdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBmdW5kaW5nIGFjY291bnQgZm9yIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yR2V0JywgJ3RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3Q6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3QnLCAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gc3VibWl0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hdG9yIHlvdSBhcmUgb25ib2FyZGluZywgaW5jbHVkaW5nIHRoZSBvcmlnaW5hdG9yXFwncyBhZ3JlZW1lbnQgdG8gdGhlIHJlcXVpcmVkIGxlZ2FsIHRlcm1zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gb3JpZ2luYXRvciBmb3IgVHJhbnNmZXIgZm9yIFBsYXRmb3JtcyBjdXN0b21lcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZScsICd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yIChlLmcuIGJlbmVmaWNpYWwgb3duZXIgb3IgY29udHJvbCBwZXJzb24pIGFuZCBvcHRpb25hbGx5IHN1Ym1pdCBwZXJzb25hbCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZScsICd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCBhZGRpdGlvbmFsIG9uYm9hcmRpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQgYnkgUGxhaWQgdG8gYXBwcm92ZSBvciBkZWNsaW5lIHRoZSBvcmlnaW5hdG9yLiBTZWUgW1JlcXVpcmVtZW50IHR5cGUgc2NoZW1hIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMU5FUWtURDBzVks1MGlBUWk2eEhpZ3JleERVeFo0UXhYcVNFZlZfRkZUaVUvKSBmb3IgYSBsaXN0IG9mIHJlcXVpcmVtZW50IHR5cGVzIGFuZCBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBhZGRpdGlvbmFsIG9uYm9hcmRpbmcgaW5mb3JtYXRpb24gb24gYmVoYWxmIG9mIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0OiBhc3luYyAodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQnLCAndHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCcsIHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWRcXCdzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZScsICd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWw6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsJywgJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlJywgJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdHZXQ6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nR2V0JywgJ3RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nTGlzdDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdMaXN0JywgJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDYW5jZWw6IGFzeW5jICh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsJywgJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLiAgQSByZWZ1bmQgY2FuIHN0aWxsIGJlIGlzc3VlZCBldmVuIGlmIHRoZSBJdGVtXFwncyBgYWNjZXNzX3Rva2VuYCBpcyBubyBsb25nZXIgdmFsaWQgKGUuZy4gaWYgdGhlIHVzZXIgcmV2b2tlZCBPQXV0aCBjb25zZW50IG9yIHRoZSBJdGVtIHdhcyBkZWxldGVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCksIGFzIGxvbmcgYXMgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyIHBhaXIgdXNlZCB0byBtYWtlIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBpcyBzdGlsbCB2YWxpZC4gQSByZWZ1bmQgY2Fubm90IGJlIGlzc3VlZCBpZiB0aGUgSXRlbSBoYXMgYW4gW2ludmFsaWRhdGVkIFRBTl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKSwgd2hpY2ggY2FuIG9jY3VyIGF0IENoYXNlIG9yIFBOQy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWZ1bmRDcmVhdGUnLCAndHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZEdldDogYXN5bmMgKHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWZ1bmRHZXQnLCAndHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0JywgdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRMaXN0OiBhc3luYyAodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlcGF5bWVudExpc3QnLCAndHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIHNldCBvZiByZXR1cm5zIHRoYXQgd2VyZSBiYXRjaGVkIHRvZ2V0aGVyIGludG8gdGhlIHNwZWNpZmllZCByZXBheW1lbnQuIFRoZSBzdW0gb2YgYW1vdW50cyBvZiByZXR1cm5zIHJldHJpZXZlZCBieSB0aGlzIHJlcXVlc3QgZXF1YWxzIHRoZSBhbW91bnQgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3Q6IGFzeW5jICh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCcsICd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBHZXQ6IGFzeW5jICh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyU3dlZXBHZXQnLCAndHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnLCB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvc3dlZXAvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jICh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyU3dlZXBMaXN0JywgJ3RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCcsIHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvc3dlZXAvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3Mgc2VuZGluZyBjbGllbnQtc3BlY2lmaWMgZXZlbnRzIHJlbGF0ZWQgdG8gTGF5ZXIgc2Vzc2lvbnMgZm9yIGFuYWx5dGljcyBhbmQgdHJhY2tpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlbmQgVXNlciBBY2NvdW50IFNlc3Npb24gRXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kOiBhc3luYyAodXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmQnLCAndXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCcsIHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2V2ZW50L3NlbmRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdXNlciBwZXJtaXNzaW9uZWQgYWNjb3VudCBkYXRhLCBpbmNsdWRpbmcgaWRlbnRpdHkgYW5kIEl0ZW0gYWNjZXNzIHRva2VucywgZm9yIHVzZSB3aXRoIFtQbGFpZCBMYXllcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllcikuIE5vdGUgdGhhdCBlbmQgdXNlcnMgYXJlIHBlcm1pdHRlZCB0byBlZGl0IHRoZSBwcmVmaWxsZWQgaWRlbnRpdHkgZGF0YSBpbiB0aGUgTGluayBmbG93IGJlZm9yZSBzaGFyaW5nIGl0IHdpdGggeW91OyB5b3Ugc2hvdWxkIHRyZWF0IGFueSBpZGVudGl0eSBkYXRhIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXMgdXNlci1zdWJtaXR0ZWQsIHVudmVyaWZpZWQgZGF0YS4gRm9yIGEgdmVyaWZpY2F0aW9uIGxheWVyLCB5b3UgY2FuIGFkZCBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi8pIHRvIHlvdXIgZmxvdywgb3IgY2hlY2sgdGhlIHN1Ym1pdHRlZCBpZGVudGl0eSBkYXRhIGFnYWluc3QgYmFuayBhY2NvdW50IGRhdGEgZnJvbSBsaW5rZWQgYWNjb3VudHMgdXNpbmcgW0lkZW50aXR5IE1hdGNoXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LyNpZGVudGl0eS1tYXRjaCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFVzZXIgQWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3R9IHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQWNjb3VudFNlc3Npb25HZXQ6IGFzeW5jICh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJBY2NvdW50U2Vzc2lvbkdldCcsICd1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0JywgdXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRm9yIFBsYWlkIHByb2R1Y3RzIGFuZCBmbG93cyB0aGF0IHVzZSB0aGUgdXNlciBvYmplY3QsIGAvdXNlci9jcmVhdGVgIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3UgbXVzdCBjYWxsIHRoaXMgZW5kcG9pbnQgYmVmb3JlIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaWYgeW91IGFyZSB1c2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZzogUGxhaWQgQ2hlY2ssIEluY29tZSBWZXJpZmljYXRpb24sIE11bHRpLUl0ZW0gTGluaywgb3IgUGxhaWQgUHJvdGVjdCAoSWRlbnRpdHkpLiBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFByb3RlY3QgTGluayBzZXNzaW9uIHNjb3JpbmcsIHlvdSBkbyBub3QgbmVlZCB0byBjYWxsIGAvdXNlci9jcmVhdGVgIGZpcnN0OyBQbGFpZCB3aWxsIHJlc29sdmUgb3IgY3JlYXRlIHRoZSB1c2VyIHdoZW4gYHVzZXIuY2xpZW50X3VzZXJfaWRgIGlzIHByb3ZpZGVkIGluIGAvbGluay90b2tlbi9jcmVhdGVgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyB0aGlzIGVuZHBvaW50IG9uIG9yIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1LCB0aGlzIGVuZHBvaW50IHRha2VzIGEgYGNsaWVudF91c2VyX2lkYCBhbmQgYW4gYGlkZW50aXR5YCBvYmplY3QgYW5kIHdpbGwgcmV0dXJuIGEgYHVzZXJfaWRgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyBpdCBiZWZvcmUgdGhhdCBkYXRlLCB0aGUgZW5kcG9pbnQgdGFrZXMgYSBgY2xpZW50X3VzZXJfaWRgIGFuZCBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IGFuZCB3aWxsIHJldHVybiBhIGB1c2VyX3Rva2VuYCBhbmQgYHVzZXJfaWRgLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIEluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLCB0aGUgYGlkZW50aXR5YCAobmV3KSBvciBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIChsZWdhY3kpIG9iamVjdCBtdXN0IGJlIHByZXNlbnQuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiAgIEluIG9yZGVyIHRvIGdlbmVyYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCB0aGUgZm9sbG93aW5nIGBpZGVudGl0eWAgZmllbGRzLCBhdCBtaW5pbXVtLCBhcmUgcmVxdWlyZWQgYW5kIG11c3QgYmUgbm9uLWVtcHR5OiBgbmFtZWAsIGBkYXRlX29mX2JpcnRoYCwgYGVtYWlsc2AsIGBwaG9uZV9udW1iZXJzYCwgYW5kIGBhZGRyZXNzZXNgLCAod2l0aCBhdCBsZWFzdCBvbmUgZW1haWwsIHBob25lIG51bWJlciwgYW5kIGFkZHJlc3MgZGVzaWduYXRlZCBhcyBgcHJpbWFyeWApLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC4gSWYgY3JlYXRpbmcgYSByZXBvcnQgZm9yIHNoYXJpbmcgd2l0aCBhIEdTRSBzdWNoIGFzIEZhbm5pZSBvciBGcmVkZGllLCB0aGUgdXNlclxcJ3MgZnVsbCBTU04gbXVzdCBiZSBwcm92aWRlZCB2aWEgdGhlIGBpZF9udW1iZXJzYCBmaWVsZC4gUHJvdmlkaW5nIGF0IGxlYXN0IGEgcGFydGlhbCBTU04gaXMgYWxzbyBzdHJvbmdseSByZWNvbW1lbmRlZCBmb3IgYWxsIHVzZSBjYXNlcywgc2luY2UgaXQgaW1wcm92ZXMgdGhlIGFjY3VyYWN5IG9mIG1hdGNoaW5nIHVzZXIgcmVjb3JkcyBkdXJpbmcgY29tcGxpYW5jZSBwcm9jZXNzZXMgc3VjaCBhcyBmaWxlIGRpc2Nsb3N1cmUsIGRpc3B1dGUsIG9yIHNlY3VyaXR5IGZyZWV6ZSByZXF1ZXN0cy4gICBXaGVuIHVzaW5nIFBsYWlkIFByb3RlY3QsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBwcm92aWRlIGFuIGBpZGVudGl0eWAgb2JqZWN0IHRvIGJldHRlciBpZGVudGlmeSBhbmQgYmxvY2sgZnJhdWQgYWNyb3NzIHlvdXIgTGluayBzZXNzaW9ucy4gICBQbGFpZCB3aWxsIG5vcm1hbGl6ZSBpZGVudGl0eSBmaWVsZHMgYmVmb3JlIHN0b3JpbmcgdGhlbSBhbmQgdXRpbGl6ZSB0aGUgc2FtZSBpZGVudGl0eSBhY3Jvc3MgZGlmZmVyZW50IHVzZXItYmFzZWQgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDcmVhdGU6IGFzeW5jICh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyQ3JlYXRlJywgJ3VzZXJDcmVhdGVSZXF1ZXN0JywgdXNlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChwbGFpZE5ld1VzZXJBUElFbmFibGVkICE9PSB1bmRlZmluZWQgJiYgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydQbGFpZC1OZXctVXNlci1BUEktRW5hYmxlZCddID0gU3RyaW5nKEpTT04uc3RyaW5naWZ5KHBsYWlkTmV3VXNlckFQSUVuYWJsZWQpKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIEZpbmFuY2lhbCBJbnNpZ2h0cyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyB0aGUgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgYW5kIExpYWJpbGl0aWVzIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBUcmFuc2FjdGlvbnMgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdXNlciBpdGVtcyBmb3IgRmluYW5jaWFsLUluc2lnaHRzIGJ1bmRsZVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3R9IHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2g6IGFzeW5jICh1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0OiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaCcsICd1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0JywgdXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9maW5hbmNpYWxfZGF0YS9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IHVzZXIgZGV0YWlscyB1c2luZyBhIGB1c2VyX2lkYC4gVGhpcyBlbmRwb2ludCBvbmx5IHN1cHBvcnRzIHVzZXJzIHRoYXQgd2VyZSBjcmVhdGVkIG9uIHRoZSBuZXcgdXNlciBBUEkgZmxvdywgd2l0aG91dCBhIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB1c2VyIGlkZW50aXR5IGFuZCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJHZXRSZXF1ZXN0fSB1c2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyR2V0OiBhc3luYyAodXNlckdldFJlcXVlc3Q6IFVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckdldCcsICd1c2VyR2V0UmVxdWVzdCcsIHVzZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICBpZiAocGxhaWROZXdVc2VyQVBJRW5hYmxlZCAhPT0gdW5kZWZpbmVkICYmIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnUGxhaWQtTmV3LVVzZXItQVBJLUVuYWJsZWQnXSA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShwbGFpZE5ld1VzZXJBUElFbmFibGVkKSk7XG4gICAgICAgICAgICB9XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIGN1c3RvbWVycyB0byBleHBsaWNpdGx5IHB1cmdlIGlkZW50aXR5L1BJSSBkYXRhIHByb3ZpZGVkIHRvIFBsYWlkIGZvciBhIGdpdmVuIHVzZXIuIFRoaXMgaXMgbm90IGV4cG9zZWQgdG8gY3VzdG9tZXJzIGJ5IGRlZmF1bHQsIGFzIGl0IGlzIG1lYW50IGZvciBzcGVjaWFsIHNjZW5hcmlvcyBvciByZXF1ZXN0cywgYnV0IFBsYWlkIGlzIG9ibGlnYXRlZCB0byBlbmFibGUgY3VzdG9tZXJzIHRvIGRlbGV0ZSBQSUkgcHJvdmlkZWQgdG8gdXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtVc2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0fSB1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJZGVudGl0eVJlbW92ZTogYXN5bmMgKHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3Q6IFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJJZGVudGl0eVJlbW92ZScsICd1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0JywgdXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9pZGVudGl0eS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgaWYgKHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiBwbGFpZE5ld1VzZXJBUElFbmFibGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ1BsYWlkLU5ldy1Vc2VyLUFQSS1FbmFibGVkJ10gPSBTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGxhaWROZXdVc2VyQVBJRW5hYmxlZCkpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzc29jaWF0ZXMgSXRlbXMgdG8gdGhlIHRhcmdldCB1c2VyLiBJZiBhbiBJdGVtIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB0byBhbm90aGVyIHVzZXIsIHRoZSBJdGVtIHdpbGwgYmUgZGlzYXNzb2NpYXRlZCB3aXRoIHRoZSBleGlzdGluZyB1c2VyIGFuZCBhc3NvY2lhdGVkIHRvIHRoZSB0YXJnZXQgdXNlci4gVGhpcyBvcGVyYXRpb24gc3VwcG9ydHMgYSBtYXggb2YgMTAwIEl0ZW1zLlxuICAgICAgICAgKiBAc3VtbWFyeSBBc3NvY2lhdGUgSXRlbXMgdG8gYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdH0gdXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0Fzc29jaWF0ZTogYXN5bmMgKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3Q6IFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckl0ZW1zQXNzb2NpYXRlJywgJ3VzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QnLCB1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2l0ZW1zL2Fzc29jaWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLCBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuIFBsYWlkIGFzc29jaWF0ZXMgYW4gSXRlbSB3aXRoIGEgVXNlciB3aGVuIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgd2l0aGluIGEgTGluayBzZXNzaW9uIGluaXRpYWxpemVkIHdpdGggdGhhdCBgdXNlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0dldDogYXN5bmMgKHVzZXJJdGVtc0dldFJlcXVlc3Q6IFVzZXJJdGVtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckl0ZW1zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckl0ZW1zR2V0JywgJ3VzZXJJdGVtc0dldFJlcXVlc3QnLCB1c2VySXRlbXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2l0ZW1zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgc3BlY2lmaWMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci4gSXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIG9uIGVhY2ggSXRlbSBpbmRpdmlkdWFsbHksIGJ1dCBzdXBwb3J0cyB1c2UgY2FzZXMgKHN1Y2ggYXMgUGxhaWQgQ2hlY2spIHdoZXJlIGFjY2VzcyB0b2tlbnMgYXJlIG5vdCBhdmFpbGFibGUuIEFsbCBzcGVjaWZpZWQgSXRlbXMgbXVzdCBiZWxvbmcgdG8gdGhlIHVzZXIgb3IgdGhlIGVudGlyZSBvcGVyYXRpb24gZmFpbHMuIFNpbWlsYXIgdG8gYC9pdGVtL3JlbW92ZWAsIHRoaXMgZGVsZXRlcyBJdGVtIHByb2R1Y3QgZGF0YSBhbmQgdGVybWluYXRlcyBiaWxsaW5nIG9uIHRoZSBJdGVtXFwncyBwcm9kdWN0cy4gT25jZSByZW1vdmVkLCBJdGVtcyBjYW5ub3QgYmUgcmVjb25uZWN0ZWQgd2l0aG91dCBnb2luZyB0aHJvdWdoIExpbmsgYWdhaW4uIFRoaXMgZW5kcG9pbnQgaXMgbm90IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgZGF0YSBmb3IgYSB1c2VyLCBhcyBpdCB3aWxsIG9ubHkgcmVtb3ZlIEl0ZW1zIGFuZCBubyBvdGhlciBkYXRhIGZvciB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIGFueSB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gcHJvZHVjdHMgKEZpbmFuY2lhbCBNYW5hZ2VtZW50LCBQbGFpZCBQcm90ZWN0LCBvciBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFuZCBpcyBkZWxldGluZyB0aGVpciBhY2NvdW50IHdpdGggeW91ciBwcm9kdWN0LCBhbHNvIGNhbGwgYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWAgdG8gZW5kIHRob3NlIHN1YnNjcmlwdGlvbnM7IHBlci1JdGVtIGJpbGxpbmcgaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBhIHVzZXIgaW5pdGlhdGVkIGRhdGEgZGVsZXRpb24gcmVxdWVzdCwgc2VlIHRoZSBbQ29uc3VtZXIgU2VydmljZSBDZW50ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2NoZWNrL2NvbnN1bWVyLXNlcnZpY2UtY2VudGVyLykgdG8gcmV2b2tlIGFjY2VzcyB0byBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgSXRlbXMgZnJvbSBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNSZW1vdmVSZXF1ZXN0fSB1c2VySXRlbXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckl0ZW1zUmVtb3ZlOiBhc3luYyAodXNlckl0ZW1zUmVtb3ZlUmVxdWVzdDogVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VySXRlbXNSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VySXRlbXNSZW1vdmUnLCAndXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCcsIHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvaXRlbXMvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGVybWluYXRlcyB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gYnVuZGxlcyBvciBwcm9kdWN0cyAoRmluYW5jaWFsIE1hbmFnZW1lbnQsIFBsYWlkIFByb3RlY3QsIGFuZCBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFzc29jaWF0ZWQgd2l0aCBhIGB1c2VyX2lkYC4gQWZ0ZXIgeW91IGNhbGwgdGhpcyBlbmRwb2ludCwgdGhlIHVzZXIgd2lsbCBubyBsb25nZXIgYmUgYmlsbGVkIGZvciB0aGVzZSBwcm9kdWN0cy4gRm9yIENSQSBNb25pdG9yaW5nLCB0aGUgc3Vic2NyaXB0aW9uIGlzIGNhbmNlbGVkIGJ1dCBoaXN0b3JpY2FsIGRhdGEgcmVtYWlucyBhdmFpbGFibGUgZm9yIGZ1dHVyZSByZXBvcnQgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRlcm1pbmF0ZSB1c2VyLWJhc2VkIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gdXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZTogYXN5bmMgKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Q6IFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclByb2R1Y3RzVGVybWluYXRlJywgJ3VzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QnLCB1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUmVtb3ZlUmVxdWVzdH0gdXNlclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclJlbW92ZTogYXN5bmMgKHVzZXJSZW1vdmVSZXF1ZXN0OiBVc2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJSZW1vdmUnLCAndXNlclJlbW92ZVJlcXVlc3QnLCB1c2VyUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgaWYgKHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiBwbGFpZE5ld1VzZXJBUElFbmFibGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ1BsYWlkLU5ldy1Vc2VyLUFQSS1FbmFibGVkJ10gPSBTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGxhaWROZXdVc2VyQVBJRW5hYmxlZCkpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gVGhpcyB0b2tlbiBjYW4gYmUgc2hhcmVkIHdpdGggYW5kIHVzZWQgYnkgYSBzcGVjaWZpZWQgdGhpcmQtcGFydHkgY2xpZW50IHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aHJvdWdoIHN1cHBvcnRlZCBlbmRwb2ludHMuICBFbnN1cmUgeW91IHN0b3JlIHRoZSBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIGFuZCBgdGhpcmRfcGFydHlfY2xpZW50X2lkYCwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGU6IGFzeW5jICh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUnLCAndXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGRlbGV0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIE9uY2UgcmVtb3ZlZCwgdGhlIHRva2VuIGNhbiBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlOiBhc3luYyAodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlJywgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JywgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgVXNlciB1c2luZyB0aGUgVHJhbnNhY3Rpb25zIGJ1bmRsZS4gVGhpcyBidW5kbGUgcmVmcmVzaGVzIG9ubHkgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGRhdGEuIFRoaXMgZW5kcG9pbnQgaXMgZm9yIGNsaWVudHMgd2hvIHVzZSB0aGUgVHJhbnNhY3Rpb25zIEluc2lnaHRzIGJ1bmRsZSBhbmQgd2FudCB0byBwcm9hY3RpdmVseSB1cGRhdGUgYWxsIGxpbmtlZCBJdGVtcyB1bmRlciBhIHVzZXIuIFRoZSByZWZyZXNoIG1heSBzdWNjZWVkIG9yIGZhaWwgb24gYSBwZXItSXRlbSBiYXNpcy4gVXNlIHRoZSBgcmVzdWx0c2AgYXJyYXkgaW4gdGhlIHJlc3BvbnNlIHRvIHVuZGVyc3RhbmQgdGhlIG91dGNvbWUgZm9yIGVhY2ggSXRlbS4gIFRoaXMgZW5kcG9pbnQgaXMgZGlzdGluY3QgZnJvbSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgd2hpY2ggdHJpZ2dlcnMgYSByZWZyZXNoIGZvciBhIHNpbmdsZSBJdGVtLiBVc2UgYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCB0byB0YXJnZXQgYWxsIEl0ZW1zIGZvciBhIHVzZXIgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB1c2VyIGl0ZW1zIGZvciBUcmFuc2FjdGlvbnMgYnVuZGxlXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclRyYW5zYWN0aW9uc1JlZnJlc2gnLCAndXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JywgdXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHVwZGF0ZXMgdXNlciBpbmZvcm1hdGlvbiBmb3IgYW4gZXhpc3RpbmcgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYC4gSWYgYW4gZXhpc3RpbmcgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYCBpcyBtaXNzaW5nIGZpZWxkcyByZXF1aXJlZCBmb3IgYSBnaXZlbiB1c2UgY2FzZSAoZS5nLiBjcmVhdGluZyBhIENvbnN1bWVyIFJlcG9ydCkgdXNlIGAvdXNlci91cGRhdGVgIHRvIGFkZCB2YWx1ZXMgZm9yIHRob3NlIGZpZWxkcy4gIElkZW50aXR5IHVwZGF0ZXMgdXNlIG1lcmdlIHNlbWFudGljczogcHJvdmlkZWQgZmllbGRzIG92ZXJ3cml0ZSBleGlzdGluZyBvbmVzOyBvbWl0dGVkIGZpZWxkcyByZW1haW4gdW5jaGFuZ2VkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVXBkYXRlOiBhc3luYyAodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclVwZGF0ZScsICd1c2VyVXBkYXRlUmVxdWVzdCcsIHVzZXJVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICBpZiAocGxhaWROZXdVc2VyQVBJRW5hYmxlZCAhPT0gdW5kZWZpbmVkICYmIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnUGxhaWQtTmV3LVVzZXItQVBJLUVuYWJsZWQnXSA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShwbGFpZE5ld1VzZXJBUElFbmFibGVkKSk7XG4gICAgICAgICAgICB9XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZTogYXN5bmMgKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0Q3JlYXRlJywgJ3dhbGxldENyZWF0ZVJlcXVlc3QnLCB3YWxsZXRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQ6IGFzeW5jICh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldEdldCcsICd3YWxsZXRHZXRSZXF1ZXN0Jywgd2FsbGV0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0TGlzdDogYXN5bmMgKHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0TGlzdCcsICd3YWxsZXRMaXN0UmVxdWVzdCcsIHdhbGxldExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlOiBhc3luYyAod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUnLCAnd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQ6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uR2V0JywgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Q6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uTGlzdCcsICd3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGl0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcHJvZ3JhbS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQ6IGFzeW5jICh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQnLCAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnLCB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUZwID0gZnVuY3Rpb24oY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yID0gUGxhaWRBcGlBeGlvc1BhcmFtQ3JlYXRvcihjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCAgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWRcXCdzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0OyBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBOb3RlOiBJZiB5b3UgYXJlIGdldHRpbmcgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2Vzc2luZyB0aGUgcmV0dXJuIHJpc2sgb2YgYSBwcm9wb3NlZCBBQ0ggdHJhbnNhY3Rpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZCBvZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gYC9zaWduYWwvZXZhbHVhdGVgIHJldHVybnMgdGhlIHNhbWUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24gYW5kIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIFNpZ25hbCBSdWxlcywgd2hpY2ggcHJvdmlkZXMgbm8tY29kZSB0cmFuc2FjdGlvbiBidXNpbmVzcyBsb2dpYyBjb25maWd1cmF0aW9uLCBiYWNrdGVzdGluZyBhbmQgcmVjb21tZW5kYXRpb25zIGZvciB0dW5pbmcgeW91ciB0cmFuc2FjdGlvbiBhY2NlcHRhbmNlIGxvZ2ljLCBhbmQgdGhlIGFiaWxpdHkgdG8gZWFzaWx5IHN3aXRjaCBiZXR3ZWVuIEJhbGFuY2UgYW5kIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgYXMgbmVlZGVkIGZvciB1bHRyYS1sb3ctbGF0ZW5jeSwgTUwtcG93ZXJlZCByaXNrIGFzc2Vzc21lbnRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtCYWxhbmNlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYmFsYW5jZS8jYmFsYW5jZS1pbnRlZ3JhdGlvbi1vcHRpb25zKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyAtLSB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50cyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gdGhlIEdTRXMgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHkgaW4gUERGIGZvcm1hdC4gVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0aGF0IHdhcyBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldChhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nLCBzYXZpbmdzLCBhbmQgY2FzaCBtYW5hZ2VtZW50IGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL3ZlcmlmeWAgZW5kcG9pbnQgdmVyaWZpZXMgYmFuayBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgYW5kIChvcHRpb25hbGx5KSBhY2NvdW50IG93bmVyIG5hbWVzIGFnYWluc3QgUGxhaWRcXCdzIGRhdGFiYXNlIHZpYSBbRGF0YWJhc2UgQXV0aF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL2RhdGFiYXNlLWF1dGgvKS4gSXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGFjY291bnQgbnVtYmVycyB0aGF0IHdlcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhlIFBsYWlkIExpbmsgZmxvdy4gIFRoaXMgZW5kcG9pbnQgaXMgY3VycmVudGx5IGluIEVhcmx5IEF2YWlsYWJpbGl0eTsgY29udGFjdCBzYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgVmVyaWZ5IGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhWZXJpZnlSZXF1ZXN0fSBhdXRoVmVyaWZ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhWZXJpZnkoYXV0aFZlcmlmeVJlcXVlc3Q6IEF1dGhWZXJpZnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhWZXJpZnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoVmVyaWZ5KGF1dGhWZXJpZnlSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgIHRvIGdldCByaXNrIGluc2lnaHRzIGZvciBhIGxpbmtlZCBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSByaXNrIG9mIGEgYmFuayBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3R9IGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdDogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIGZyYXVkIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgSUQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhbGwgQWNjb3VudHMgbGlua2VkIHRvIHRoaXMgQmVhY29uIFVzZXIuIFRoZSBpbnNpZ2h0cyBmb3IgZWFjaCBhY2NvdW50IGFyZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIEJlYWNvbiBVc2VyIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIEJlYWNvbiBVc2VyXFwncyBoaXN0b3J5XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdH0gYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgcmVqZWN0ZWRgLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYGNsZWFyZWRgLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBjbGVhcmVkYC4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYHBlbmRpbmdfcmV2aWV3YC4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtIG9yIGFkZCBuZXcgYWNjb3VudHMgdG8gdGhlIEJlYWNvbiBVc2VyLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGFuIGlkZW50aXR5IGRhdGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL2V3YV9yZXBvcnQvdjEvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhbiBFYXJuZWQgV2FnZSBBY2Nlc3MgKEVXQSkgc2NvcmUgdGhhdCBxdWFudGlmaWVzIHRoZSBkZWxpbnF1ZW5jeSByaXNrIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGl0ZW0uIFRoZSBzY29yZSBpcyBkZXJpdmVkIGZyb20gYSBjb21iaW5hdGlvbiBvZiBjYXNoZmxvdyBwYXR0ZXJucyBhbmQgbmV0d29yay1iYXNlZCBiZWhhdmlvcmFsIGZlYXR1cmVzLiAgVGhlIHJlc3BvbnNlIHJldHVybnMgYSBsaXN0IG9mIEVXQSBzY29yZXMsIHdoZXJlIGVhY2ggc2NvcmUgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWwgYWR2YW5jZSBhbW91bnQgcmFuZ2UuIFRoZXNlIHNjb3JlcyBlc3RpbWF0ZSB0aGUgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQgZm9yIGFkdmFuY2VzIHdpdGhpbiB0aGF0IHJhbmdlLiAgU2NvcmUgcmFuZ2U6IDEtOTkgIEludGVycHJldGF0aW9uOiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIGEgZ3JlYXRlciBsaWtlbGlob29kIG9mIHJlcGF5bWVudC4gIFRoaXMgZW5kcG9pbnQgZW5hYmxlcyBjbGllbnRzIHRvIGFzc2VzcyByZXBheW1lbnQgcmlzayBhbmQgbWFrZSBkYXRhLWRyaXZlbiBkZWNpc2lvbnMgd2hlbiBkZXRlcm1pbmluZyBlbGlnaWJpbGl0eSBvciBsaW1pdHMgZm9yIGVhcm5lZCB3YWdlIGFkdmFuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgRVdBIFNjb3JlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JldGFFd2FSZXBvcnRWMUdldFJlcXVlc3R9IGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZXRhRXdhUmVwb3J0VjFHZXQoYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdDogQmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZXRhRXdhUmVwb3J0VjFHZXQoYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIHJlY29yZC4gWW91IGNhbiBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgeW91IGhhdmUgYXZhaWxhYmxlLiBJZiBhbnkgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgbWlzc2luZyBmb3IgdGhlIHByb2R1Y3RzIHlvdSBpbnRlbmQgdG8gdXNlLCBpdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgYHJlcXVpcmVtZW50c19kdWVgIGZpZWxkIG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0OiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZXRhaWxzIG9mIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0fSBiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0KGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3Q6IEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0KGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIGVuZCBjdXN0b21lciByZWNvcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYW4gZXhpc3RpbmcgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1c2luZXNzIHZlcmlmaWNhdGlvbiB0byBjaGVjayBhIGJ1c2luZXNzXFwncyBpZGVudGl0eSBhbmQgcmlzayBwcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlKGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGUoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBzcGVjaWZpYyBidXNpbmVzcyB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJ1c2luZXNzIFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0J1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYnVzaW5lc3NWZXJpZmljYXRpb25HZXQoYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5idXNpbmVzc1ZlcmlmaWNhdGlvbkdldChidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jYXNoZmxvd19yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRyYW5zYWN0aW9ucyBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYGhhc19tb3JlYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBOb3RlIHRoYXQgZGF0YSBpc25cXCd0IGxpa2VseSB0byBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9jYXNoZmxvd19yZXBvcnQvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGBjYXNoZmxvd19yZXBvcnRgLCBvciBpZiBpdCB3YXNuXFwndCwgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXNoZmxvd1JlcG9ydEdldChjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9pbnNpZ2h0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyBpbnNpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBJbnNpZ2h0cyBhcmUgb25seSBjYWxjdWxhdGVkIG9uIGNyZWRpdCBhbmQgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyBpbnNpZ2h0cyBkYXRhIGluIENhc2hmbG93IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQoY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0KGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAgaXMgYW4gZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0gKGdpdmVuIGFuIGBpdGVtX2lkYCkuIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIENhc2hmbG93IFJlcG9ydCBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gIEFmdGVyIGNhbGxpbmcgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgYWxlcnRpbmcgY2xpZW50cyB0aGF0IG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBjYW4gdGhlbiBiZSBpbmdlc3RlZCB2aWEgYC9jYXNoZmxvd19yZXBvcnQvZ2V0YCBvciB0aGUgd2ViaG9vayB3aWxsIGNvbnRhaW4gYW4gZXJyb3IgY29kZSBpbmZvcm1pbmcgdGhlcmUgd2FzIGFuIGVycm9yIGluIHJlZnJlc2hpbmcgdHJhbnNhY3Rpb25zIGRhdGEuICBOb3RlIHRoYXQgdGhlIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSkuIElmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIGZvciByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdH0gY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNhc2hmbG93UmVwb3J0UmVmcmVzaChjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0OiBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhc2hmbG93UmVwb3J0UmVmcmVzaChjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGBjYXNoZmxvd19yZXBvcnRgLCBvciBpZiBpdCB3YXNuXFwndCwgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldChjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0KGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gbGVnYWN5IGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIFt1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pIGluc3RlYWQgb2YgdGhlIGxlZ2FjeSBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGxlZ2FjeSBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBJdGVtIGNvbnNlbnQgZXZlbnRzLiBDb25zZW50IGxvZ3MgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBldmVudHMgb2NjdXJyaW5nIG9uIG9yIGFmdGVyIE5vdmVtYmVyIDcsIDIwMjQuIEV4dHJlbWVseSByZWNlbnQgZXZlbnRzIChvY2N1cnJpbmcgd2l0aGluIHRoZSBwYXN0IDEyIGhvdXJzKSBtYXkgbm90IGJlIGF2YWlsYWJsZSB2aWEgdGhpcyBlbmRwb2ludC4gVXAgdG8gdGhyZWUgeWVhcnMgb2YgY29uc2VudCBsb2dzIHdpbGwgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc2VudEV2ZW50c0dldFJlcXVlc3R9IGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdDogQ29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q29uc2VudEV2ZW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUERGIFJlcG9ydHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3R9IGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdDogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEJhc2UgUmVwb3J0IGZvciB5b3VyIHVzZXIsIGFsbG93aW5nIHlvdSB0byByZWNlaXZlIGNvbXByZWhlbnNpdmUgYmFuayBhY2NvdW50IGFuZCBjYXNoIGZsb3cgZGF0YS4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgaW5zaWdodHMsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfY2FzaGZsb3dfaW5zaWdodHNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20geW91ciB1c2VyXFwncyBiYW5raW5nIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQgYW5kIHJlZnJlc2ggdGhlIGRhdGEgaW4gdGhlIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBvciBjcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRDcmVhdGUoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIE5PVEU6IFRoZSBmb2xsb3dpbmcgc2NoZW1hIHdhcyB1cGRhdGVkIGluIEFwcmlsIDIwMjYgdG8gcmVmbGVjdCB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgcHJvdmlkZWQgdmVyc2lvbiBpcyBcXFwiSUkyXFxcIi4gUGxlYXNlIHNlZSBbdGhpcyBkb2N1bWVudF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjAjaGVhZGluZz1oLnJ1ZGFtemludXMyaSkgZm9yIGd1aWRhbmNlIG9uIG1pZ3JhdGluZyB0byBJSTIgaWYgeW91IGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIElJMSB2ZXJzaW9uLCBhbmQgW3RoaXMgc2VjdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjAjYm9va21hcms9aWQudGRjYzJ3cGswaDYwKSBmb3IgYW4gZXhhbXBsZSBJSTEgcmVzcG9uc2UgYWxvbmcgd2l0aCBpdHMgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWtRa1E3Rk9nRmFDNG4tc1VHVWs3NGhvWFpOWV9MX25KZUN1TWU3S2VpcDQvZWRpdD90YWI9dC4zNmM4NW4yaXJjcWsjaGVhZGluZz1oLjc5ZHdyNWMxaXN6bCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTGVuZFNjb3JlIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cywgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9sZW5kX3Njb3JlYCBwcm9kdWN0IG9yIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgd2l0aCB0aGUgYGNyYV9sZW5kX3Njb3JlYCBwcm9kdWN0LCBQbGFpZCB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBMZW5kU2NvcmUgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXQoY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydExlbmRTY29yZUdldChjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgcHJvZHVjdCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbmV0d29ya19pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgUGxhaWQgd2lsbCBnZW5lcmF0ZSB0aGUgYXR0cmlidXRlcyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgUGFydG5lciBJbnNpZ2h0cyBvciBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGJlIGluY2x1ZGVkIGluIHRoZSBQREYgYXMgd2VsbCwgdXNlIHRoZSBgYWRkLW9uc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQ29uc3VtZXIgUmVwb3J0IGFzIGEgUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGhvbWUgbGVuZGluZyByZXBvcnRzIGZvciBhIHVzZXIuIFRvIG9idGFpbiBhIFZvQSBvciBFbXBsb3ltZW50IFJlZnJlc2ggcmVwb3J0LCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBgY3JhX2Jhc2VfcmVwb3J0YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIG9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHZhcmlvdXMgaG9tZSBsZW5kaW5nIHJlcG9ydHMgZm9yIGEgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LCBzcGVjaWZpY2FsbHkgZm9ybWF0dGVkIGZvciBIb21lIExlbmRpbmcgdmVyaWZpY2F0aW9uIHVzZSBjYXNlcy4gQmVmb3JlIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgZW5zdXJlIHRoYXQgeW91XFwndmUgY3JlYXRlZCBhIFZPQSByZXBvcnQgdGhyb3VnaCBMaW5rIG9yIHRoZSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCwgYW5kIGhhdmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vay4gIFRoZSByZXNwb25zZSB0byBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFZlcmlmaWNhdGlvbiBQREZcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0KGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jcmVkaXRfcHJvZmlsZS9yZXBvcnQvZ2V0YCByZXRyaWV2ZXMgYSBjcmVkaXQgcHJvZmlsZSByZXBvcnQgZm9yIGEgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGNyZWRpdCBwcm9maWxlIHJlcG9ydCBmb3IgYSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldChjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdDogQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXQoY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXIoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0fSBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zVW5yZWdpc3RlcihjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0OiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91cGRhdGVgIHVwZGF0ZXMgbG9hbiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzdGF0dXMgYW5kIHBheW1lbnQgaGlzdG9yeS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGxvYW4gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVXBkYXRlUmVxdWVzdH0gY3JhTG9hbnNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgYSBDYXNoIEZsb3cgVXBkYXRlcyByZXBvcnQgYnkgcGFzc2luZyBpbiB0aGUgYHVzZXJfaWRgIHJlZmVycmVkIHRvIGluIHRoZSB3ZWJob29rIHlvdSByZWNlaXZlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFNb25pdG9yaW5nSW5zaWdodHNHZXQoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbGlua2VkIENSQSBJdGVtLCB3aGljaCBhcmUgdXBkYXRlZCBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5IChiZXN0LWVmZm9ydCkuIEluIHRoZSBjdXJyZW50IENhc2ggRmxvdyBVcGRhdGVzIGJldGEgZXhwZXJpZW5jZSwgb25seSBvbmUgSXRlbSBwZXIgdXNlciBtYXkgYmUgc3Vic2NyaWJlZCBmb3IgbW9uaXRvcmluZyB1cGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byB1bnN1YnNjcmliZSBmcm9tIHByZXZpb3VzbHkgc3Vic2NyaWJlZCBNb25pdG9yaW5nIEluc2lnaHRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbnN1YnNjcmliZSBmcm9tIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggYSBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQtU3BvbnNvcmVkIEVudGVycHJpc2UgKEdTRSkgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgKS4gIFVzZSB0aGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSBHU0Ugd2hvIG5lZWRzIGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC4gIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgaXMgZGVwcmVjYXRlZC4gVGhlIGJhY2tlbmQgaW1wbGVtZW50YXRpb24gd2FzIHJlbW92ZWQgKHJldHVybnMgYW4gYFVuaW1wbGVtZW50ZWRgIGVycm9yIGF0IHJ1bnRpbWUpLCBhbmQgdGhlIGVuZHBvaW50IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudGVkIEFQSSBzdXJmYWNlLiBUbyByZWZyZXNoIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGV4aXN0aW5nIHVzZXIsIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZSBzbyB0aGV5IGNhbiBjb25maXJtIHRoZWlyIGluY29tZSBzb3VyY2VzLiBGb3IgYSBmdWxseSBiYWNrZW5kIHJlZnJlc2gsIG1pZ3JhdGUgdG8gQ1JBIEluY29tZSBJbnNpZ2h0cyBhbmQgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0fSBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRva2VuLCBhbmQgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgYGVtcGxveWVyYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgV2hlbiB0ZXN0aW5nIGluIFNhbmRib3gsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVzdWx0cyBieSBwcm92aWRpbmcgc3BlY2lhbCB0ZXN0IHZhbHVlcyBpbiB0aGUgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGZpZWxkcy4gYGVtcGxveWVyX2dvb2RgIGFuZCBgZW1wbG95ZXJfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIGBlbXBsb3llcl9tdWx0aWAgd2lsbCByZXN1bHQgaW4gYSBgSElHSGAgY29uZmlkZW5jZSB3aXRoIG11bHRpcGxlIHBheXJvbGwgb3B0aW9ucy4gTGlrZXdpc2UsIGBhY2Nlc3NfZ29vZGAgYW5kIGBhY2Nlc3NfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIEFueSBvdGhlciB2YWx1ZSBmb3IgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGluIFNhbmRib3ggd2lsbCByZXN1bHQgaW4gYFVOS05PV05gIGNvbmZpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgRGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF1ZGl0IG9yIHRyYWNrIHRoZSBsaXN0IG9mIHJldmlld2VycyBmb3IgTW9uaXRvciwgQmVhY29uLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IERhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlkXFwncyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgY29uc2VudCBncmFudCBieSBpdHMgaWRlbnRpZmllclxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgRkRYIENvbnNlbnQgR3JhbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnNlbnRJZCBDb25zZW50IEdyYW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZkeENvbnNlbnRzR2V0KGNvbnNlbnRJZDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEZEWENvbnNlbnRHcmFudD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZHhDb25zZW50c0dldChjb25zZW50SWQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXZvY2F0aW9uIGhpc3Rvcnkgb2YgYSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEZEWCBDb25zZW50IEdyYW50IHJldm9jYXRpb24gcmVjb3Jkc1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmR4Q29uc2VudHNSZXZvY2F0aW9uR2V0KGNvbnNlbnRJZDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEZEWENvbnNlbnRSZXZvY2F0aW9ucz4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZHhDb25zZW50c1Jldm9jYXRpb25HZXQoY29uc2VudElkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXBwZW5kcyBhIFJFVk9LRUQgc3RhdHVzIHJlY29yZCB0byB0aGUgbmFtZWQgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgRkRYIENvbnNlbnQgR3JhbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnNlbnRJZCBDb25zZW50IEdyYW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhDb25zZW50c1Jldm9rZShjb25zZW50SWQ6IHN0cmluZywgcmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Q29uc2VudHNSZXZva2UoY29uc2VudElkLCByZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2VuZXJpYyB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBGRFggRXZlbnQgTm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGEgc3BlY2lmaWMgcmVjaXBpZW50XG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudElkIFJlY2lwaWVudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvQVVUSFNUQVRFSURdIFRoZSB2YWx1ZSB0aGF0IGlzIHBhc3NlZCBpbnRvIHRoZSBPQXV0aCBVUkkgXFwmIzM5O3N0YXRlXFwmIzM5OyBxdWVyeSBwYXJhbWV0ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRSZWNpcGllbnQocmVjaXBpZW50SWQ6IHN0cmluZywgb0FVVEhTVEFURUlEPzogc3RyaW5nLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEdldFJlY2lwaWVudFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmdldFJlY2lwaWVudChyZWNpcGllbnRJZCwgb0FVVEhTVEFURUlELCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ2V0UmVjaXBpZW50cyhvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEdldFJlY2lwaWVudHNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5nZXRSZWNpcGllbnRzKG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHRvIHJldHJpZXZlIGlkZW50aXR5IGRldGFpbHMgd2hlbiB1c2luZyBbSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5L2lkZW50aXR5LWRvY3VtZW50LXVwbG9hZC8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgb3IgYC9zaWduYWwvZXZhbHVhdGVgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eU1hdGNoUmVxdWVzdH0gaWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eU1hdGNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGJ5IHRoZSBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAgZmllbGQuIEF0IGxlYXN0IG9uZSBvZiB0aGVzZSB0d28gZmllbGRzIG11c3QgYmUgcHJvdmlkZWQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIGB1c2VyX2lkYCBpcyBwcm92aWRlZCwgdGhlcmUgbXVzdCBiZSBhbiBhc3NvY2lhdGVkIHVzZXIgb3RoZXJ3aXNlIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuICAgSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZXhpc3RzIGZvciBhIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgYW5kL29yIGB1c2VyX2lkYCwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGEgYDIwMCBPS2AgSFRUUCBzdGF0dXMgY29kZS4gICBJZiBgdXNlcl9pZGAgaXMgbm90IHByb3ZpZGVkLCB5b3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gSWYgYHVzZXJfaWRgIGlzIHByb3ZpZGVkLCB1c2VyIGluZm9ybWF0aW9uIGNhbiBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QgYm9keS4gUGxlYXNlIHVzZSB0aGUgYC91c2VyL3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHVzZXIgZGF0YSBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGJlZ2lucyB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHJldHVybmluZyBhbiBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgdW5kZXIgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTGluayBpbnN0YW5jZSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGdvIHRocm91Z2ggdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gUGxhaWQgd2lsbCBmaXJlIGFuIGBJTkNPTUVgIHdlYmhvb2sgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIFBheXJvbGwgSW5jb21lIGZsb3csIG9yIHdoZW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gYW5kIHJldHVybnMgYSBgcHJlY2hlY2tfaWRgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHByb3ZpZGluZyB0aGUgYHByZWNoZWNrX2lkYCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSBgcHJlY2hlY2tfaWRgIGNhbiBzdGlsbCBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGVpdGhlciBgZW1wbG95ZXJgIG9yIGB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vuc2AgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9uXFwncyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudFxcJ3MgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBwYXJhbWV0ZXJzIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBoYXMgc2luY2UgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGBJc3N1ZWAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIHNpbmdsZSBgSXNzdWVgIG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzR2V0UmVxdWVzdH0gaXNzdWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0OiBJc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElzc3Vlc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlzc3Vlc1NlYXJjaChpc3N1ZXNTZWFyY2hSZXF1ZXN0OiBJc3N1ZXNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElzc3Vlc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlzc3Vlc1NlYXJjaChpc3N1ZXNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1N1YnNjcmliZVJlcXVlc3R9IGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdDogSXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJc3N1ZXNTdWJzY3JpYmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb25cXCdzIGFjY2VzcyB0byB0aGUgVXNlclxcJ3MgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHB1YmxpYyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUltcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3Byb2R1Y3RzL3Rlcm1pbmF0ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byB0ZXJtaW5hdGUgYW4gSXRlbS4gT25jZSB0ZXJtaW5hdGVkLCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGlzIG5vIGxvbmdlciB2YWxpZCwgYmlsbGluZyBmb3IgdGhlIEl0ZW1cXCdzIHByb2R1Y3RzIGlzIGVuZGVkLCBhbmQgcmVsZXZhbnQgd2ViaG9va3MgYXJlIGZpcmVkLiAgYC9pdGVtL3Byb2R1Y3RzL3Rlcm1pbmF0ZWAgaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBvZmZib2FyZCB1c2VycyBvciBkaXNjb25uZWN0IGFjY291bnRzIGxpbmtlZCB2aWEgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRlcm1pbmF0ZSBwcm9kdWN0cyBmb3IgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3R9IGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtUHJvZHVjdHNUZXJtaW5hdGUoaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdDogSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUHJvZHVjdHNUZXJtaW5hdGUoaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBDYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIGEgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSB3aGVuIG9mZmJvYXJkaW5nIHVzZXJzIG9yIGlmIGEgdXNlciBjaG9vc2VzIHRvIGRpc2Nvbm5lY3QgYW4gYWNjb3VudCBsaW5rZWQgdmlhIFBsYWlkLiBGb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzLCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgTGlhYmlsaXRpZXMsIGFuZCBJbnZlc3RtZW50cywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyByZXF1aXJlZCB0byBlbmQgc3Vic2NyaXB0aW9uIGJpbGxpbmcgZm9yIHRoZSBJdGVtLCB1bmxlc3MgdGhlIGVuZCB1c2VyIHJldm9rZWQgcGVybWlzc2lvbiAoZS5nLiB2aWEgW2h0dHBzOi8vbXkucGxhaWQuY29tL10oaHR0cHM6Ly9teS5wbGFpZC5jb20vKSkuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU3Vic2NyaXB0aW9uIGZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3N1YnNjcmlwdGlvbi1mZWUpLiAgT24gYSBUcmlhbCBwbGFuLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGRvZXMgbm90IGltcGFjdCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBUcmlhbCBJdGVtcyAoYmFuayBjb25uZWN0aW9ucykgeW91IGhhdmUgYXZhaWxhYmxlLiAgUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIGFjY2VzcyB0byB0aGVtIHNwZWNpZmljYWxseSB1c2luZyB0aGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlhYmlsaXRpZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5R2V0UmVxdWVzdH0gbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtEZWxpdmVyeUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIGBwYXltZW50X2luaXRpYXRpb25gIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIGBsaW5rX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSUQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYC4gRm9yIG1vc3QgUGxhaWQgcHJvZHVjdHMsIHRoZSBgcHVibGljX3Rva2VuYCBpcyBzYXZlZCBhbmQgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBCeSBkZWZhdWx0LCB0aGlzIGVuZHBvaW50IHdpbGwgb25seSByZXR1cm4gY29tcGxldGUgZXZlbnQgZGF0YSBmb3IgSG9zdGVkIExpbmsgc2Vzc2lvbnMuIFRvIHVzZSBgL2xpbmsvdG9rZW4vZ2V0YCB0byByZXRyaWV2ZSBldmVudCBkYXRhIGZvciBub24tSG9zdGVkLUxpbmsgc2Vzc2lvbnMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCB0aGF0IHlvdXIgYWNjb3VudCBiZSBlbmFibGVkIGZvciBMaW5rIGV2ZW50cy4gSWYgeW91IGRvIG5vdCBoYXZlIGFuIGFjY291bnQgbWFuYWdlciwgeW91IGNhbiBzdWJtaXQgdGhpcyByZXF1ZXN0IHZpYSBhIHN1cHBvcnQgdGlja2V0LiBFbmFibGVtZW50IGZvciBMaW5rIGV2ZW50cyB3aWxsIGFsc28gY2F1c2UgeW91IHRvIHJlY2VpdmUgYWRkaXRpb25hbCB3ZWJob29rcyByZWxhdGVkIHRvIExpbmsgZXZlbnRzLCBzdWNoIGFzIHRoZSBgU0VTU0lPTl9GSU5JU0hFRGAgYW5kIGBFVkVOVFNgIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtUb2tlbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSB1c2VyIGlzIGVsaWdpYmxlIGZvciBhIHN0cmVhbWxpbmVkIGV4cGVyaWVuY2UsIHN1Y2ggYXMgTGF5ZXIuIFRvIGFjY2VzcyB0aGlzIGVuZHBvaW50LCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLm5ldHdvcmtTdGF0dXNHZXQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL29hdXRoL2ludHJvc3BlY3RgIHJldHVybnMgbWV0YWRhdGEgYWJvdXQgYW4gYWNjZXNzIHRva2VuIG9yIHJlZnJlc2ggdG9rZW4uICBOb3RlOiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IG1ldGFkYXRhIGFib3V0IGFuIE9BdXRoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7T0F1dGhJbnRyb3NwZWN0UmVxdWVzdH0gb0F1dGhJbnRyb3NwZWN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIG9hdXRoSW50cm9zcGVjdChvQXV0aEludHJvc3BlY3RSZXF1ZXN0OiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLm9hdXRoSW50cm9zcGVjdChvQXV0aEludHJvc3BlY3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9vYXV0aC9yZXZva2VgIHJldm9rZXMgYW4gYWNjZXNzIG9yIHJlZnJlc2ggdG9rZW4sIHByZXZlbnRpbmcgYW55IGZ1cnRoZXIgdXNlLiBJZiBhIHJlZnJlc2ggdG9rZW4gaXMgcmV2b2tlZCwgYWxsIGFjY2VzcyBhbmQgcmVmcmVzaCB0b2tlbnMgZGVyaXZlZCBmcm9tIGl0IGFyZSBhbHNvIHJldm9rZWQsIGluY2x1ZGluZyBleGNoYW5nZWQgdG9rZW5zLiAgTm90ZTogVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGFzIHdlbGwgYXMgSlNPTi4gVGhlIGZpZWxkcyBmb3IgdGhlIGZvcm0gYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZpZWxkcyBmb3IgSlNPTiBhbmQgY29uZm9ybSB0byB0aGUgT0F1dGggMi4wIHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBhbiBPQXV0aCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge09BdXRoUmV2b2tlUmVxdWVzdH0gb0F1dGhSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgb2F1dGhSZXZva2Uob0F1dGhSZXZva2VSZXF1ZXN0OiBPQXV0aFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8T0F1dGhSZXZva2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5vYXV0aFJldm9rZShvQXV0aFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL29hdXRoL3Rva2VuYCBpc3N1ZXMgYW4gYWNjZXNzIHRva2VuIGFuZCByZWZyZXNoIHRva2VuIGRlcGVuZGluZyBvbiB0aGUgYGdyYW50X3R5cGVgIHByb3ZpZGVkLiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlZnJlc2ggYW4gT0F1dGggYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7T0F1dGhUb2tlblJlcXVlc3R9IG9BdXRoVG9rZW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgb2F1dGhUb2tlbihvQXV0aFRva2VuUmVxdWVzdDogT0F1dGhUb2tlblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8T0F1dGhUb2tlblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLm9hdXRoVG9rZW4ob0F1dGhUb2tlblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy4gVG8gY3JlYXRlIGVuZCBjdXN0b21lcnMsIGl0IHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgb25seSwgZXZlbiB3aGVuIGNyZWF0aW5nIFNhbmRib3ggQVBJIGtleXMuIElmIGNhbGxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgaXQgd2lsbCByZXR1cm4gYSBzYW1wbGUgcmVzcG9uc2UsIGJ1dCBubyBjdXN0b21lciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBBUEkga2V5cyB3aWxsIG5vdCBiZSB2YWxpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgZnVsbCBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBmdWxsIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgY29uc3RyYWludHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQmFjcyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudFxcJ3MgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuICBQb2xsaW5nIGZvciBzdGF0dXMgdXBkYXRlcyBpbiBQcm9kdWN0aW9uIGlzIGhpZ2hseSBkaXNjb3VyYWdlZC4gUmVwZWF0ZWRseSBjYWxsaW5nIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCB0byBjaGVjayBhIHBheW1lbnRcXCdzIHN0YXR1cyBpcyB1bnJlbGlhYmxlIGFuZCBtYXkgdHJpZ2dlciBBUEkgcmF0ZSBsaW1pdHMuIE9ubHkgdGhlIGBwYXltZW50X3N0YXR1c191cGRhdGVgIHdlYmhvb2sgc2hvdWxkIGJlIHVzZWQgdG8gcmVjZWl2ZSByZWFsLXRpbWUgc3RhdHVzIHVwZGF0ZXMgaW4gUHJvZHVjdGlvbi4gIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnRzIEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9zdXBwb3J0LnBsYWlkLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yNzg5NTgyNjk0NzczNS1XaGF0LVBsYWlkLXByb2R1Y3RzLWFyZS1zdXBwb3J0ZWQtaW4tZWFjaC1jb3VudHJ5LWFuZC1yZWdpb24pIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl0XFwncyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZywgc2F2aW5ncywgb3IgY2FzaCBtYW5hZ2VtZW50IGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IGF1dGhvcml6ZWQgYnkgYSBwcm9jZXNzb3IgdG9rZW4sIGluY2x1ZGluZyBhY2NvdW50IG51bWJlcnMsIGFjY291bnQgb3duZXJzLCBob2xkaW5ncywgYW5kIGRhdGEgcHJvdmVuYW5jZSBpbmZvcm1hdGlvbi4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgQXV0aCB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCBhY2NvdW50IGF1dGhlbnRpY2F0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0KHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0KHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSW52ZXN0bWVudCBIb2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIGludmVzdG1lbnQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIHlvdSBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIFBsYWlkIHdpbGwgbm9ybWFsbHkgaW5mZXIgdGhlIG91dGNvbWUgZnJvbSB5b3VyIFNpZ25hbCBSdWxlcy4gSG93ZXZlciwgaWYgeW91IGFyZSBub3QgdXNpbmcgU2lnbmFsIFJ1bGVzLCBpZiB0aGUgU2lnbmFsIFJ1bGVzIG91dGNvbWUgd2FzIGBSRVZJRVdgLCBvciBpZiB5b3UgdGFrZSBhIGRpZmZlcmVudCBhY3Rpb24gdGhhbiB0aGUgb25lIGRldGVybWluZWQgYnkgdGhlIFNpZ25hbCBSdWxlcywgeW91IHdpbGwgbmVlZCB0byBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLiBUaGlzIGhlbHBzIGltcHJvdmUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGFjY3VyYWN5IGZvciB5b3VyIGFjY291bnQgYW5kIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoZSBydWxlIHBlcmZvcm1hbmNlIGFuZCBydWxlIHR1bmluZyBjYXBhYmlsaXRpZXMgaW4gdGhlIERhc2hib2FyZC4gSWYgeW91ciBlZmZlY3RpdmUgZGVjaXNpb24gY2hhbmdlcyBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIChmb3IgZXhhbXBsZSwgeW91IGluZGljYXRlZCB0aGF0IHlvdSBhY2NlcHRlZCBhIHRyYW5zYWN0aW9uLCBidXQgbGF0ZXIgb24sIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IgcmVqZWN0ZWQgaXQsIHNvIGl0IHdhcyBuZXZlciBpbml0aWF0ZWQpLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIGFnYWluIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gY29ycmVjdCBQbGFpZFxcJ3MgcmVjb3Jkcy4gIElmIHlvdSBhcmUgdXNpbmcgUGxhaWQgVHJhbnNmZXIgYXMgeW91ciBwYXltZW50IHByb2Nlc3NvciwgeW91IGFsc28gZG8gbm90IG5lZWQgdG8gY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCwgYXMgUGxhaWQgY2FuIGluZmVyIG91dGNvbWVzIGZyb20geW91ciBUcmFuc2ZlciBhY3Rpdml0eS4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdXNlcyBSdWxlc2V0cyB0aGF0IGFyZSBjb25maWd1cmVkIG9uIHRoZSBlbmQgY3VzdG9tZXJcXCdzIERhc2hib2FyZCBhbmQgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgcHJvZHVjdCBvciB0aGUgQmFsYW5jZSBwcm9kdWN0LiBXaGljaCBwcm9kdWN0IGlzIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBgcnVsZXNldF9rZXlgIHRoYXQgeW91IHByb3ZpZGUuIE5vdGUgdGhhdCBvbmx5IGN1c3RvbWVyLWNvbmZpZ3VyZWQgcnVsZXNldHMgd29yayB3aXRoIHRoaXMgZW5kcG9pbnQ7IGFzIGEgcHJvY2Vzc29yIHBhcnRuZXIsIHlvdSBjYW5ub3QgY3JlYXRlIG9yIGNvbmZpZ3VyZSB5b3VyIG93biBydWxlc2V0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtTaWduYWwgUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSBoYXZlIGhpZ2hlciBsYXRlbmN5IGlmIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbSBmb3IgdGhlIGZpcnN0IHRpbWUsIG9yIHdoZW4gdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldC4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmVxdWVzdCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIFRvIHJldm9rZSBhIGJhbmsgYWNjb3VudCB0b2tlbiwgdGhlIGVudGlyZSB1bmRlcmx5aW5nIGFjY2VzcyB0b2tlbiBtdXN0IGJlIHJldm9rZWQgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2FuIGJlIG1vZGlmaWVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YC4gVG8gcmV2b2tlIHRoZSBwcm9jZXNzb3JcXCdzIGFjY2VzcywgdGhlIGVudGlyZSBJdGVtIG11c3QgYmUgZGVsZXRlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlclxcJ3MgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcuIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0KHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbXB1dGUgYSBQcm90ZWN0IFRydXN0IEluZGV4IHNjb3JlIGZvciBhIHVzZXIuIFRoZSBtb2RlbCBzZWxlY3RlZCBkZXRlcm1pbmVzIHdoYXQgaXMgc2NvcmVkIGFuZCB3aGF0IGFkZGl0aW9uYWwgZmllbGRzIHRoZSByZXNwb25zZSBjb250YWlucy4gRm9yIGV4YW1wbGUsIGB0aS1saW5rLXNlc3Npb24tMi4wYCBzY29yZXMgYSBjb21wbGV0ZWQgTGluayBzZXNzaW9uIGZvciBmcmF1ZCByaXNrOyBgY2FzaC1hZHZhbmNlLW9uYm9hcmRpbmctMS4wYCBzY29yZXMgcmVwYXltZW50IHJpc2sgZm9yIGEgZmlyc3QtdGltZSBjYXNoIGFkdmFuY2UgYW5kIGFkZGl0aW9uYWxseSBwb3B1bGF0ZXMgcGVyLWFtb3VudC1idWNrZXQgc3Vic2NvcmVzLiBDYXNoLWFkdmFuY2UgbW9kZWxzIHJlcXVpcmUgdGhhdCB0aGUgdXNlciBoYXZlIGEgUGxhaWQgSXRlbSB3aXRoIFRyYW5zYWN0aW9ucyBlbmFibGVkLCBvciBhbiBBc3NldHMgUmVwb3J0LCBiZWZvcmUgc2NvcmluZy4gIFRoZSBlbmRwb2ludCByZXR1cm5zIEhUVFAgNDAwIHdpdGggYGVycm9yX3R5cGVgID0gYElOVkFMSURfUkVRVUVTVGAgYW5kIGBlcnJvcl9jb2RlYCA9IGBGQUlMRURfUFJFQ09ORElUSU9OYCB3aGVuIGEgcmVxdWlyZWQgcHJlY29uZGl0aW9uIGlzIG5vdCBtZXQ6IGZvciBsaW5rLXNlc3Npb24gbW9kZWxzLCB3aGVuIHRoZSBMaW5rIHNlc3Npb24gaGFzIG5vdCBjb21wbGV0ZWQ7IGZvciBjYXNoLWFkdmFuY2UgbW9kZWxzLCB3aGVuIHRoZSB1c2VyIGhhcyBub3Qgc3VjY2Vzc2Z1bGx5IGxpbmtlZCBhbnkgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29tcHV0ZSBQcm90ZWN0IFRydXN0IEluZGV4IHNjb3JlcyBhbmQgc3Vic2NvcmVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvdGVjdENvbXB1dGVSZXF1ZXN0fSBwcm90ZWN0Q29tcHV0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm90ZWN0Q29tcHV0ZShwcm90ZWN0Q29tcHV0ZVJlcXVlc3Q6IFByb3RlY3RDb21wdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb3RlY3RDb21wdXRlKHByb3RlY3RDb21wdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnQgaW5jbHVkaW5nIFRydXN0IEluZGV4IHNjb3JlIGFuZCBmcmF1ZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7UHJvdGVjdEV2ZW50R2V0UmVxdWVzdH0gcHJvdGVjdEV2ZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0OiBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb3RlY3RFdmVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIG5ldyBldmVudCB0byBlbnJpY2ggdXNlciBkYXRhIGFuZCBvcHRpb25hbGx5IGdldCBhIFRydXN0IEluZGV4IHNjb3JlIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RFdmVudFNlbmRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb3RlY3RFdmVudFNlbmQocHJvdGVjdEV2ZW50U2VuZFJlcXVlc3Q6IFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb3RlY3RFdmVudFNlbmRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm90ZWN0RXZlbnRTZW5kKHByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgUHJvdGVjdCByZXBvcnQgdG8gZG9jdW1lbnQgZnJhdWQgaW5jaWRlbnRzLCBpbnZlc3RpZ2F0aW9uIG91dGNvbWVzLCBvciBvdGhlciByaXNrIGV2ZW50cy4gVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlcG9ydCB2YXJpb3VzIHR5cGVzIG9mIGluY2lkZW50cyBpbmNsdWRpbmcgYWNjb3VudCB0YWtlb3ZlcnMsIGlkZW50aXR5IGZyYXVkLCB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zLCBhbmQgb3RoZXIgc2VjdXJpdHkgZXZlbnRzLiBUaGUgcmVwb3J0ZWQgZGF0YSBoZWxwcyBpbXByb3ZlIGZyYXVkIGRldGVjdGlvbiBtb2RlbHMgYW5kIHByb3ZpZGVzIHZhbHVhYmxlIGZlZWRiYWNrIHRvIGVuaGFuY2UgdGhlIG92ZXJhbGwgc2VjdXJpdHkgb2YgdGhlIFBsYWlkIG5ldHdvcmsuIFJlcG9ydHMgY2FuIGJlIGNyZWF0ZWQgZm9yIGNvbmZpcm1lZCBpbmNpZGVudHMgdGhhdCBoYXZlIGJlZW4gZnVsbHkgaW52ZXN0aWdhdGVkLCBvciBmb3Igc3VzcGVjdGVkIGluY2lkZW50cyB0aGF0IHJlcXVpcmUgZnVydGhlciByZXZpZXcuIFlvdSBjYW4gYXNzb2NpYXRlIHJlcG9ydHMgd2l0aCBzcGVjaWZpYyB1c2Vycywgc2Vzc2lvbnMsIG9yIHRyYW5zYWN0aW9ucyB0byBwcm92aWRlIGNvbXByZWhlbnNpdmUgY29udGV4dCBhYm91dCB0aGUgaW5jaWRlbnQuIEVhY2ggcmVwb3J0IG11c3QgaW5jbHVkZSBgdXNlcl9pZGAsIG9yIGFuIGBpbmNpZGVudF9ldmVudGAgd2l0aCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIGlkZW50aWZpZXI6IGBsaW5rX3Nlc3Npb25faWRgLCBgaWR2X3Nlc3Npb25faWRgLCBgcHJvdGVjdF9ldmVudF9pZGAsIGBzaWduYWxfY2xpZW50X3RyYW5zYWN0aW9uX2lkYCwgb3IgYGFjY2Vzc190b2tlbmAuIENvbnRleHQgZmllbGRzIHN1Y2ggYXMgYGludGVybmFsX3JlZmVyZW5jZWAsIGB0aW1lYCwgYGFtb3VudGAsIGFuZCBgYmFua19hY2NvdW50YCBkbyBub3Qgc2F0aXNmeSB0aGlzIGlkZW50aWZpZXIgcmVxdWlyZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIFByb3RlY3QgcmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7UHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3R9IHByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvdGVjdFJlcG9ydENyZWF0ZShwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdDogUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvdGVjdFJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb3RlY3RSZXBvcnRDcmVhdGUocHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBnZXQgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGFzIGl0IHJlbGF0ZXMgdG8gdGhlaXIgZnJhdWQgcHJvZmlsZSB3aXRoIFByb3RlY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBQcm90ZWN0IHVzZXIgaW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdH0gcHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm90ZWN0VXNlckluc2lnaHRzR2V0KHByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvdGVjdFVzZXJJbnNpZ2h0c0dldChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdDogU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL2FwcGxpY2F0aW9uL3NlZWRgIGNyZWF0ZXMgYSB0ZXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBvbiBhbiBleGlzdGluZyBQZXJtaXNzaW9ucyBNYW5hZ2VyIEl0ZW1cXCdzIGxvZ2luLiBUaGUgc2VlZGVkIGFwcGxpY2F0aW9uIHdpbGwgYXBwZWFyIGluIHN1YnNlcXVlbnQgY2FsbHMgdG8gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgLiAgVGhlIGBhY2Nlc3NfdG9rZW5gIG11c3QgYmVsb25nIHRvIGEgUGVybWlzc2lvbnMgTWFuYWdlciBJdGVtIGNyZWF0ZWQgdmlhIGAvaXRlbS9pbXBvcnRgIGluIFNhbmRib3guIFRoZSBgYXBwbGljYXRpb25faWRgIGlkZW50aWZpZXMgdGhlIGFwcGxpY2F0aW9uIHRvIHNlZWQgYXMgYSBjb25uZWN0ZWQgYXBwLiBUbyBkaXNjb25uZWN0IGEgc2VlZGVkIGFwcGxpY2F0aW9uLCB1c2UgYC9pdGVtL2FwcGxpY2F0aW9uL3VubGlua2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlZWQgYSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgUGVybWlzc2lvbnMgTWFuYWdlciBzYW5kYm94IGl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3R9IHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdDogU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWQoc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXQgSXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnNcXCcgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBQTkMgSXRlbXMsIGJ1dCBtYXkgYmUgc2VudCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgb3IgSXRlbS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIHlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPQXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9BdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zYWN0aW9ucy9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBuZXcgdHJhbnNhY3Rpb25zIGZvciBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCB1cCB0byAxMCB0cmFuc2FjdGlvbnMgdG8gYW55IEl0ZW0gYXQgYSB0aW1lLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggSXRlbXMgdGhhdCB3ZXJlIGNyZWF0ZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgdXNpbmcgdGhlIGB1c2VyX3RyYW5zYWN0aW9uc19keW5hbWljYCB0ZXN0IHVzZXIuIFlvdSBjYW4gdXNlIHRoaXMgdG8gYWRkIHRyYW5zYWN0aW9ucyB0byB0ZXN0IHRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludHMuICBDdXN0b20gdHJhbnNhY3Rpb25zIGFyZSBvbmx5IGFwcGxpZWQgdG8gdGhlIGRlcG9zaXRvcnkgYWNjb3VudC4gU3VwcG9ydCBmb3IgcGVyLWFjY291bnQgdGFyZ2V0aW5nIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgc2FuZGJveCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlKHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZShzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCB5b3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Nlc3Npb24vdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIExheWVyLiBUaGUgcmV0dXJuZWQgTGluayB0b2tlbiBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBMaW5rIFNESy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIExheWVyXG4gICAgICAgICAqIEBwYXJhbSB7U2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdH0gc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNlc3Npb25Ub2tlbkNyZWF0ZShzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0OiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNlc3Npb25Ub2tlbkNyZWF0ZShzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgeW91IGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLiBUaGlzIGhlbHBzIGltcHJvdmUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGFjY3VyYWN5IGZvciB5b3VyIGFjY291bnQgYW5kIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoZSBydWxlIHBlcmZvcm1hbmNlIGFuZCBydWxlIHR1bmluZyBjYXBhYmlsaXRpZXMgaW4gdGhlIERhc2hib2FyZC4gSWYgeW91ciBlZmZlY3RpdmUgZGVjaXNpb24gY2hhbmdlcyBhZnRlciBjYWxsaW5nIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCwgYXMgUGxhaWQgY2FuIGluZmVyIG91dGNvbWVzIGZyb20geW91ciBUcmFuc2ZlciBhY3Rpdml0eS4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgQmVmb3JlIHVzaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIHJ1bGVzZXRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pIGluIHRoZSBEYXNoYm9hcmQgdW5kZXIgWyoqU2lnbmFsLT5SdWxlcyoqXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc2lnbmFsL3Jpc2stcHJvZmlsZXMpLiAgYC9zaWduYWwvZXZhbHVhdGVgIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgb3IgdGhlIEJhbGFuY2UgcHJvZHVjdC4gV2hpY2ggcHJvZHVjdCBpcyB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgYHJ1bGVzZXRfa2V5YCB0aGF0IHlvdSBwcm92aWRlLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IGhhdmUgaGlnaGVyIGxhdGVuY3kgd2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXF1ZXN0IGRhdGEuIEJhbGFuY2Utb25seSBydWxlc2V0cyBtYXkgaGF2ZSBsYXRlbmN5IG9mIHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhbiBJdGVtIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzIHVzZWQgdG8gZGV2ZWxvcCBhIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gVGhpcyBzaG91bGQgYmUgZG9uZSBvbiBJdGVtcyB3aGVyZSBgc2lnbmFsYCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCB0aGUgaW5pdGlhbCBjYWxsIHRvIGAvc2lnbmFsL2V2YWx1YXRlYCBvbiB0aGF0IEl0ZW0gd2lsbCBiZSBsZXNzIGFjY3VyYXRlLCBiZWNhdXNlIFBsYWlkIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gbGVzcyBkYXRhIGZvciBjb21wdXRpbmcgdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHlvdXIgaW50ZWdyYXRpb24gaXMgcHVyZWx5IEJhbGFuY2Utb25seSwgdGhpcyBlbmRwb2ludCB3aWxsIGhhdmUgbm8gZWZmZWN0LCBhcyBCYWxhbmNlLW9ubHkgcnVsZXNldHMgZG8gbm90IGNhbGN1bGF0ZSBhIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXNcbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxQcmVwYXJlUmVxdWVzdH0gc2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0OiBTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxQcmVwYXJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kcyBpbnRvIHlvdXIgc2NvcmVzIGFuZCB0dW5lIHJ1bGUgbG9naWMuIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoYXMgQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvc2NoZWR1bGVgIHRvIHNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxTY2hlZHVsZVJlcXVlc3R9IHNpZ25hbFNjaGVkdWxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdDogU2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFNjaGVkdWxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFN0YXRlbWVudHNMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0aGUgSXRlbSB3YXMgbGFzdCB1cGRhdGVkLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlclxcJ3MgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhlIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIFRyYW5zYWN0aW9ucyBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYC4gIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gb3B0aW9uYWwgYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcuIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBBIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHVzZWQgdG8gY3JlYXRlIGEgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6ICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGdldCBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIG9mIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgaXMgcmV0cnlhYmxlIGFuZCBpZGVtcG90ZW50OyBpZiBhIHRyYW5zZmVyIHdpdGggdGhlIHByb3ZpZGVkIGB0cmFuc2Zlcl9pZGAgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBpdCB3aWxsIHJldHVybiB0aGUgdHJhbnNmZXIgZGV0YWlscyB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IHRyYW5zZmVyLiBBIHRyYW5zZmVyIG1heSBzdGlsbCBiZSBjcmVhdGVkIGlmIGEgNTAwIGVycm9yIGlzIHJldHVybmVkOyB0byBkZXRlY3QgdGhpcyBzY2VuYXJpbywgdXNlIFtUcmFuc2ZlciBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvcmVjb25jaWxpbmctdHJhbnNmZXJzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3VcXCdsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgYG11bHRpcGFydC9mb3JtLWRhdGFgLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDUwMCB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgLiBPbmUgb2YgYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAgbXVzdCBiZSBwb3B1bGF0ZWQgYnV0IG5vdCBib3RoLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgIGVuZHBvaW50IHRvIGRlcG9zaXQgZnVuZHMgaW50byBQbGFpZCBMZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlcG9zaXQgZnVuZHMgaW50byBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gbGVkZ2VycywgaWYgeW91IGhhdmUgbXVsdGlwbGUuIElmIHlvdVxcJ3JlIGEgcGxhdGZvcm0sIHlvdSBjYW4gbW92ZSBmdW5kcyBiZXR3ZWVuIG9uZSBvZiB5b3VyIGxlZGdlcnMgYW5kIG9uZSBvZiB5b3VyIGN1c3RvbWVyXFwncyBsZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIGxlZGdlciBldmVudHMgZm9yIGEgc3BlY2lmaWMgbGVkZ2VyIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgbGVkZ2VyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJFdmVudExpc3QodHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlckV2ZW50TGlzdCh0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy4gIEluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCB0aGlzIGVuZHBvaW50IHJldHVybnMgc3RhdGljIHBsYWNlaG9sZGVyIHZhbHVlcyByYXRoZXIgdGhhbiBtZXRyaWNzIGNvbXB1dGVkIGZyb20geW91ciBTYW5kYm94IHRyYW5zZmVyIGFjdGl2aXR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBwcmV2aW91c2x5LXZlcmlmaWVkIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBvciBbc3VwcG9ydF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQpLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBmdW5kaW5nIGFjY291bnQgZm9yIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgZnVuZGluZyBhY2NvdW50IGZvciBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBzdWJtaXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3IgeW91IGFyZSBvbmJvYXJkaW5nLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmF0b3JcXCdzIGFncmVlbWVudCB0byB0aGUgcmVxdWlyZWQgbGVnYWwgdGVybXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yIChlLmcuIGJlbmVmaWNpYWwgb3duZXIgb3IgY29udHJvbCBwZXJzb24pIGFuZCBvcHRpb25hbGx5IHN1Ym1pdCBwZXJzb25hbCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgYWRkaXRpb25hbCBvbmJvYXJkaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVlZGVkIGJ5IFBsYWlkIHRvIGFwcHJvdmUgb3IgZGVjbGluZSB0aGUgb3JpZ2luYXRvci4gU2VlIFtSZXF1aXJlbWVudCB0eXBlIHNjaGVtYSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFORVFrVEQwc1ZLNTBpQVFpNnhIaWdyZXhEVXhaNFF4WHFTRWZWX0ZGVGlVLykgZm9yIGEgbGlzdCBvZiByZXF1aXJlbWVudCB0eXBlcyBhbmQgcG9zc2libGUgdmFsdWVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgYWRkaXRpb25hbCBvbmJvYXJkaW5nIGluZm9ybWF0aW9uIG9uIGJlaGFsZiBvZiBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZFxcJ3MgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci4gIFNjaGVkdWxlZCB0cmFuc2ZlciB0aGF0IGhhc25cXCd0IGJlZW4gc3VibWl0dGVkIHRvIGJhbmsgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuICBBIHJlZnVuZCBjYW4gc3RpbGwgYmUgaXNzdWVkIGV2ZW4gaWYgdGhlIEl0ZW1cXCdzIGBhY2Nlc3NfdG9rZW5gIGlzIG5vIGxvbmdlciB2YWxpZCAoZS5nLiBpZiB0aGUgdXNlciByZXZva2VkIE9BdXRoIGNvbnNlbnQgb3IgdGhlIEl0ZW0gd2FzIGRlbGV0ZWQgdmlhIGAvaXRlbS9yZW1vdmVgKSwgYXMgbG9uZyBhcyB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgcGFpciB1c2VkIHRvIG1ha2UgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGlzIHN0aWxsIHZhbGlkLiBBIHJlZnVuZCBjYW5ub3QgYmUgaXNzdWVkIGlmIHRoZSBJdGVtIGhhcyBhbiBbaW52YWxpZGF0ZWQgVEFOXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLCB3aGljaCBjYW4gb2NjdXIgYXQgQ2hhc2Ugb3IgUE5DLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHNlbmRpbmcgY2xpZW50LXNwZWNpZmljIGV2ZW50cyByZWxhdGVkIHRvIExheWVyIHNlc3Npb25zIGZvciBhbmFseXRpY3MgYW5kIHRyYWNraW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZW5kIFVzZXIgQWNjb3VudCBTZXNzaW9uIEV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZCh1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZCh1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHVzZXIgcGVybWlzc2lvbmVkIGFjY291bnQgZGF0YSwgaW5jbHVkaW5nIGlkZW50aXR5IGFuZCBJdGVtIGFjY2VzcyB0b2tlbnMsIGZvciB1c2Ugd2l0aCBbUGxhaWQgTGF5ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGF5ZXIpLiBOb3RlIHRoYXQgZW5kIHVzZXJzIGFyZSBwZXJtaXR0ZWQgdG8gZWRpdCB0aGUgcHJlZmlsbGVkIGlkZW50aXR5IGRhdGEgaW4gdGhlIExpbmsgZmxvdyBiZWZvcmUgc2hhcmluZyBpdCB3aXRoIHlvdTsgeW91IHNob3VsZCB0cmVhdCBhbnkgaWRlbnRpdHkgZGF0YSByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFzIHVzZXItc3VibWl0dGVkLCB1bnZlcmlmaWVkIGRhdGEuIEZvciBhIHZlcmlmaWNhdGlvbiBsYXllciwgeW91IGNhbiBhZGQgW0lkZW50aXR5IFZlcmlmaWNhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vKSB0byB5b3VyIGZsb3csIG9yIGNoZWNrIHRoZSBzdWJtaXR0ZWQgaWRlbnRpdHkgZGF0YSBhZ2FpbnN0IGJhbmsgYWNjb3VudCBkYXRhIGZyb20gbGlua2VkIGFjY291bnRzIHVzaW5nIFtJZGVudGl0eSBNYXRjaF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS8jaWRlbnRpdHktbWF0Y2gpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb3IgUGxhaWQgcHJvZHVjdHMgYW5kIGZsb3dzIHRoYXQgdXNlIHRoZSB1c2VyIG9iamVjdCwgYC91c2VyL2NyZWF0ZWAgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBtdXN0IGNhbGwgdGhpcyBlbmRwb2ludCBiZWZvcmUgY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpZiB5b3UgYXJlIHVzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nOiBQbGFpZCBDaGVjaywgSW5jb21lIFZlcmlmaWNhdGlvbiwgTXVsdGktSXRlbSBMaW5rLCBvciBQbGFpZCBQcm90ZWN0IChJZGVudGl0eSkuIElmIHlvdSBhcmUgdXNpbmcgUGxhaWQgUHJvdGVjdCBMaW5rIHNlc3Npb24gc2NvcmluZywgeW91IGRvIG5vdCBuZWVkIHRvIGNhbGwgYC91c2VyL2NyZWF0ZWAgZmlyc3Q7IFBsYWlkIHdpbGwgcmVzb2x2ZSBvciBjcmVhdGUgdGhlIHVzZXIgd2hlbiBgdXNlci5jbGllbnRfdXNlcl9pZGAgaXMgcHJvdmlkZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIEZvciBjdXN0b21lcnMgd2hvIGJlZ2FuIHVzaW5nIHRoaXMgZW5kcG9pbnQgb24gb3IgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUsIHRoaXMgZW5kcG9pbnQgdGFrZXMgYSBgY2xpZW50X3VzZXJfaWRgIGFuZCBhbiBgaWRlbnRpdHlgIG9iamVjdCBhbmQgd2lsbCByZXR1cm4gYSBgdXNlcl9pZGAuIEZvciBjdXN0b21lcnMgd2hvIGJlZ2FuIHVzaW5nIGl0IGJlZm9yZSB0aGF0IGRhdGUsIHRoZSBlbmRwb2ludCB0YWtlcyBhIGBjbGllbnRfdXNlcl9pZGAgYW5kIGEgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgYW5kIHdpbGwgcmV0dXJuIGEgYHVzZXJfdG9rZW5gIGFuZCBgdXNlcl9pZGAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS4gSW4gb3JkZXIgdG8gY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGZvciBhIHVzZXIsIHRoZSBgaWRlbnRpdHlgIChuZXcpIG9yIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgKGxlZ2FjeSkgb2JqZWN0IG11c3QgYmUgcHJlc2VudC4gSWYgaXQgaXMgbm90IHByb3ZpZGVkIGR1cmluZyB0aGUgYC91c2VyL2NyZWF0ZWAgY2FsbCwgaXQgY2FuIGJlIGFkZGVkIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuICAgSW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIHRoZSBmb2xsb3dpbmcgYGlkZW50aXR5YCBmaWVsZHMsIGF0IG1pbmltdW0sIGFyZSByZXF1aXJlZCBhbmQgbXVzdCBiZSBub24tZW1wdHk6IGBuYW1lYCwgYGRhdGVfb2ZfYmlydGhgLCBgZW1haWxzYCwgYHBob25lX251bWJlcnNgLCBhbmQgYGFkZHJlc3Nlc2AsICh3aXRoIGF0IGxlYXN0IG9uZSBlbWFpbCwgcGhvbmUgbnVtYmVyLCBhbmQgYWRkcmVzcyBkZXNpZ25hdGVkIGFzIGBwcmltYXJ5YCkuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiBJZiBjcmVhdGluZyBhIHJlcG9ydCBmb3Igc2hhcmluZyB3aXRoIGEgR1NFIHN1Y2ggYXMgRmFubmllIG9yIEZyZWRkaWUsIHRoZSB1c2VyXFwncyBmdWxsIFNTTiBtdXN0IGJlIHByb3ZpZGVkIHZpYSB0aGUgYGlkX251bWJlcnNgIGZpZWxkLiBQcm92aWRpbmcgYXQgbGVhc3QgYSBwYXJ0aWFsIFNTTiBpcyBhbHNvIHN0cm9uZ2x5IHJlY29tbWVuZGVkIGZvciBhbGwgdXNlIGNhc2VzLCBzaW5jZSBpdCBpbXByb3ZlcyB0aGUgYWNjdXJhY3kgb2YgbWF0Y2hpbmcgdXNlciByZWNvcmRzIGR1cmluZyBjb21wbGlhbmNlIHByb2Nlc3NlcyBzdWNoIGFzIGZpbGUgZGlzY2xvc3VyZSwgZGlzcHV0ZSwgb3Igc2VjdXJpdHkgZnJlZXplIHJlcXVlc3RzLiAgIFdoZW4gdXNpbmcgUGxhaWQgUHJvdGVjdCwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHByb3ZpZGUgYW4gYGlkZW50aXR5YCBvYmplY3QgdG8gYmV0dGVyIGlkZW50aWZ5IGFuZCBibG9jayBmcmF1ZCBhY3Jvc3MgeW91ciBMaW5rIHNlc3Npb25zLiAgIFBsYWlkIHdpbGwgbm9ybWFsaXplIGlkZW50aXR5IGZpZWxkcyBiZWZvcmUgc3RvcmluZyB0aGVtIGFuZCB1dGlsaXplIHRoZSBzYW1lIGlkZW50aXR5IGFjcm9zcyBkaWZmZXJlbnQgdXNlci1iYXNlZCBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIEZpbmFuY2lhbCBJbnNpZ2h0cyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyB0aGUgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgYW5kIExpYWJpbGl0aWVzIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBUcmFuc2FjdGlvbnMgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdXNlciBpdGVtcyBmb3IgRmluYW5jaWFsLUluc2lnaHRzIGJ1bmRsZVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3R9IHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2godXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdDogVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyRmluYW5jaWFsRGF0YVJlZnJlc2godXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCB1c2VyIGRldGFpbHMgdXNpbmcgYSBgdXNlcl9pZGAuIFRoaXMgZW5kcG9pbnQgb25seSBzdXBwb3J0cyB1c2VycyB0aGF0IHdlcmUgY3JlYXRlZCBvbiB0aGUgbmV3IHVzZXIgQVBJIGZsb3csIHdpdGhvdXQgYSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdXNlciBpZGVudGl0eSBhbmQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyR2V0UmVxdWVzdH0gdXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckdldCh1c2VyR2V0UmVxdWVzdDogVXNlckdldFJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyR2V0KHVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgY3VzdG9tZXJzIHRvIGV4cGxpY2l0bHkgcHVyZ2UgaWRlbnRpdHkvUElJIGRhdGEgcHJvdmlkZWQgdG8gUGxhaWQgZm9yIGEgZ2l2ZW4gdXNlci4gVGhpcyBpcyBub3QgZXhwb3NlZCB0byBjdXN0b21lcnMgYnkgZGVmYXVsdCwgYXMgaXQgaXMgbWVhbnQgZm9yIHNwZWNpYWwgc2NlbmFyaW9zIG9yIHJlcXVlc3RzLCBidXQgUGxhaWQgaXMgb2JsaWdhdGVkIHRvIGVuYWJsZSBjdXN0b21lcnMgdG8gZGVsZXRlIFBJSSBwcm92aWRlZCB0byB1cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXIgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3R9IHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlcklkZW50aXR5UmVtb3ZlKHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3Q6IFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJJZGVudGl0eVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJJZGVudGl0eVJlbW92ZSh1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXNzb2NpYXRlcyBJdGVtcyB0byB0aGUgdGFyZ2V0IHVzZXIuIElmIGFuIEl0ZW0gaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGFub3RoZXIgdXNlciwgdGhlIEl0ZW0gd2lsbCBiZSBkaXNhc3NvY2lhdGVkIHdpdGggdGhlIGV4aXN0aW5nIHVzZXIgYW5kIGFzc29jaWF0ZWQgdG8gdGhlIHRhcmdldCB1c2VyLiBUaGlzIG9wZXJhdGlvbiBzdXBwb3J0cyBhIG1heCBvZiAxMDAgSXRlbXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFzc29jaWF0ZSBJdGVtcyB0byBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0fSB1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckl0ZW1zQXNzb2NpYXRlKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3Q6IFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckl0ZW1zQXNzb2NpYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckl0ZW1zQXNzb2NpYXRlKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIGB1c2VyX2lkYCwgYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHN0YXR1c2VzLiBQbGFpZCBhc3NvY2lhdGVzIGFuIEl0ZW0gd2l0aCBhIFVzZXIgd2hlbiBpdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHdpdGhpbiBhIExpbmsgc2Vzc2lvbiBpbml0aWFsaXplZCB3aXRoIHRoYXQgYHVzZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VySXRlbXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgc3BlY2lmaWMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci4gSXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIG9uIGVhY2ggSXRlbSBpbmRpdmlkdWFsbHksIGJ1dCBzdXBwb3J0cyB1c2UgY2FzZXMgKHN1Y2ggYXMgUGxhaWQgQ2hlY2spIHdoZXJlIGFjY2VzcyB0b2tlbnMgYXJlIG5vdCBhdmFpbGFibGUuIEFsbCBzcGVjaWZpZWQgSXRlbXMgbXVzdCBiZWxvbmcgdG8gdGhlIHVzZXIgb3IgdGhlIGVudGlyZSBvcGVyYXRpb24gZmFpbHMuIFNpbWlsYXIgdG8gYC9pdGVtL3JlbW92ZWAsIHRoaXMgZGVsZXRlcyBJdGVtIHByb2R1Y3QgZGF0YSBhbmQgdGVybWluYXRlcyBiaWxsaW5nIG9uIHRoZSBJdGVtXFwncyBwcm9kdWN0cy4gT25jZSByZW1vdmVkLCBJdGVtcyBjYW5ub3QgYmUgcmVjb25uZWN0ZWQgd2l0aG91dCBnb2luZyB0aHJvdWdoIExpbmsgYWdhaW4uIFRoaXMgZW5kcG9pbnQgaXMgbm90IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgZGF0YSBmb3IgYSB1c2VyLCBhcyBpdCB3aWxsIG9ubHkgcmVtb3ZlIEl0ZW1zIGFuZCBubyBvdGhlciBkYXRhIGZvciB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIGFueSB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gcHJvZHVjdHMgKEZpbmFuY2lhbCBNYW5hZ2VtZW50LCBQbGFpZCBQcm90ZWN0LCBvciBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFuZCBpcyBkZWxldGluZyB0aGVpciBhY2NvdW50IHdpdGggeW91ciBwcm9kdWN0LCBhbHNvIGNhbGwgYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWAgdG8gZW5kIHRob3NlIHN1YnNjcmlwdGlvbnM7IHBlci1JdGVtIGJpbGxpbmcgaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBhIHVzZXIgaW5pdGlhdGVkIGRhdGEgZGVsZXRpb24gcmVxdWVzdCwgc2VlIHRoZSBbQ29uc3VtZXIgU2VydmljZSBDZW50ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2NoZWNrL2NvbnN1bWVyLXNlcnZpY2UtY2VudGVyLykgdG8gcmV2b2tlIGFjY2VzcyB0byBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgSXRlbXMgZnJvbSBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNSZW1vdmVSZXF1ZXN0fSB1c2VySXRlbXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckl0ZW1zUmVtb3ZlKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3Q6IFVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckl0ZW1zUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckl0ZW1zUmVtb3ZlKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUZXJtaW5hdGVzIHVzZXItYmFzZWQgcmVjdXJyaW5nIHN1YnNjcmlwdGlvbiBidW5kbGVzIG9yIHByb2R1Y3RzIChGaW5hbmNpYWwgTWFuYWdlbWVudCwgUGxhaWQgUHJvdGVjdCwgYW5kIENSQSBDYXNoIEZsb3cgVXBkYXRlcykgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLiBBZnRlciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LCB0aGUgdXNlciB3aWxsIG5vIGxvbmdlciBiZSBiaWxsZWQgZm9yIHRoZXNlIHByb2R1Y3RzLiBGb3IgQ1JBIE1vbml0b3JpbmcsIHRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQgYnV0IGhpc3RvcmljYWwgZGF0YSByZW1haW5zIGF2YWlsYWJsZSBmb3IgZnV0dXJlIHJlcG9ydCByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVGVybWluYXRlIHVzZXItYmFzZWQgcHJvZHVjdHNcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0fSB1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclByb2R1Y3RzVGVybWluYXRlKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Q6IFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlclByb2R1Y3RzVGVybWluYXRlKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3VzZXIvcmVtb3ZlYCBkZWxldGVzIGEgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYCBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGFueSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBzaGFyZWQgd2l0aCBhbmQgdXNlZCBieSBhIHNwZWNpZmllZCB0aGlyZC1wYXJ0eSBjbGllbnQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRocm91Z2ggc3VwcG9ydGVkIGVuZHBvaW50cy4gIEVuc3VyZSB5b3Ugc3RvcmUgdGhlIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHRoZSBgdXNlcl90b2tlbmAgYW5kIGB0aGlyZF9wYXJ0eV9jbGllbnRfaWRgLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBVc2VyIHVzaW5nIHRoZSBUcmFuc2FjdGlvbnMgYnVuZGxlLiBUaGlzIGJ1bmRsZSByZWZyZXNoZXMgb25seSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBUcmFuc2FjdGlvbnMgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIHRvIHRhcmdldCBhbGwgSXRlbXMgZm9yIGEgdXNlciBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHVzZXIgaXRlbXMgZm9yIFRyYW5zYWN0aW9ucyBidW5kbGVcbiAgICAgICAgICogQHBhcmFtIHtVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoKHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlclRyYW5zYWN0aW9uc1JlZnJlc2godXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCB1cGRhdGVzIHVzZXIgaW5mb3JtYXRpb24gZm9yIGFuIGV4aXN0aW5nIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAuIElmIGFuIGV4aXN0aW5nIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAgaXMgbWlzc2luZyBmaWVsZHMgcmVxdWlyZWQgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgKGUuZy4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQpIHVzZSBgL3VzZXIvdXBkYXRlYCB0byBhZGQgdmFsdWVzIGZvciB0aG9zZSBmaWVsZHMuICBJZGVudGl0eSB1cGRhdGVzIHVzZSBtZXJnZSBzZW1hbnRpY3M6IHByb3ZpZGVkIGZpZWxkcyBvdmVyd3JpdGUgZXhpc3Rpbmcgb25lczsgb21pdHRlZCBmaWVsZHMgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZmFjdG9yeSBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRmFjdG9yeSA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbiwgYmFzZVBhdGg/OiBzdHJpbmcsIGF4aW9zPzogQXhpb3NJbnN0YW5jZSkge1xuICAgIGNvbnN0IGxvY2FsVmFyRnAgPSBQbGFpZEFwaUZwKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsICBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZFxcJ3Mgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3Q7IGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIE5vdGU6IElmIHlvdSBhcmUgZ2V0dGluZyByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzZXNzaW5nIHRoZSByZXR1cm4gcmlzayBvZiBhIHByb3Bvc2VkIEFDSCB0cmFuc2FjdGlvbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGAvc2lnbmFsL2V2YWx1YXRlYCBpbnN0ZWFkIG9mIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiBgL3NpZ25hbC9ldmFsdWF0ZWAgcmV0dXJucyB0aGUgc2FtZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiBhbmQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gU2lnbmFsIFJ1bGVzLCB3aGljaCBwcm92aWRlcyBuby1jb2RlIHRyYW5zYWN0aW9uIGJ1c2luZXNzIGxvZ2ljIGNvbmZpZ3VyYXRpb24sIGJhY2t0ZXN0aW5nIGFuZCByZWNvbW1lbmRhdGlvbnMgZm9yIHR1bmluZyB5b3VyIHRyYW5zYWN0aW9uIGFjY2VwdGFuY2UgbG9naWMsIGFuZCB0aGUgYWJpbGl0eSB0byBlYXNpbHkgc3dpdGNoIGJldHdlZW4gQmFsYW5jZSBhbmQgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBhcyBuZWVkZWQgZm9yIHVsdHJhLWxvdy1sYXRlbmN5LCBNTC1wb3dlcmVkIHJpc2sgYXNzZXNzbWVudHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0JhbGFuY2UgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9iYWxhbmNlLyNiYWxhbmNlLWludGVncmF0aW9uLW9wdGlvbnMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyAtLSB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50cyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXBwbGljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byB0aGUgR1NFcyBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0gb3IgdXRpbGl6ZSBGcmVkZGllIE1hY1xcJ3MgTG9hbiBQcm9kdWN0IEFkdmlzb3LCriAoTFBBwq4pIEFzc2V0IGFuZCBJbmNvbWUgTW9kZWxlciAoQUlNKS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5IGluIFBERiBmb3JtYXQuIFRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldChhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nLCBzYXZpbmdzLCBhbmQgY2FzaCBtYW5hZ2VtZW50IGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC92ZXJpZnlgIGVuZHBvaW50IHZlcmlmaWVzIGJhbmsgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIGFuZCAob3B0aW9uYWxseSkgYWNjb3VudCBvd25lciBuYW1lcyBhZ2FpbnN0IFBsYWlkXFwncyBkYXRhYmFzZSB2aWEgW0RhdGFiYXNlIEF1dGhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9kYXRhYmFzZS1hdXRoLykuIEl0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhY2NvdW50IG51bWJlcnMgdGhhdCB3ZXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoZSBQbGFpZCBMaW5rIGZsb3cuICBUaGlzIGVuZHBvaW50IGlzIGN1cnJlbnRseSBpbiBFYXJseSBBdmFpbGFiaWxpdHk7IGNvbnRhY3Qgc2FsZXMgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFZlcmlmeSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoVmVyaWZ5UmVxdWVzdH0gYXV0aFZlcmlmeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoVmVyaWZ5KGF1dGhWZXJpZnlSZXF1ZXN0OiBBdXRoVmVyaWZ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBdXRoVmVyaWZ5UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhWZXJpZnkoYXV0aFZlcmlmeVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgUGxhaWQtaW5pdGlhdGVkIEFDSCBvciBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgIHRvIGdldCByaXNrIGluc2lnaHRzIGZvciBhIGxpbmtlZCBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSByaXNrIG9mIGEgYmFuayBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3R9IGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdDogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgSUQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYWxsIEFjY291bnRzIGxpbmtlZCB0byB0aGlzIEJlYWNvbiBVc2VyLiBUaGUgaW5zaWdodHMgZm9yIGVhY2ggYWNjb3VudCBhcmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdH0gYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBCZWFjb24gVXNlciBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckhpc3RvcnlMaXN0KGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGByZWplY3RlZGAsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgY2xlYXJlZGAsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYGNsZWFyZWRgLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgcGVuZGluZ19yZXZpZXdgLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtIG9yIGFkZCBuZXcgYWNjb3VudHMgdG8gdGhlIEJlYWNvbiBVc2VyLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGFuIGlkZW50aXR5IGRhdGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9ld2FfcmVwb3J0L3YxL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYW4gRWFybmVkIFdhZ2UgQWNjZXNzIChFV0EpIHNjb3JlIHRoYXQgcXVhbnRpZmllcyB0aGUgZGVsaW5xdWVuY3kgcmlzayBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBpdGVtLiBUaGUgc2NvcmUgaXMgZGVyaXZlZCBmcm9tIGEgY29tYmluYXRpb24gb2YgY2FzaGZsb3cgcGF0dGVybnMgYW5kIG5ldHdvcmstYmFzZWQgYmVoYXZpb3JhbCBmZWF0dXJlcy4gIFRoZSByZXNwb25zZSByZXR1cm5zIGEgbGlzdCBvZiBFV0Egc2NvcmVzLCB3aGVyZSBlYWNoIHNjb3JlIGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsIGFkdmFuY2UgYW1vdW50IHJhbmdlLiBUaGVzZSBzY29yZXMgZXN0aW1hdGUgdGhlIGxpa2VsaWhvb2Qgb2YgcmVwYXltZW50IGZvciBhZHZhbmNlcyB3aXRoaW4gdGhhdCByYW5nZS4gIFNjb3JlIHJhbmdlOiAxLTk5ICBJbnRlcnByZXRhdGlvbjogSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBhIGdyZWF0ZXIgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQuICBUaGlzIGVuZHBvaW50IGVuYWJsZXMgY2xpZW50cyB0byBhc3Nlc3MgcmVwYXltZW50IHJpc2sgYW5kIG1ha2UgZGF0YS1kcml2ZW4gZGVjaXNpb25zIHdoZW4gZGV0ZXJtaW5pbmcgZWxpZ2liaWxpdHkgb3IgbGltaXRzIGZvciBlYXJuZWQgd2FnZSBhZHZhbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEVXQSBTY29yZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0fSBiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YUV3YVJlcG9ydFYxR2V0KGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3Q6IEJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmV0YUV3YVJlcG9ydFYxR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJldGFFd2FSZXBvcnRWMUdldChiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgcmVjb3JkLiBZb3UgY2FuIHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyB5b3UgaGF2ZSBhdmFpbGFibGUuIElmIGFueSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nIGZvciB0aGUgcHJvZHVjdHMgeW91IGludGVuZCB0byB1c2UsIGl0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBgcmVxdWlyZW1lbnRzX2R1ZWAgZmllbGQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgICAgICogQHBhcmFtIHtCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0fSBiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlKGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3Q6IEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgZGV0YWlscyBvZiBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldChiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0OiBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZXRhUGFydG5lckN1c3RvbWVyVjFHZXQoYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgZW5kIGN1c3RvbWVyIHJlY29yZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlcyBhbiBleGlzdGluZyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1c2luZXNzIHZlcmlmaWNhdGlvbiB0byBjaGVjayBhIGJ1c2luZXNzXFwncyBpZGVudGl0eSBhbmQgcmlzayBwcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlKGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlKGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgc3BlY2lmaWMgYnVzaW5lc3MgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0KGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0KGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYGNhc2hmbG93X3JlcG9ydGAsIG9yIGlmIGl0IHdhc25cXCd0LCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXRzIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9pbnNpZ2h0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyBpbnNpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBJbnNpZ2h0cyBhcmUgb25seSBjYWxjdWxhdGVkIG9uIGNyZWRpdCBhbmQgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyBpbnNpZ2h0cyBkYXRhIGluIENhc2hmbG93IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQoY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgIGlzIGFuIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtIChnaXZlbiBhbiBgaXRlbV9pZGApLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBDYXNoZmxvdyBSZXBvcnQgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAuICBBZnRlciBjYWxsaW5nIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIGBDQVNIRkxPV19SRVBPUlRfUkVBRFlgIGFsZXJ0aW5nIGNsaWVudHMgdGhhdCBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgY2FuIHRoZW4gYmUgaW5nZXN0ZWQgdmlhIGAvY2FzaGZsb3dfcmVwb3J0L2dldGAgb3IgdGhlIHdlYmhvb2sgd2lsbCBjb250YWluIGFuIGVycm9yIGNvZGUgaW5mb3JtaW5nIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZWZyZXNoaW5nIHRyYW5zYWN0aW9ucyBkYXRhLiAgTm90ZSB0aGF0IHRoZSBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpLiBJZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCBmb3IgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YSBpbiBgY2FzaGZsb3dfcmVwb3J0YFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXNoZmxvd1JlcG9ydFJlZnJlc2goY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY2FzaGZsb3dSZXBvcnRSZWZyZXNoKGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUcmFuc2FjdGlvbnMgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGBoYXNfbW9yZWAgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gTm90ZSB0aGF0IGRhdGEgaXNuXFwndCBsaWtlbHkgdG8gYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYGNhc2hmbG93X3JlcG9ydGAsIG9yIGlmIGl0IHdhc25cXCd0LCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXRzIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0KGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0KGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gbGVnYWN5IGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIFt1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pIGluc3RlYWQgb2YgdGhlIGxlZ2FjeSBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGxlZ2FjeSBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgSXRlbSBjb25zZW50IGV2ZW50cy4gQ29uc2VudCBsb2dzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgZXZlbnRzIG9jY3VycmluZyBvbiBvciBhZnRlciBOb3ZlbWJlciA3LCAyMDI0LiBFeHRyZW1lbHkgcmVjZW50IGV2ZW50cyAob2NjdXJyaW5nIHdpdGhpbiB0aGUgcGFzdCAxMiBob3VycykgbWF5IG5vdCBiZSBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnQuIFVwIHRvIHRocmVlIHllYXJzIG9mIGNvbnNlbnQgbG9ncyB3aWxsIGJlIGF2YWlsYWJsZSB2aWEgdGhlIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0fSBjb25zZW50RXZlbnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3Q6IENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENvbnNlbnRFdmVudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyBhbGwgZXhpc3RpbmcgQ1JCIEJhbmsgSW5jb21lIGFuZCBCYXNlIHJlcG9ydHMgZm9yIHRoZSBjb25zdW1lciBpbiBQREYgZm9ybWF0LiAgUmVzcG9uc2UgaXMgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQREYgUmVwb3J0c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdH0gY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0OiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEJhc2UgUmVwb3J0IGZvciB5b3VyIHVzZXIsIGFsbG93aW5nIHlvdSB0byByZWNlaXZlIGNvbXByZWhlbnNpdmUgYmFuayBhY2NvdW50IGFuZCBjYXNoIGZsb3cgZGF0YS4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzLCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX2Nhc2hmbG93X2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCB0byByZWZyZXNoIGRhdGEgaW4gYW4gZXhpc3RpbmcgcmVwb3J0LiBBIENvbnN1bWVyIFJlcG9ydCB3aWxsIGxhc3QgZm9yIDI0IGhvdXJzIGJlZm9yZSBleHBpcmluZzsgeW91IHNob3VsZCBjYWxsIGFueSBgL2dldGAgZW5kcG9pbnRzIG9uIHRoZSByZXBvcnQgYmVmb3JlIGl0IGV4cGlyZXMuIElmIGEgcmVwb3J0IGV4cGlyZXMsIHlvdSBjYW4gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBhZ2FpbiB0byByZS1nZW5lcmF0ZSBpdCBhbmQgcmVmcmVzaCB0aGUgZGF0YSBpbiB0aGUgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIG9yIGNyZWF0ZSBhIENvbnN1bWVyIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRDcmVhdGUoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRDcmVhdGUoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIE5PVEU6IFRoZSBmb2xsb3dpbmcgc2NoZW1hIHdhcyB1cGRhdGVkIGluIEFwcmlsIDIwMjYgdG8gcmVmbGVjdCB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgcHJvdmlkZWQgdmVyc2lvbiBpcyBcXFwiSUkyXFxcIi4gUGxlYXNlIHNlZSBbdGhpcyBkb2N1bWVudF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjAjaGVhZGluZz1oLnJ1ZGFtemludXMyaSkgZm9yIGd1aWRhbmNlIG9uIG1pZ3JhdGluZyB0byBJSTIgaWYgeW91IGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIElJMSB2ZXJzaW9uLCBhbmQgW3RoaXMgc2VjdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjAjYm9va21hcms9aWQudGRjYzJ3cGswaDYwKSBmb3IgYW4gZXhhbXBsZSBJSTEgcmVzcG9uc2UgYWxvbmcgd2l0aCBpdHMgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWtRa1E3Rk9nRmFDNG4tc1VHVWs3NGhvWFpOWV9MX25KZUN1TWU3S2VpcDQvZWRpdD90YWI9dC4zNmM4NW4yaXJjcWsjaGVhZGluZz1oLjc5ZHdyNWMxaXN6bCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIExlbmRTY29yZSByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgaW5zaWdodHMsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbGVuZF9zY29yZWAgcHJvZHVjdCBvciBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIHdpdGggdGhlIGBjcmFfbGVuZF9zY29yZWAgcHJvZHVjdCwgUGxhaWQgd2lsbCBnZW5lcmF0ZSB0aGUgaW5zaWdodHMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgb3B0aW9uYWxseSBwcm92aWRlIHBhcmFtZXRlcnMgdW5kZXIgYG9wdGlvbnNgIHRvIGNvbmZpZ3VyZSB3aGljaCBpbnNpZ2h0cyB5b3Ugd2FudCB0byByZWNlaXZlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgTGVuZFNjb3JlIGZyb20geW91ciB1c2VyXFwncyBiYW5raW5nIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0KGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0KGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBwcm9kdWN0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9uZXR3b3JrX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCBQbGFpZCB3aWxsIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGVzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbmV0d29yayBhdHRyaWJ1dGVzIGZvciB0aGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQnkgZGVmYXVsdCwgdGhlIG1vc3QgcmVjZW50IEJhc2UgUmVwb3J0IChpZiBpdCBleGlzdHMpIGZvciB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkLiBUbyByZXF1ZXN0IHRoYXQgdGhlIG1vc3QgcmVjZW50IFBhcnRuZXIgSW5zaWdodHMgb3IgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFBERlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgaG9tZSBsZW5kaW5nIHJlcG9ydHMgZm9yIGEgdXNlci4gVG8gb2J0YWluIGEgVm9BIG9yIEVtcGxveW1lbnQgUmVmcmVzaCByZXBvcnQsIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGBjcmFfYmFzZV9yZXBvcnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdmFyaW91cyBob21lIGxlbmRpbmcgcmVwb3J0cyBmb3IgYSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LCBzcGVjaWZpY2FsbHkgZm9ybWF0dGVkIGZvciBIb21lIExlbmRpbmcgdmVyaWZpY2F0aW9uIHVzZSBjYXNlcy4gQmVmb3JlIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgZW5zdXJlIHRoYXQgeW91XFwndmUgY3JlYXRlZCBhIFZPQSByZXBvcnQgdGhyb3VnaCBMaW5rIG9yIHRoZSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCwgYW5kIGhhdmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vay4gIFRoZSByZXNwb25zZSB0byBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFZlcmlmaWNhdGlvbiBQREZcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0KGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY3JlZGl0X3Byb2ZpbGUvcmVwb3J0L2dldGAgcmV0cmlldmVzIGEgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IGZvciBhIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBjcmVkaXQgcHJvZmlsZSByZXBvcnQgZm9yIGEgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0fSBjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXQoY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldChjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0OiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXIoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0fSBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VucmVnaXN0ZXJgIGluZGljYXRlcyB0aGUgbG9hbnMgaGF2ZSByZWFjaGVkIGEgZmluYWwgc3RhdHVzIGFuZCBubyBmdXJ0aGVyIHVwZGF0ZXMgYXJlIGV4cGVjdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVyIGEgbGlzdCBvZiBsb2Fuc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgbG9hbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVcGRhdGVSZXF1ZXN0fSBjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3Q6IENyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgYSBDYXNoIEZsb3cgVXBkYXRlcyByZXBvcnQgYnkgcGFzc2luZyBpbiB0aGUgYHVzZXJfaWRgIHJlZmVycmVkIHRvIGluIHRoZSB3ZWJob29rIHlvdSByZWNlaXZlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIHRvIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIGxpbmtlZCBDUkEgSXRlbSwgd2hpY2ggYXJlIHVwZGF0ZWQgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSAoYmVzdC1lZmZvcnQpLiBJbiB0aGUgY3VycmVudCBDYXNoIEZsb3cgVXBkYXRlcyBiZXRhIGV4cGVyaWVuY2UsIG9ubHkgb25lIEl0ZW0gcGVyIHVzZXIgbWF5IGJlIHN1YnNjcmliZWQgZm9yIG1vbml0b3JpbmcgdXBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVuc3Vic2NyaWJlIGZyb20gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggYSBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQtU3BvbnNvcmVkIEVudGVycHJpc2UgKEdTRSkgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgKS4gIFVzZSB0aGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSBHU0Ugd2hvIG5lZWRzIGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIEF1ZGl0IENvcHkgVG9rZW4gYnkgYWRkaW5nIHRoZSByZXBvcnQgdG9rZW5zIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQgdG8gdGhlIGBhdWRpdF9jb3B5X3Rva2VuYC4gSWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gYWxyZWFkeSBjb250YWlucyBhIHJlcG9ydCBvZiBhIGNlcnRhaW4gdHlwZSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b2tlbiBwcm92aWRlZCBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIHRoZSBlbXBsb3ltZW50IHJlcG9ydChzKSBkZXJpdmVkIGZyb20gYmFuayB0cmFuc2FjdGlvbiBkYXRhIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCBpcyBkZXByZWNhdGVkLiBUaGUgYmFja2VuZCBpbXBsZW1lbnRhdGlvbiB3YXMgcmVtb3ZlZCAocmV0dXJucyBhbiBgVW5pbXBsZW1lbnRlZGAgZXJyb3IgYXQgcnVudGltZSksIGFuZCB0aGUgZW5kcG9pbnQgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGRvY3VtZW50ZWQgQVBJIHN1cmZhY2UuIFRvIHJlZnJlc2ggQmFuayBJbmNvbWUgZGF0YSBmb3IgYW4gZXhpc3RpbmcgdXNlciwgc2VuZCB0aGUgdXNlciB0aHJvdWdoIExpbmtcXCdzIHVwZGF0ZSBtb2RlIHNvIHRoZXkgY2FuIGNvbmZpcm0gdGhlaXIgaW5jb21lIHNvdXJjZXMuIEZvciBhIGZ1bGx5IGJhY2tlbmQgcmVmcmVzaCwgbWlncmF0ZSB0byBDUkEgSW5jb21lIEluc2lnaHRzIGFuZCBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGAgcmV0dXJucyBwYXJzZWQgZGF0YSBmcm9tIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB1c2VycyBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gSWYgeW91ciBhY2NvdW50IGlzIG5vdCBlbmFibGVkIGZvciBEb2N1bWVudCBQYXJzaW5nLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0fSBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRva2VuLCBhbmQgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgYGVtcGxveWVyYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgV2hlbiB0ZXN0aW5nIGluIFNhbmRib3gsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVzdWx0cyBieSBwcm92aWRpbmcgc3BlY2lhbCB0ZXN0IHZhbHVlcyBpbiB0aGUgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGZpZWxkcy4gYGVtcGxveWVyX2dvb2RgIGFuZCBgZW1wbG95ZXJfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIGBlbXBsb3llcl9tdWx0aWAgd2lsbCByZXN1bHQgaW4gYSBgSElHSGAgY29uZmlkZW5jZSB3aXRoIG11bHRpcGxlIHBheXJvbGwgb3B0aW9ucy4gTGlrZXdpc2UsIGBhY2Nlc3NfZ29vZGAgYW5kIGBhY2Nlc3NfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIEFueSBvdGhlciB2YWx1ZSBmb3IgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGluIFNhbmRib3ggd2lsbCByZXN1bHQgaW4gYFVOS05PV05gIGNvbmZpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGByaXNrX3NpZ25hbHNgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFib3V0IGEgc3BlY2lmaWMgRGFzaGJvYXJkIHVzZXIgYmFzZWQgb24gdGhlIGBkYXNoYm9hcmRfdXNlcl9pZGAgZmllbGQsIHdoaWNoIGlzIHJldHVybmVkIGluIHRoZSBgYXVkaXRfdHJhaWxgIG9iamVjdCBvZiBjZXJ0YWluIE1vbml0b3IgYW5kIEJlYWNvbiBlbmRwb2ludHMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHNwZWNpZmljIHJldmlld2VyIHdobyBwZXJmb3JtZWQgYSBEYXNoYm9hcmQgYWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIERhc2hib2FyZCB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvZGFzaGJvYXJkX3VzZXIvbGlzdGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhYm91dCBhbGwgRGFzaGJvYXJkIHVzZXJzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgRGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlkXFwncyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBjb25zZW50IGdyYW50IGJ5IGl0cyBpZGVudGlmaWVyXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBGRFggQ29uc2VudCBHcmFudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Q29uc2VudHNHZXQoY29uc2VudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RkRYQ29uc2VudEdyYW50PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZHhDb25zZW50c0dldChjb25zZW50SWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXZvY2F0aW9uIGhpc3Rvcnkgb2YgYSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEZEWCBDb25zZW50IEdyYW50IHJldm9jYXRpb24gcmVjb3Jkc1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Q29uc2VudHNSZXZvY2F0aW9uR2V0KGNvbnNlbnRJZDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEZEWENvbnNlbnRSZXZvY2F0aW9ucz4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZmR4Q29uc2VudHNSZXZvY2F0aW9uR2V0KGNvbnNlbnRJZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGVuZHMgYSBSRVZPS0VEIHN0YXR1cyByZWNvcmQgdG8gdGhlIG5hbWVkIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIEZEWCBDb25zZW50IEdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Q29uc2VudHNSZXZva2UoY29uc2VudElkOiBzdHJpbmcsIHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZHhDb25zZW50c1Jldm9rZShjb25zZW50SWQsIHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGEgc3BlY2lmaWMgcmVjaXBpZW50XG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudElkIFJlY2lwaWVudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvQVVUSFNUQVRFSURdIFRoZSB2YWx1ZSB0aGF0IGlzIHBhc3NlZCBpbnRvIHRoZSBPQXV0aCBVUkkgXFwmIzM5O3N0YXRlXFwmIzM5OyBxdWVyeSBwYXJhbWV0ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBnZXRSZWNpcGllbnQocmVjaXBpZW50SWQ6IHN0cmluZywgb0FVVEhTVEFURUlEPzogc3RyaW5nLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEdldFJlY2lwaWVudFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5nZXRSZWNpcGllbnQocmVjaXBpZW50SWQsIG9BVVRIU1RBVEVJRCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIFJlY2lwaWVudHNcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldFJlY2lwaWVudHMob3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxHZXRSZWNpcGllbnRzUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmdldFJlY2lwaWVudHMob3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgdG8gcmV0cmlldmUgaWRlbnRpdHkgZGV0YWlscyB3aGVuIHVzaW5nIFtJZGVudGl0eSBEb2N1bWVudCBVcGxvYWRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvaWRlbnRpdHktZG9jdW1lbnQtdXBsb2FkLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdXBsb2FkZWQgZG9jdW1lbnQgaWRlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIG9yIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlNYXRjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGZvciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgIGZpZWxkLiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgdHdvIGZpZWxkcyBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiBgdXNlcl9pZGAgaXMgcHJvdmlkZWQsIHRoZXJlIG11c3QgYmUgYW4gYXNzb2NpYXRlZCB1c2VyIG90aGVyd2lzZSBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgLCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICAgSWYgYHVzZXJfaWRgIGlzIG5vdCBwcm92aWRlZCwgeW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIElmIGB1c2VyX2lkYCBpcyBwcm92aWRlZCwgdXNlciBpbmZvcm1hdGlvbiBjYW4gbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuIFBsZWFzZSB1c2UgdGhlIGAvdXNlci91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB1c2VyIGRhdGEgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvblxcJ3MgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnRcXCdzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBwYXJhbWV0ZXJzIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBoYXMgc2luY2UgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXNzdWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1NlYXJjaChpc3N1ZXNTZWFyY2hSZXF1ZXN0OiBJc3N1ZXNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElzc3Vlc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBhIHVzZXIgdG8gc3Vic2NyaWJlIHRvIHVwZGF0ZXMgb24gYSBzcGVjaWZpYyBgSXNzdWVgIHVzaW5nIGEgUE9TVCBtZXRob2QuIFN1YnNjcmliZXJzIHdpbGwgcmVjZWl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgaXNzdWUgc3RhdHVzIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB3aGVuIHJlc29sdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXNzdWVzU3Vic2NyaWJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlzc3Vlc1N1YnNjcmliZShpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb25cXCdzIGFjY2VzcyB0byB0aGUgVXNlclxcJ3MgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUltcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9wcm9kdWN0cy90ZXJtaW5hdGVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdGVybWluYXRlIGFuIEl0ZW0uIE9uY2UgdGVybWluYXRlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpcyBubyBsb25nZXIgdmFsaWQsIGJpbGxpbmcgZm9yIHRoZSBJdGVtXFwncyBwcm9kdWN0cyBpcyBlbmRlZCwgYW5kIHJlbGV2YW50IHdlYmhvb2tzIGFyZSBmaXJlZC4gIGAvaXRlbS9wcm9kdWN0cy90ZXJtaW5hdGVgIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gb2ZmYm9hcmQgdXNlcnMgb3IgZGlzY29ubmVjdCBhY2NvdW50cyBsaW5rZWQgdmlhIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUZXJtaW5hdGUgcHJvZHVjdHMgZm9yIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0fSBpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVByb2R1Y3RzVGVybWluYXRlKGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Q6IEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZShpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBDYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIGEgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSB3aGVuIG9mZmJvYXJkaW5nIHVzZXJzIG9yIGlmIGEgdXNlciBjaG9vc2VzIHRvIGRpc2Nvbm5lY3QgYW4gYWNjb3VudCBsaW5rZWQgdmlhIFBsYWlkLiBGb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzLCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgTGlhYmlsaXRpZXMsIGFuZCBJbnZlc3RtZW50cywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyByZXF1aXJlZCB0byBlbmQgc3Vic2NyaXB0aW9uIGJpbGxpbmcgZm9yIHRoZSBJdGVtLCB1bmxlc3MgdGhlIGVuZCB1c2VyIHJldm9rZWQgcGVybWlzc2lvbiAoZS5nLiB2aWEgW2h0dHBzOi8vbXkucGxhaWQuY29tL10oaHR0cHM6Ly9teS5wbGFpZC5jb20vKSkuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU3Vic2NyaXB0aW9uIGZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3N1YnNjcmlwdGlvbi1mZWUpLiAgT24gYSBUcmlhbCBwbGFuLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGRvZXMgbm90IGltcGFjdCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBUcmlhbCBJdGVtcyAoYmFuayBjb25uZWN0aW9ucykgeW91IGhhdmUgYXZhaWxhYmxlLiAgUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIGFjY2VzcyB0byB0aGVtIHNwZWNpZmljYWxseSB1c2luZyB0aGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyN3ZWJob29rX3VwZGF0ZV9hY2tub3dsZWRnZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgYHBheW1lbnRfaW5pdGlhdGlvbmAgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgYGxpbmtfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJRCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYC4gRm9yIG1vc3QgUGxhaWQgcHJvZHVjdHMsIHRoZSBgcHVibGljX3Rva2VuYCBpcyBzYXZlZCBhbmQgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAgQnkgZGVmYXVsdCwgdGhpcyBlbmRwb2ludCB3aWxsIG9ubHkgcmV0dXJuIGNvbXBsZXRlIGV2ZW50IGRhdGEgZm9yIEhvc3RlZCBMaW5rIHNlc3Npb25zLiBUbyB1c2UgYC9saW5rL3Rva2VuL2dldGAgdG8gcmV0cmlldmUgZXZlbnQgZGF0YSBmb3Igbm9uLUhvc3RlZC1MaW5rIHNlc3Npb25zLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgdGhhdCB5b3VyIGFjY291bnQgYmUgZW5hYmxlZCBmb3IgTGluayBldmVudHMuIElmIHlvdSBkbyBub3QgaGF2ZSBhbiBhY2NvdW50IG1hbmFnZXIsIHlvdSBjYW4gc3VibWl0IHRoaXMgcmVxdWVzdCB2aWEgYSBzdXBwb3J0IHRpY2tldC4gRW5hYmxlbWVudCBmb3IgTGluayBldmVudHMgd2lsbCBhbHNvIGNhdXNlIHlvdSB0byByZWNlaXZlIGFkZGl0aW9uYWwgd2ViaG9va3MgcmVsYXRlZCB0byBMaW5rIGV2ZW50cywgc3VjaCBhcyB0aGUgYFNFU1NJT05fRklOSVNIRURgIGFuZCBgRVZFTlRTYCB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9uZXR3b3JrL3N0YXR1cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgUGxhaWQgaGFzIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgc3RyZWFtbGluZWQgZXhwZXJpZW5jZSwgc3VjaCBhcyBMYXllci4gVG8gYWNjZXNzIHRoaXMgZW5kcG9pbnQsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBOb3RlOiBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBjaGVjayBmb3IgTGF5ZXIgZWxpZ2liaWxpdHkgaW4gdGhlIGZyb250ZW5kLiBgL25ldHdvcmsvc3RhdHVzL2dldGAgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY2hlY2tpbmcgTGF5ZXIgZWxpZ2liaWxpdHkgaWYgYSBmcm9udGVuZCBjaGVjayBpcyBub3QgcG9zc2libGUgZm9yIHlvdXIgdXNlIGNhc2UuIEZvciBpbnN0cnVjdGlvbnMgb24gcGVyZm9ybWluZyBhIGZyb250ZW5kIGVsaWdpYmlsaXR5IGNoZWNrLCBzZWUgdGhlIFtMYXllciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGEgdXNlclxcJ3MgUGxhaWQgTmV0d29yayBzdGF0dXNcbiAgICAgICAgICogQHBhcmFtIHtOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gbmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBuZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLm5ldHdvcmtTdGF0dXNHZXQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL29hdXRoL2ludHJvc3BlY3RgIHJldHVybnMgbWV0YWRhdGEgYWJvdXQgYW4gYWNjZXNzIHRva2VuIG9yIHJlZnJlc2ggdG9rZW4uICBOb3RlOiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IG1ldGFkYXRhIGFib3V0IGFuIE9BdXRoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7T0F1dGhJbnRyb3NwZWN0UmVxdWVzdH0gb0F1dGhJbnRyb3NwZWN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG9hdXRoSW50cm9zcGVjdChvQXV0aEludHJvc3BlY3RSZXF1ZXN0OiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5vYXV0aEludHJvc3BlY3Qob0F1dGhJbnRyb3NwZWN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvb2F1dGgvcmV2b2tlYCByZXZva2VzIGFuIGFjY2VzcyBvciByZWZyZXNoIHRva2VuLCBwcmV2ZW50aW5nIGFueSBmdXJ0aGVyIHVzZS4gSWYgYSByZWZyZXNoIHRva2VuIGlzIHJldm9rZWQsIGFsbCBhY2Nlc3MgYW5kIHJlZnJlc2ggdG9rZW5zIGRlcml2ZWQgZnJvbSBpdCBhcmUgYWxzbyByZXZva2VkLCBpbmNsdWRpbmcgZXhjaGFuZ2VkIHRva2Vucy4gIE5vdGU6IFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgYW4gT0F1dGggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtPQXV0aFJldm9rZVJlcXVlc3R9IG9BdXRoUmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG9hdXRoUmV2b2tlKG9BdXRoUmV2b2tlUmVxdWVzdDogT0F1dGhSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPE9BdXRoUmV2b2tlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLm9hdXRoUmV2b2tlKG9BdXRoUmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvb2F1dGgvdG9rZW5gIGlzc3VlcyBhbiBhY2Nlc3MgdG9rZW4gYW5kIHJlZnJlc2ggdG9rZW4gZGVwZW5kaW5nIG9uIHRoZSBgZ3JhbnRfdHlwZWAgcHJvdmlkZWQuIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgb3IgcmVmcmVzaCBhbiBPQXV0aCBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtPQXV0aFRva2VuUmVxdWVzdH0gb0F1dGhUb2tlblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBvYXV0aFRva2VuKG9BdXRoVG9rZW5SZXF1ZXN0OiBPQXV0aFRva2VuUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxPQXV0aFRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLm9hdXRoVG9rZW4ob0F1dGhUb2tlblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy4gVG8gY3JlYXRlIGVuZCBjdXN0b21lcnMsIGl0IHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgb25seSwgZXZlbiB3aGVuIGNyZWF0aW5nIFNhbmRib3ggQVBJIGtleXMuIElmIGNhbGxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgaXQgd2lsbCByZXR1cm4gYSBzYW1wbGUgcmVzcG9uc2UsIGJ1dCBubyBjdXN0b21lciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBBUEkga2V5cyB3aWxsIG5vdCBiZSB2YWxpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIGZ1bGwgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIGRhdGEgYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgY29uc3RyYWludHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQmFjcyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudFxcJ3MgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLiAgUG9sbGluZyBmb3Igc3RhdHVzIHVwZGF0ZXMgaW4gUHJvZHVjdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQuIFJlcGVhdGVkbHkgY2FsbGluZyBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgdG8gY2hlY2sgYSBwYXltZW50XFwncyBzdGF0dXMgaXMgdW5yZWxpYWJsZSBhbmQgbWF5IHRyaWdnZXIgQVBJIHJhdGUgbGltaXRzLiBPbmx5IHRoZSBgcGF5bWVudF9zdGF0dXNfdXBkYXRlYCB3ZWJob29rIHNob3VsZCBiZSB1c2VkIHRvIHJlY2VpdmUgcmVhbC10aW1lIHN0YXR1cyB1cGRhdGVzIGluIFByb2R1Y3Rpb24uICBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50cyBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vc3VwcG9ydC5wbGFpZC5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjc4OTU4MjY5NDc3MzUtV2hhdC1QbGFpZC1wcm9kdWN0cy1hcmUtc3VwcG9ydGVkLWluLWVhY2gtY291bnRyeS1hbmQtcmVnaW9uKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl0XFwncyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZywgc2F2aW5ncywgb3IgY2FzaCBtYW5hZ2VtZW50IGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgYXV0aG9yaXplZCBieSBhIHByb2Nlc3NvciB0b2tlbiwgaW5jbHVkaW5nIGFjY291bnQgbnVtYmVycywgYWNjb3VudCBvd25lcnMsIGhvbGRpbmdzLCBhbmQgZGF0YSBwcm92ZW5hbmNlIGluZm9ybWF0aW9uLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBBdXRoIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IGFjY291bnQgYXV0aGVudGljYXRpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0KHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSW52ZXN0bWVudCBIb2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIHlvdSBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIFBsYWlkIHdpbGwgbm9ybWFsbHkgaW5mZXIgdGhlIG91dGNvbWUgZnJvbSB5b3VyIFNpZ25hbCBSdWxlcy4gSG93ZXZlciwgaWYgeW91IGFyZSBub3QgdXNpbmcgU2lnbmFsIFJ1bGVzLCBpZiB0aGUgU2lnbmFsIFJ1bGVzIG91dGNvbWUgd2FzIGBSRVZJRVdgLCBvciBpZiB5b3UgdGFrZSBhIGRpZmZlcmVudCBhY3Rpb24gdGhhbiB0aGUgb25lIGRldGVybWluZWQgYnkgdGhlIFNpZ25hbCBSdWxlcywgeW91IHdpbGwgbmVlZCB0byBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLiBUaGlzIGhlbHBzIGltcHJvdmUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGFjY3VyYWN5IGZvciB5b3VyIGFjY291bnQgYW5kIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoZSBydWxlIHBlcmZvcm1hbmNlIGFuZCBydWxlIHR1bmluZyBjYXBhYmlsaXRpZXMgaW4gdGhlIERhc2hib2FyZC4gSWYgeW91ciBlZmZlY3RpdmUgZGVjaXNpb24gY2hhbmdlcyBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIChmb3IgZXhhbXBsZSwgeW91IGluZGljYXRlZCB0aGF0IHlvdSBhY2NlcHRlZCBhIHRyYW5zYWN0aW9uLCBidXQgbGF0ZXIgb24sIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IgcmVqZWN0ZWQgaXQsIHNvIGl0IHdhcyBuZXZlciBpbml0aWF0ZWQpLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIGFnYWluIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gY29ycmVjdCBQbGFpZFxcJ3MgcmVjb3Jkcy4gIElmIHlvdSBhcmUgdXNpbmcgUGxhaWQgVHJhbnNmZXIgYXMgeW91ciBwYXltZW50IHByb2Nlc3NvciwgeW91IGFsc28gZG8gbm90IG5lZWQgdG8gY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCwgYXMgUGxhaWQgY2FuIGluZmVyIG91dGNvbWVzIGZyb20geW91ciBUcmFuc2ZlciBhY3Rpdml0eS4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHVzZXMgUnVsZXNldHMgdGhhdCBhcmUgY29uZmlndXJlZCBvbiB0aGUgZW5kIGN1c3RvbWVyXFwncyBEYXNoYm9hcmQgYW5kIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIHByb2R1Y3Qgb3IgdGhlIEJhbGFuY2UgcHJvZHVjdC4gV2hpY2ggcHJvZHVjdCBpcyB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgYHJ1bGVzZXRfa2V5YCB0aGF0IHlvdSBwcm92aWRlLiBOb3RlIHRoYXQgb25seSBjdXN0b21lci1jb25maWd1cmVkIHJ1bGVzZXRzIHdvcmsgd2l0aCB0aGlzIGVuZHBvaW50OyBhcyBhIHByb2Nlc3NvciBwYXJ0bmVyLCB5b3UgY2Fubm90IGNyZWF0ZSBvciBjb25maWd1cmUgeW91ciBvd24gcnVsZXNldHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2lnbmFsIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgaGF2ZSBoaWdoZXIgbGF0ZW5jeSBpZiBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLCBvciB3aGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQuIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJlcXVlc3QgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS4gIE5vdGUgdGhhdCB0aGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlbiBpcyBhIG9uZS10aW1lIHVzZSB0b2tlbi4gVG8gc3RvcmUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UsIHlvdSBjYW4gdXNlIGEgU3RyaXBlIGN1c3RvbWVyIG9iamVjdCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLCBvciB5b3UgY2FuIHVzZSBhIFN0cmlwZSBDdXN0b20gYWNjb3VudCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLiBUaGlzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBzaG91bGQgd29yayBpbmRlZmluaXRlbHksIHVubGVzcyB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNoYW5nZXMgb3IgdGhleSByZXZva2UgUGxhaWRcXCdzIHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGVpciBhY2NvdW50LiBTdHJpcGUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZSBiYW5rIGFjY291bnQgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZC4gSWYgeW91IGV2ZXIgbmVlZCB0byBjaGFuZ2UgdGhlIGJhbmsgYWNjb3VudCBkZXRhaWxzIHVzZWQgYnkgU3RyaXBlIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyLCBoYXZlIHRoZSB1c2VyIGdvIHRocm91Z2ggTGluayBhZ2FpbiBhbmQgY3JlYXRlIGEgbmV3IGJhbmsgYWNjb3VudCB0b2tlbiBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuICBUbyByZXZva2UgYSBiYW5rIGFjY291bnQgdG9rZW4sIHRoZSBlbnRpcmUgdW5kZXJseWluZyBhY2Nlc3MgdG9rZW4gbXVzdCBiZSByZXZva2VkIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIElmIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMsIG11bHRpcGxlIGRpZmZlcmVudCBwcm9jZXNzb3IgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIGZvciBhIHNpbmdsZSBhY2Nlc3MgdG9rZW4uIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW4gYmUgbW9kaWZpZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9zZXRgLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzIG9uIHRoZSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIEJ5IGRlZmF1bHQsIGEgcHJvY2Vzc29yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cyBvbiB0aGUgY29ycmVzcG9uZGluZyBpdGVtLiBUbyByZXN0cmljdCBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggdGhlIGRlc2lyZWQgcHJvZHVjdHMuIFRvIHJlc3RvcmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIGFuIGVtcHR5IGxpc3QuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB5b3VyIG5lZWRzIGFuZCB5b3VyIHByb2Nlc3NvclxcJ3MgbmVlZHMgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXJcXCdzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcuIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcHV0ZSBhIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmUgZm9yIGEgdXNlci4gVGhlIG1vZGVsIHNlbGVjdGVkIGRldGVybWluZXMgd2hhdCBpcyBzY29yZWQgYW5kIHdoYXQgYWRkaXRpb25hbCBmaWVsZHMgdGhlIHJlc3BvbnNlIGNvbnRhaW5zLiBGb3IgZXhhbXBsZSwgYHRpLWxpbmstc2Vzc2lvbi0yLjBgIHNjb3JlcyBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24gZm9yIGZyYXVkIHJpc2s7IGBjYXNoLWFkdmFuY2Utb25ib2FyZGluZy0xLjBgIHNjb3JlcyByZXBheW1lbnQgcmlzayBmb3IgYSBmaXJzdC10aW1lIGNhc2ggYWR2YW5jZSBhbmQgYWRkaXRpb25hbGx5IHBvcHVsYXRlcyBwZXItYW1vdW50LWJ1Y2tldCBzdWJzY29yZXMuIENhc2gtYWR2YW5jZSBtb2RlbHMgcmVxdWlyZSB0aGF0IHRoZSB1c2VyIGhhdmUgYSBQbGFpZCBJdGVtIHdpdGggVHJhbnNhY3Rpb25zIGVuYWJsZWQsIG9yIGFuIEFzc2V0cyBSZXBvcnQsIGJlZm9yZSBzY29yaW5nLiAgVGhlIGVuZHBvaW50IHJldHVybnMgSFRUUCA0MDAgd2l0aCBgZXJyb3JfdHlwZWAgPSBgSU5WQUxJRF9SRVFVRVNUYCBhbmQgYGVycm9yX2NvZGVgID0gYEZBSUxFRF9QUkVDT05ESVRJT05gIHdoZW4gYSByZXF1aXJlZCBwcmVjb25kaXRpb24gaXMgbm90IG1ldDogZm9yIGxpbmstc2Vzc2lvbiBtb2RlbHMsIHdoZW4gdGhlIExpbmsgc2Vzc2lvbiBoYXMgbm90IGNvbXBsZXRlZDsgZm9yIGNhc2gtYWR2YW5jZSBtb2RlbHMsIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCBzdWNjZXNzZnVsbHkgbGlua2VkIGFueSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBDb21wdXRlIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmVzIGFuZCBzdWJzY29yZXNcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0Q29tcHV0ZVJlcXVlc3R9IHByb3RlY3RDb21wdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RDb21wdXRlKHByb3RlY3RDb21wdXRlUmVxdWVzdDogUHJvdGVjdENvbXB1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb3RlY3RDb21wdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb3RlY3RDb21wdXRlKHByb3RlY3RDb21wdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnQgaW5jbHVkaW5nIFRydXN0IEluZGV4IHNjb3JlIGFuZCBmcmF1ZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7UHJvdGVjdEV2ZW50R2V0UmVxdWVzdH0gcHJvdGVjdEV2ZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0OiBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb3RlY3RFdmVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm90ZWN0RXZlbnRHZXQocHJvdGVjdEV2ZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YSBhbmQgb3B0aW9uYWxseSBnZXQgYSBUcnVzdCBJbmRleCBzY29yZSBmb3IgdGhlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZW5kIGEgbmV3IGV2ZW50IHRvIGVucmljaCB1c2VyIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0RXZlbnRTZW5kUmVxdWVzdH0gcHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm90ZWN0RXZlbnRTZW5kKHByb3RlY3RFdmVudFNlbmRSZXF1ZXN0OiBQcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm90ZWN0RXZlbnRTZW5kUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb3RlY3RFdmVudFNlbmQocHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBjcmVhdGUgYSBQcm90ZWN0IHJlcG9ydCB0byBkb2N1bWVudCBmcmF1ZCBpbmNpZGVudHMsIGludmVzdGlnYXRpb24gb3V0Y29tZXMsIG9yIG90aGVyIHJpc2sgZXZlbnRzLiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVwb3J0IHZhcmlvdXMgdHlwZXMgb2YgaW5jaWRlbnRzIGluY2x1ZGluZyBhY2NvdW50IHRha2VvdmVycywgaWRlbnRpdHkgZnJhdWQsIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMsIGFuZCBvdGhlciBzZWN1cml0eSBldmVudHMuIFRoZSByZXBvcnRlZCBkYXRhIGhlbHBzIGltcHJvdmUgZnJhdWQgZGV0ZWN0aW9uIG1vZGVscyBhbmQgcHJvdmlkZXMgdmFsdWFibGUgZmVlZGJhY2sgdG8gZW5oYW5jZSB0aGUgb3ZlcmFsbCBzZWN1cml0eSBvZiB0aGUgUGxhaWQgbmV0d29yay4gUmVwb3J0cyBjYW4gYmUgY3JlYXRlZCBmb3IgY29uZmlybWVkIGluY2lkZW50cyB0aGF0IGhhdmUgYmVlbiBmdWxseSBpbnZlc3RpZ2F0ZWQsIG9yIGZvciBzdXNwZWN0ZWQgaW5jaWRlbnRzIHRoYXQgcmVxdWlyZSBmdXJ0aGVyIHJldmlldy4gWW91IGNhbiBhc3NvY2lhdGUgcmVwb3J0cyB3aXRoIHNwZWNpZmljIHVzZXJzLCBzZXNzaW9ucywgb3IgdHJhbnNhY3Rpb25zIHRvIHByb3ZpZGUgY29tcHJlaGVuc2l2ZSBjb250ZXh0IGFib3V0IHRoZSBpbmNpZGVudC4gRWFjaCByZXBvcnQgbXVzdCBpbmNsdWRlIGB1c2VyX2lkYCwgb3IgYW4gYGluY2lkZW50X2V2ZW50YCB3aXRoIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgaWRlbnRpZmllcjogYGxpbmtfc2Vzc2lvbl9pZGAsIGBpZHZfc2Vzc2lvbl9pZGAsIGBwcm90ZWN0X2V2ZW50X2lkYCwgYHNpZ25hbF9jbGllbnRfdHJhbnNhY3Rpb25faWRgLCBvciBgYWNjZXNzX3Rva2VuYC4gQ29udGV4dCBmaWVsZHMgc3VjaCBhcyBgaW50ZXJuYWxfcmVmZXJlbmNlYCwgYHRpbWVgLCBgYW1vdW50YCwgYW5kIGBiYW5rX2FjY291bnRgIGRvIG5vdCBzYXRpc2Z5IHRoaXMgaWRlbnRpZmllciByZXF1aXJlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgUHJvdGVjdCByZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gcHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm90ZWN0UmVwb3J0Q3JlYXRlKHByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0OiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm90ZWN0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb3RlY3RSZXBvcnRDcmVhdGUocHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBnZXQgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGFzIGl0IHJlbGF0ZXMgdG8gdGhlaXIgZnJhdWQgcHJvZmlsZSB3aXRoIFByb3RlY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBQcm90ZWN0IHVzZXIgaW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdH0gcHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm90ZWN0VXNlckluc2lnaHRzR2V0KHByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb3RlY3RVc2VySW5zaWdodHNHZXQocHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9jcmEvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoIEZsb3cgVXBkYXRlcyAoTW9uaXRvcmluZykgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoIEZsb3cgVXBkYXRlc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0fSBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Q6IFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL2FwcGxpY2F0aW9uL3NlZWRgIGNyZWF0ZXMgYSB0ZXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBvbiBhbiBleGlzdGluZyBQZXJtaXNzaW9ucyBNYW5hZ2VyIEl0ZW1cXCdzIGxvZ2luLiBUaGUgc2VlZGVkIGFwcGxpY2F0aW9uIHdpbGwgYXBwZWFyIGluIHN1YnNlcXVlbnQgY2FsbHMgdG8gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgLiAgVGhlIGBhY2Nlc3NfdG9rZW5gIG11c3QgYmVsb25nIHRvIGEgUGVybWlzc2lvbnMgTWFuYWdlciBJdGVtIGNyZWF0ZWQgdmlhIGAvaXRlbS9pbXBvcnRgIGluIFNhbmRib3guIFRoZSBgYXBwbGljYXRpb25faWRgIGlkZW50aWZpZXMgdGhlIGFwcGxpY2F0aW9uIHRvIHNlZWQgYXMgYSBjb25uZWN0ZWQgYXBwLiBUbyBkaXNjb25uZWN0IGEgc2VlZGVkIGFwcGxpY2F0aW9uLCB1c2UgYC9pdGVtL2FwcGxpY2F0aW9uL3VubGlua2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlZWQgYSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgUGVybWlzc2lvbnMgTWFuYWdlciBzYW5kYm94IGl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3R9IHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdDogU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIHNpbXVsYXRpbmcgYSBkZWZhdWx0IHVwZGF0ZSBldmVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdCBhcyBzcGVjaWZpZWQgd2l0aCB0aGUgYHdlYmhvb2tfdHlwZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gVmFsaWQgU2FuZGJveCBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgdHlwZXMgaW5jbHVkZTogYEFVVEhgLCBgSURFTlRJVFlgLCBgVFJBTlNBQ1RJT05TYCwgYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2AsIGBMSUFCSUxJVElFU2AsIGBIT0xESU5HU2AuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIHByb2R1Y3QsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IEZpcmVkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgYWNjb3VudCBpcyBhdmFpbGFibGUgb24gdGhlIEl0ZW0gYW5kIHlvdSBjYW4gbGF1bmNoIHVwZGF0ZSBtb2RlIHRvIHJlcXVlc3QgYWNjZXNzIHRvIGl0LiAgYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmA6IEZpcmVkIHdoZW4gYSBnaXZlbiBTYW1lLURheSBNaWNyby1kZXBvc2l0IEl0ZW0gaXMgdmVyaWZpZWQgdmlhIFNNUyB2ZXJpZmljYXRpb24uICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBQRU5ESU5HX0RJU0NPTk5FQ1RgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2lsbCBzdG9wIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlIChlLmcuIGR1ZSB0byBhIHBsYW5uZWQgYmFuayBtaWdyYXRpb24pIGFuZCBtdXN0IGJlIHNlbnQgdGhyb3VnaCB1cGRhdGUgbW9kZSB0byBjb250aW51ZSB3b3JraW5nLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25zXFwnIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgeW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT0F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPQXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zYWN0aW9ucy9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBuZXcgdHJhbnNhY3Rpb25zIGZvciBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCB1cCB0byAxMCB0cmFuc2FjdGlvbnMgdG8gYW55IEl0ZW0gYXQgYSB0aW1lLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggSXRlbXMgdGhhdCB3ZXJlIGNyZWF0ZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgdXNpbmcgdGhlIGB1c2VyX3RyYW5zYWN0aW9uc19keW5hbWljYCB0ZXN0IHVzZXIuIFlvdSBjYW4gdXNlIHRoaXMgdG8gYWRkIHRyYW5zYWN0aW9ucyB0byB0ZXN0IHRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludHMuICBDdXN0b20gdHJhbnNhY3Rpb25zIGFyZSBvbmx5IGFwcGxpZWQgdG8gdGhlIGRlcG9zaXRvcnkgYWNjb3VudC4gU3VwcG9ydCBmb3IgcGVyLWFjY291bnQgdGFyZ2V0aW5nIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgc2FuZGJveCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlKHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGUoc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW4vYCBmdW5jdGlvbnMgdGhlIHNhbWUgYXMgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBidXQgd2lsbCBtb2RpZnkgSXRlbXMgcmVsYXRlZCB0byBhIFVzZXIuIFRoaXMgZW5kcG9pbnQgZm9yY2VzIGVhY2ggSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCwgeW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBpdGVtKHMpIGZvciBhIFNhbmRib3ggVXNlciBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hVc2VyUmVzZXRMb2dpbihzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hVc2VyUmVzZXRMb2dpblJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2Vzc2lvbi90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgTGF5ZXIuIFRoZSByZXR1cm5lZCBMaW5rIHRva2VuIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgdGhlIExpbmsgU0RLLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgTGluayB0b2tlbiBmb3IgTGF5ZXJcbiAgICAgICAgICogQHBhcmFtIHtTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0fSBzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2Vzc2lvblRva2VuQ3JlYXRlKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3Q6IFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNlc3Npb25Ub2tlbkNyZWF0ZShzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgeW91IGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLiBUaGlzIGhlbHBzIGltcHJvdmUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGFjY3VyYWN5IGZvciB5b3VyIGFjY291bnQgYW5kIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoZSBydWxlIHBlcmZvcm1hbmNlIGFuZCBydWxlIHR1bmluZyBjYXBhYmlsaXRpZXMgaW4gdGhlIERhc2hib2FyZC4gSWYgeW91ciBlZmZlY3RpdmUgZGVjaXNpb24gY2hhbmdlcyBhZnRlciBjYWxsaW5nIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCwgYXMgUGxhaWQgY2FuIGluZmVyIG91dGNvbWVzIGZyb20geW91ciBUcmFuc2ZlciBhY3Rpdml0eS4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEJlZm9yZSB1c2luZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBydWxlc2V0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKSBpbiB0aGUgRGFzaGJvYXJkIHVuZGVyIFsqKlNpZ25hbC0+UnVsZXMqKl0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3NpZ25hbC9yaXNrLXByb2ZpbGVzKS4gIGAvc2lnbmFsL2V2YWx1YXRlYCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIG9yIHRoZSBCYWxhbmNlIHByb2R1Y3QuIFdoaWNoIHByb2R1Y3QgaXMgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGBydWxlc2V0X2tleWAgdGhhdCB5b3UgcHJvdmlkZS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtTaWduYWwgUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSBoYXZlIGhpZ2hlciBsYXRlbmN5IHdoZW4gdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldC4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmVxdWVzdCBkYXRhLiBCYWxhbmNlLW9ubHkgcnVsZXNldHMgbWF5IGhhdmUgbGF0ZW5jeSBvZiB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmU7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGFuIEl0ZW0gaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgdXNlZCB0byBkZXZlbG9wIGEgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIGBzaWduYWxgIHdhcyBhZGRlZCBpbiB0aGUgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheSBidXQgbm90IGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheS4gSWYgYC9zaWduYWwvcHJlcGFyZWAgaXMgc2tpcHBlZCBvbiBhbiBJdGVtIHRoYXQgaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIHRoZSBpbml0aWFsIGNhbGwgdG8gYC9zaWduYWwvZXZhbHVhdGVgIG9uIHRoYXQgSXRlbSB3aWxsIGJlIGxlc3MgYWNjdXJhdGUsIGJlY2F1c2UgUGxhaWQgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgeW91ciBpbnRlZ3JhdGlvbiBpcyBwdXJlbHkgQmFsYW5jZS1vbmx5LCB0aGlzIGVuZHBvaW50IHdpbGwgaGF2ZSBubyBlZmZlY3QsIGFzIEJhbGFuY2Utb25seSBydWxlc2V0cyBkbyBub3QgY2FsY3VsYXRlIGEgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3Jlc1xuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFByZXBhcmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kcyBpbnRvIHlvdXIgc2NvcmVzIGFuZCB0dW5lIHJ1bGUgbG9naWMuIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoYXMgQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL3NjaGVkdWxlYCB0byBzY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBTY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsU2NoZWR1bGVSZXF1ZXN0fSBzaWduYWxTY2hlZHVsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxTY2hlZHVsZShzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxTY2hlZHVsZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxTY2hlZHVsZShzaWduYWxTY2hlZHVsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFN0YXRlbWVudHNMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBzdGF0ZW1lbnRzIGRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2VyXFwncyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuICBXaGVuIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGZvciBiZXN0IHJlc3VsdHMsIG1ha2Ugc3VyZSB0byB1c2UgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgcGFyYW1ldGVyIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBJdGVtcyB3aXRoIFRyYW5zYWN0aW9ucy4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhlIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIFRyYW5zYWN0aW9ucyBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYC4gIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gb3B0aW9uYWwgYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nLiBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBBIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHVzZWQgdG8gY3JlYXRlIGEgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gVGhlIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gd2lsbCBleHBpcmUgaWYgbm90IHVzZWQgYWZ0ZXIgb25lIGhvdXIuIChZb3UgY2FuIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGF1dGhvcml6YXRpb24gbGlmZXRpbWUuKSAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBhZGRpdGlvbmFsIHVzZXIgaW5wdXQgaXMgbmVlZGVkLCB1c3VhbGx5IHRvIGZpeCBhIGJyb2tlbiBiYW5rIGNvbm5lY3Rpb24sIGJlZm9yZSBQbGFpZCBjYW4gcHJvcGVybHkgYXNzZXNzIHRoZSByaXNrLiBZb3UgbmVlZCB0byBsYXVuY2ggTGluayBpbiB1cGRhdGUgbW9kZSB0byBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgdXNlciBhY3Rpb24uIFdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCB0byBnZXQgYSBuZXcgTGluayB0b2tlbiwgaW5zdGVhZCBvZiBwcm92aWRpbmcgYGFjY2Vzc190b2tlbmAgaW4gdGhlIHJlcXVlc3QsIHlvdSBzaG91bGQgc2V0IFtgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNmZXItYXV0aG9yaXphdGlvbi1pZCkgYXMgdGhlIGBhdXRob3JpemF0aW9uLmlkYC4gQWZ0ZXIgdGhlIExpbmsgZmxvdyBpcyBjb21wbGV0ZWQsIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbi4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUtRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBnZXQgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBvZiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIChEZXByZWNhdGVkKSBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhbiBhY2NvdW50IHRvIGJlIHVzZWQgd2l0aCBUcmFuc2Zlci4gVGhpcyBlbmRwb2ludCB3b3JrcyBvbiBhbGwgVHJhbnNmZXItY2FwYWJsZSBJdGVtcywgaW5jbHVkaW5nIHRob3NlIGNyZWF0ZWQgYnkgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgaXMgcmV0cnlhYmxlIGFuZCBpZGVtcG90ZW50OyBpZiBhIHRyYW5zZmVyIHdpdGggdGhlIHByb3ZpZGVkIGB0cmFuc2Zlcl9pZGAgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBpdCB3aWxsIHJldHVybiB0aGUgdHJhbnNmZXIgZGV0YWlscyB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IHRyYW5zZmVyLiBBIHRyYW5zZmVyIG1heSBzdGlsbCBiZSBjcmVhdGVkIGlmIGEgNTAwIGVycm9yIGlzIHJldHVybmVkOyB0byBkZXRlY3QgdGhpcyBzY2VuYXJpbywgdXNlIFtUcmFuc2ZlciBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvcmVjb25jaWxpbmctdHJhbnNmZXJzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW91XFwnbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIGBtdWx0aXBhcnQvZm9ybS1kYXRhYC4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCA1MDAgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudEdldFJlcXVlc3R9IHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdDogVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gbGVkZ2VycywgaWYgeW91IGhhdmUgbXVsdGlwbGUuIElmIHlvdVxcJ3JlIGEgcGxhdGZvcm0sIHlvdSBjYW4gbW92ZSBmdW5kcyBiZXR3ZWVuIG9uZSBvZiB5b3VyIGxlZGdlcnMgYW5kIG9uZSBvZiB5b3VyIGN1c3RvbWVyXFwncyBsZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBsZWRnZXIgZXZlbnRzIGZvciBhIHNwZWNpZmljIGxlZGdlciBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGxlZGdlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0KHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0KHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLiAgSW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZW5kcG9pbnQgcmV0dXJucyBzdGF0aWMgcGxhY2Vob2xkZXIgdmFsdWVzIHJhdGhlciB0aGFuIG1ldHJpY3MgY29tcHV0ZWQgZnJvbSB5b3VyIFNhbmRib3ggdHJhbnNmZXIgYWN0aXZpdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBwcmV2aW91c2x5LXZlcmlmaWVkIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBvciBbc3VwcG9ydF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQpLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IGZ1bmRpbmcgYWNjb3VudCBmb3IgdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBmdW5kaW5nIGFjY291bnQgZm9yIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBzdWJtaXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3IgeW91IGFyZSBvbmJvYXJkaW5nLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmF0b3JcXCdzIGFncmVlbWVudCB0byB0aGUgcmVxdWlyZWQgbGVnYWwgdGVybXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciAoZS5nLiBiZW5lZmljaWFsIG93bmVyIG9yIGNvbnRyb2wgcGVyc29uKSBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uYWwgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCBhZGRpdGlvbmFsIG9uYm9hcmRpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQgYnkgUGxhaWQgdG8gYXBwcm92ZSBvciBkZWNsaW5lIHRoZSBvcmlnaW5hdG9yLiBTZWUgW1JlcXVpcmVtZW50IHR5cGUgc2NoZW1hIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMU5FUWtURDBzVks1MGlBUWk2eEhpZ3JleERVeFo0UXhYcVNFZlZfRkZUaVUvKSBmb3IgYSBsaXN0IG9mIHJlcXVpcmVtZW50IHR5cGVzIGFuZCBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBhZGRpdGlvbmFsIG9uYm9hcmRpbmcgaW5mb3JtYXRpb24gb24gYmVoYWxmIG9mIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZFxcJ3MgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFRyYW5zZmVyIGZvciBQbGF0Zm9ybXMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuICBBIHJlZnVuZCBjYW4gc3RpbGwgYmUgaXNzdWVkIGV2ZW4gaWYgdGhlIEl0ZW1cXCdzIGBhY2Nlc3NfdG9rZW5gIGlzIG5vIGxvbmdlciB2YWxpZCAoZS5nLiBpZiB0aGUgdXNlciByZXZva2VkIE9BdXRoIGNvbnNlbnQgb3IgdGhlIEl0ZW0gd2FzIGRlbGV0ZWQgdmlhIGAvaXRlbS9yZW1vdmVgKSwgYXMgbG9uZyBhcyB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgcGFpciB1c2VkIHRvIG1ha2UgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGlzIHN0aWxsIHZhbGlkLiBBIHJlZnVuZCBjYW5ub3QgYmUgaXNzdWVkIGlmIHRoZSBJdGVtIGhhcyBhbiBbaW52YWxpZGF0ZWQgVEFOXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLCB3aGljaCBjYW4gb2NjdXIgYXQgQ2hhc2Ugb3IgUE5DLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHNlbmRpbmcgY2xpZW50LXNwZWNpZmljIGV2ZW50cyByZWxhdGVkIHRvIExheWVyIHNlc3Npb25zIGZvciBhbmFseXRpY3MgYW5kIHRyYWNraW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZW5kIFVzZXIgQWNjb3VudCBTZXNzaW9uIEV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZCh1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmQodXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB1c2VyIHBlcm1pc3Npb25lZCBhY2NvdW50IGRhdGEsIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLCBmb3IgdXNlIHdpdGggW1BsYWlkIExheWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyKS4gTm90ZSB0aGF0IGVuZCB1c2VycyBhcmUgcGVybWl0dGVkIHRvIGVkaXQgdGhlIHByZWZpbGxlZCBpZGVudGl0eSBkYXRhIGluIHRoZSBMaW5rIGZsb3cgYmVmb3JlIHNoYXJpbmcgaXQgd2l0aCB5b3U7IHlvdSBzaG91bGQgdHJlYXQgYW55IGlkZW50aXR5IGRhdGEgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcyB1c2VyLXN1Ym1pdHRlZCwgdW52ZXJpZmllZCBkYXRhLiBGb3IgYSB2ZXJpZmljYXRpb24gbGF5ZXIsIHlvdSBjYW4gYWRkIFtJZGVudGl0eSBWZXJpZmljYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uLykgdG8geW91ciBmbG93LCBvciBjaGVjayB0aGUgc3VibWl0dGVkIGlkZW50aXR5IGRhdGEgYWdhaW5zdCBiYW5rIGFjY291bnQgZGF0YSBmcm9tIGxpbmtlZCBhY2NvdW50cyB1c2luZyBbSWRlbnRpdHkgTWF0Y2hdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvI2lkZW50aXR5LW1hdGNoKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvciBQbGFpZCBwcm9kdWN0cyBhbmQgZmxvd3MgdGhhdCB1c2UgdGhlIHVzZXIgb2JqZWN0LCBgL3VzZXIvY3JlYXRlYCBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IG11c3QgY2FsbCB0aGlzIGVuZHBvaW50IGJlZm9yZSBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIGlmIHlvdSBhcmUgdXNpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmc6IFBsYWlkIENoZWNrLCBJbmNvbWUgVmVyaWZpY2F0aW9uLCBNdWx0aS1JdGVtIExpbmssIG9yIFBsYWlkIFByb3RlY3QgKElkZW50aXR5KS4gSWYgeW91IGFyZSB1c2luZyBQbGFpZCBQcm90ZWN0IExpbmsgc2Vzc2lvbiBzY29yaW5nLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCBgL3VzZXIvY3JlYXRlYCBmaXJzdDsgUGxhaWQgd2lsbCByZXNvbHZlIG9yIGNyZWF0ZSB0aGUgdXNlciB3aGVuIGB1c2VyLmNsaWVudF91c2VyX2lkYCBpcyBwcm92aWRlZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gRm9yIGN1c3RvbWVycyB3aG8gYmVnYW4gdXNpbmcgdGhpcyBlbmRwb2ludCBvbiBvciBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSwgdGhpcyBlbmRwb2ludCB0YWtlcyBhIGBjbGllbnRfdXNlcl9pZGAgYW5kIGFuIGBpZGVudGl0eWAgb2JqZWN0IGFuZCB3aWxsIHJldHVybiBhIGB1c2VyX2lkYC4gRm9yIGN1c3RvbWVycyB3aG8gYmVnYW4gdXNpbmcgaXQgYmVmb3JlIHRoYXQgZGF0ZSwgdGhlIGVuZHBvaW50IHRha2VzIGEgYGNsaWVudF91c2VyX2lkYCBhbmQgYSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCBhbmQgd2lsbCByZXR1cm4gYSBgdXNlcl90b2tlbmAgYW5kIGB1c2VyX2lkYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLiBJbiBvcmRlciB0byBjcmVhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQgZm9yIGEgdXNlciwgdGhlIGBpZGVudGl0eWAgKG5ldykgb3IgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCAobGVnYWN5KSBvYmplY3QgbXVzdCBiZSBwcmVzZW50LiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHRoZSBgL3VzZXIvY3JlYXRlYCBjYWxsLCBpdCBjYW4gYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gICBJbiBvcmRlciB0byBnZW5lcmF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgdGhlIGZvbGxvd2luZyBgaWRlbnRpdHlgIGZpZWxkcywgYXQgbWluaW11bSwgYXJlIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG5vbi1lbXB0eTogYG5hbWVgLCBgZGF0ZV9vZl9iaXJ0aGAsIGBlbWFpbHNgLCBgcGhvbmVfbnVtYmVyc2AsIGFuZCBgYWRkcmVzc2VzYCwgKHdpdGggYXQgbGVhc3Qgb25lIGVtYWlsLCBwaG9uZSBudW1iZXIsIGFuZCBhZGRyZXNzIGRlc2lnbmF0ZWQgYXMgYHByaW1hcnlgKS4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuIElmIGNyZWF0aW5nIGEgcmVwb3J0IGZvciBzaGFyaW5nIHdpdGggYSBHU0Ugc3VjaCBhcyBGYW5uaWUgb3IgRnJlZGRpZSwgdGhlIHVzZXJcXCdzIGZ1bGwgU1NOIG11c3QgYmUgcHJvdmlkZWQgdmlhIHRoZSBgaWRfbnVtYmVyc2AgZmllbGQuIFByb3ZpZGluZyBhdCBsZWFzdCBhIHBhcnRpYWwgU1NOIGlzIGFsc28gc3Ryb25nbHkgcmVjb21tZW5kZWQgZm9yIGFsbCB1c2UgY2FzZXMsIHNpbmNlIGl0IGltcHJvdmVzIHRoZSBhY2N1cmFjeSBvZiBtYXRjaGluZyB1c2VyIHJlY29yZHMgZHVyaW5nIGNvbXBsaWFuY2UgcHJvY2Vzc2VzIHN1Y2ggYXMgZmlsZSBkaXNjbG9zdXJlLCBkaXNwdXRlLCBvciBzZWN1cml0eSBmcmVlemUgcmVxdWVzdHMuICAgV2hlbiB1c2luZyBQbGFpZCBQcm90ZWN0LCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgcHJvdmlkZSBhbiBgaWRlbnRpdHlgIG9iamVjdCB0byBiZXR0ZXIgaWRlbnRpZnkgYW5kIGJsb2NrIGZyYXVkIGFjcm9zcyB5b3VyIExpbmsgc2Vzc2lvbnMuICAgUGxhaWQgd2lsbCBub3JtYWxpemUgaWRlbnRpdHkgZmllbGRzIGJlZm9yZSBzdG9yaW5nIHRoZW0gYW5kIHV0aWxpemUgdGhlIHNhbWUgaWRlbnRpdHkgYWNyb3NzIGRpZmZlcmVudCB1c2VyLWJhc2VkIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIEZpbmFuY2lhbCBJbnNpZ2h0cyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyB0aGUgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgYW5kIExpYWJpbGl0aWVzIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBUcmFuc2FjdGlvbnMgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdXNlciBpdGVtcyBmb3IgRmluYW5jaWFsLUluc2lnaHRzIGJ1bmRsZVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3R9IHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2godXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdDogVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckZpbmFuY2lhbERhdGFSZWZyZXNoKHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgdXNlciBkZXRhaWxzIHVzaW5nIGEgYHVzZXJfaWRgLiBUaGlzIGVuZHBvaW50IG9ubHkgc3VwcG9ydHMgdXNlcnMgdGhhdCB3ZXJlIGNyZWF0ZWQgb24gdGhlIG5ldyB1c2VyIEFQSSBmbG93LCB3aXRob3V0IGEgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHVzZXIgaWRlbnRpdHkgYW5kIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckdldFJlcXVlc3R9IHVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJHZXQodXNlckdldFJlcXVlc3Q6IFVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJHZXQodXNlckdldFJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyBjdXN0b21lcnMgdG8gZXhwbGljaXRseSBwdXJnZSBpZGVudGl0eS9QSUkgZGF0YSBwcm92aWRlZCB0byBQbGFpZCBmb3IgYSBnaXZlbiB1c2VyLiBUaGlzIGlzIG5vdCBleHBvc2VkIHRvIGN1c3RvbWVycyBieSBkZWZhdWx0LCBhcyBpdCBpcyBtZWFudCBmb3Igc3BlY2lhbCBzY2VuYXJpb3Mgb3IgcmVxdWVzdHMsIGJ1dCBQbGFpZCBpcyBvYmxpZ2F0ZWQgdG8gZW5hYmxlIGN1c3RvbWVycyB0byBkZWxldGUgUElJIHByb3ZpZGVkIHRvIHVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlciBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdH0gdXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VySWRlbnRpdHlSZW1vdmUodXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdDogVXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlcklkZW50aXR5UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJJZGVudGl0eVJlbW92ZSh1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXNzb2NpYXRlcyBJdGVtcyB0byB0aGUgdGFyZ2V0IHVzZXIuIElmIGFuIEl0ZW0gaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGFub3RoZXIgdXNlciwgdGhlIEl0ZW0gd2lsbCBiZSBkaXNhc3NvY2lhdGVkIHdpdGggdGhlIGV4aXN0aW5nIHVzZXIgYW5kIGFzc29jaWF0ZWQgdG8gdGhlIHRhcmdldCB1c2VyLiBUaGlzIG9wZXJhdGlvbiBzdXBwb3J0cyBhIG1heCBvZiAxMDAgSXRlbXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFzc29jaWF0ZSBJdGVtcyB0byBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0fSB1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckl0ZW1zQXNzb2NpYXRlKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3Q6IFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckl0ZW1zQXNzb2NpYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJJdGVtc0Fzc29jaWF0ZSh1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBgdXNlcl9pZGAsIGFsb25nIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBzdGF0dXNlcy4gUGxhaWQgYXNzb2NpYXRlcyBhbiBJdGVtIHdpdGggYSBVc2VyIHdoZW4gaXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB3aXRoaW4gYSBMaW5rIHNlc3Npb24gaW5pdGlhbGl6ZWQgd2l0aCB0aGF0IGB1c2VyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNHZXRSZXF1ZXN0fSB1c2VySXRlbXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckl0ZW1zR2V0KHVzZXJJdGVtc0dldFJlcXVlc3Q6IFVzZXJJdGVtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckl0ZW1zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlcyBzcGVjaWZpYyBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSB1c2VyLiBJdCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgb24gZWFjaCBJdGVtIGluZGl2aWR1YWxseSwgYnV0IHN1cHBvcnRzIHVzZSBjYXNlcyAoc3VjaCBhcyBQbGFpZCBDaGVjaykgd2hlcmUgYWNjZXNzIHRva2VucyBhcmUgbm90IGF2YWlsYWJsZS4gQWxsIHNwZWNpZmllZCBJdGVtcyBtdXN0IGJlbG9uZyB0byB0aGUgdXNlciBvciB0aGUgZW50aXJlIG9wZXJhdGlvbiBmYWlscy4gU2ltaWxhciB0byBgL2l0ZW0vcmVtb3ZlYCwgdGhpcyBkZWxldGVzIEl0ZW0gcHJvZHVjdCBkYXRhIGFuZCB0ZXJtaW5hdGVzIGJpbGxpbmcgb24gdGhlIEl0ZW1cXCdzIHByb2R1Y3RzLiBPbmNlIHJlbW92ZWQsIEl0ZW1zIGNhbm5vdCBiZSByZWNvbm5lY3RlZCB3aXRob3V0IGdvaW5nIHRocm91Z2ggTGluayBhZ2Fpbi4gVGhpcyBlbmRwb2ludCBpcyBub3QgaW50ZW5kZWQgdG8gcmVtb3ZlIGFsbCBkYXRhIGZvciBhIHVzZXIsIGFzIGl0IHdpbGwgb25seSByZW1vdmUgSXRlbXMgYW5kIG5vIG90aGVyIGRhdGEgZm9yIHRoZSB1c2VyLiBJZiB0aGUgdXNlciBoYXMgYW55IHVzZXItYmFzZWQgcmVjdXJyaW5nIHN1YnNjcmlwdGlvbiBwcm9kdWN0cyAoRmluYW5jaWFsIE1hbmFnZW1lbnQsIFBsYWlkIFByb3RlY3QsIG9yIENSQSBDYXNoIEZsb3cgVXBkYXRlcykgYW5kIGlzIGRlbGV0aW5nIHRoZWlyIGFjY291bnQgd2l0aCB5b3VyIHByb2R1Y3QsIGFsc28gY2FsbCBgL3VzZXIvcHJvZHVjdHMvdGVybWluYXRlYCB0byBlbmQgdGhvc2Ugc3Vic2NyaXB0aW9uczsgcGVyLUl0ZW0gYmlsbGluZyBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGEgdXNlciBpbml0aWF0ZWQgZGF0YSBkZWxldGlvbiByZXF1ZXN0LCBzZWUgdGhlIFtDb25zdW1lciBTZXJ2aWNlIENlbnRlcl0oaHR0cHM6Ly9wbGFpZC5jb20vY2hlY2svY29uc3VtZXItc2VydmljZS1jZW50ZXIvKSB0byByZXZva2UgYWNjZXNzIHRvIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBJdGVtcyBmcm9tIGEgVXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc1JlbW92ZVJlcXVlc3R9IHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VySXRlbXNSZW1vdmUodXNlckl0ZW1zUmVtb3ZlUmVxdWVzdDogVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VySXRlbXNSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckl0ZW1zUmVtb3ZlKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUZXJtaW5hdGVzIHVzZXItYmFzZWQgcmVjdXJyaW5nIHN1YnNjcmlwdGlvbiBidW5kbGVzIG9yIHByb2R1Y3RzIChGaW5hbmNpYWwgTWFuYWdlbWVudCwgUGxhaWQgUHJvdGVjdCwgYW5kIENSQSBDYXNoIEZsb3cgVXBkYXRlcykgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLiBBZnRlciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LCB0aGUgdXNlciB3aWxsIG5vIGxvbmdlciBiZSBiaWxsZWQgZm9yIHRoZXNlIHByb2R1Y3RzLiBGb3IgQ1JBIE1vbml0b3JpbmcsIHRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQgYnV0IGhpc3RvcmljYWwgZGF0YSByZW1haW5zIGF2YWlsYWJsZSBmb3IgZnV0dXJlIHJlcG9ydCByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVGVybWluYXRlIHVzZXItYmFzZWQgcHJvZHVjdHNcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0fSB1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclByb2R1Y3RzVGVybWluYXRlKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Q6IFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJQcm9kdWN0c1Rlcm1pbmF0ZSh1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL3JlbW92ZWAgZGVsZXRlcyBhIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAgYW5kIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJSZW1vdmVSZXF1ZXN0fSB1c2VyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyUmVtb3ZlKHVzZXJSZW1vdmVSZXF1ZXN0OiBVc2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyUmVtb3ZlKHVzZXJSZW1vdmVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIHNoYXJlZCB3aXRoIGFuZCB1c2VkIGJ5IGEgc3BlY2lmaWVkIHRoaXJkLXBhcnR5IGNsaWVudCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhyb3VnaCBzdXBwb3J0ZWQgZW5kcG9pbnRzLiAgRW5zdXJlIHlvdSBzdG9yZSB0aGUgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gIGFsb25nIHdpdGggdGhlIGB1c2VyX3Rva2VuYCBhbmQgYHRoaXJkX3BhcnR5X2NsaWVudF9pZGAsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclRoaXJkUGFydHlUb2tlblJlbW92ZSh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgVXNlciB1c2luZyB0aGUgVHJhbnNhY3Rpb25zIGJ1bmRsZS4gVGhpcyBidW5kbGUgcmVmcmVzaGVzIG9ubHkgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGRhdGEuIFRoaXMgZW5kcG9pbnQgaXMgZm9yIGNsaWVudHMgd2hvIHVzZSB0aGUgVHJhbnNhY3Rpb25zIEluc2lnaHRzIGJ1bmRsZSBhbmQgd2FudCB0byBwcm9hY3RpdmVseSB1cGRhdGUgYWxsIGxpbmtlZCBJdGVtcyB1bmRlciBhIHVzZXIuIFRoZSByZWZyZXNoIG1heSBzdWNjZWVkIG9yIGZhaWwgb24gYSBwZXItSXRlbSBiYXNpcy4gVXNlIHRoZSBgcmVzdWx0c2AgYXJyYXkgaW4gdGhlIHJlc3BvbnNlIHRvIHVuZGVyc3RhbmQgdGhlIG91dGNvbWUgZm9yIGVhY2ggSXRlbS4gIFRoaXMgZW5kcG9pbnQgaXMgZGlzdGluY3QgZnJvbSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgd2hpY2ggdHJpZ2dlcnMgYSByZWZyZXNoIGZvciBhIHNpbmdsZSBJdGVtLiBVc2UgYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCB0byB0YXJnZXQgYWxsIEl0ZW1zIGZvciBhIHVzZXIgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB1c2VyIGl0ZW1zIGZvciBUcmFuc2FjdGlvbnMgYnVuZGxlXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaCh1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVHJhbnNhY3Rpb25zUmVmcmVzaCh1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHVwZGF0ZXMgdXNlciBpbmZvcm1hdGlvbiBmb3IgYW4gZXhpc3RpbmcgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYC4gSWYgYW4gZXhpc3RpbmcgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYCBpcyBtaXNzaW5nIGZpZWxkcyByZXF1aXJlZCBmb3IgYSBnaXZlbiB1c2UgY2FzZSAoZS5nLiBjcmVhdGluZyBhIENvbnN1bWVyIFJlcG9ydCkgdXNlIGAvdXNlci91cGRhdGVgIHRvIGFkZCB2YWx1ZXMgZm9yIHRob3NlIGZpZWxkcy4gIElkZW50aXR5IHVwZGF0ZXMgdXNlIG1lcmdlIHNlbWFudGljczogcHJvdmlkZWQgZmllbGRzIG92ZXJ3cml0ZSBleGlzdGluZyBvbmVzOyBvbWl0dGVkIGZpZWxkcyByZW1haW4gdW5jaGFuZ2VkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0OiBVc2VyVXBkYXRlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdDogV2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IFdhdGNobGlzdCBTY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBXYXRjaGxpc3QgUHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYSBwZXJzb25cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGEgc3BlY2lmaWMgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGN1c3RvbWVyIGluZm9ybWF0aW9uLCBjb3JyZWN0IG91dGRhdGVkIGluZm9ybWF0aW9uLCBhZGQgYSByZWZlcmVuY2UgaWQsIGFzc2lnbiB0aGUgaW5kaXZpZHVhbCB0byBhIHJldmlld2VyLCBhbmQgdXBkYXRlIHdoaWNoIHByb2dyYW0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBtYXkgbm90IHVwZGF0ZSBgc2VhcmNoX3Rlcm1zYCBhbmQgYHN0YXR1c2AgYXQgdGhlIHNhbWUgdGltZSBzaW5jZSBlZGl0aW5nIGBzZWFyY2hfdGVybXNgIG1heSB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBgc3RhdHVzYCBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBQbGFpZEFwaVxuICogQGV4dGVuZHMge0Jhc2VBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBQbGFpZEFwaSBleHRlbmRzIEJhc2VBUEkge1xuICAgIC8qKlxuICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsICBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZFxcJ3Mgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3Q7IGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIE5vdGU6IElmIHlvdSBhcmUgZ2V0dGluZyByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzZXNzaW5nIHRoZSByZXR1cm4gcmlzayBvZiBhIHByb3Bvc2VkIEFDSCB0cmFuc2FjdGlvbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGAvc2lnbmFsL2V2YWx1YXRlYCBpbnN0ZWFkIG9mIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiBgL3NpZ25hbC9ldmFsdWF0ZWAgcmV0dXJucyB0aGUgc2FtZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiBhbmQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gU2lnbmFsIFJ1bGVzLCB3aGljaCBwcm92aWRlcyBuby1jb2RlIHRyYW5zYWN0aW9uIGJ1c2luZXNzIGxvZ2ljIGNvbmZpZ3VyYXRpb24sIGJhY2t0ZXN0aW5nIGFuZCByZWNvbW1lbmRhdGlvbnMgZm9yIHR1bmluZyB5b3VyIHRyYW5zYWN0aW9uIGFjY2VwdGFuY2UgbG9naWMsIGFuZCB0aGUgYWJpbGl0eSB0byBlYXNpbHkgc3dpdGNoIGJldHdlZW4gQmFsYW5jZSBhbmQgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBhcyBuZWVkZWQgZm9yIHVsdHJhLWxvdy1sYXRlbmN5LCBNTC1wb3dlcmVkIHJpc2sgYXNzZXNzbWVudHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0JhbGFuY2UgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9iYWxhbmNlLyNiYWxhbmNlLWludGVncmF0aW9uLW9wdGlvbnMpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIC0tIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gVG8gcmV0dXJuIG5ldyBhY2NvdW50cyB0aGF0IHdlcmUgY3JlYXRlZCBhZnRlciB0aGUgdXNlciBsaW5rZWQgdGhlaXIgSXRlbSwgeW91IGNhbiBsaXN0ZW4gZm9yIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnRzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIG9yIGAvc2lnbmFsL2V2YWx1YXRlYCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byB0aGUgR1NFcyBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0gb3IgdXRpbGl6ZSBGcmVkZGllIE1hY1xcJ3MgTG9hbiBQcm9kdWN0IEFkdmlzb3LCriAoTFBBwq4pIEFzc2V0IGFuZCBJbmNvbWUgTW9kZWxlciAoQUlNKS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weSBpbiBQREYgZm9ybWF0LiBUaGUgY2FsbGVyIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRoYXQgd2FzIHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nLCBzYXZpbmdzLCBhbmQgY2FzaCBtYW5hZ2VtZW50IGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXV0aC92ZXJpZnlgIGVuZHBvaW50IHZlcmlmaWVzIGJhbmsgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIGFuZCAob3B0aW9uYWxseSkgYWNjb3VudCBvd25lciBuYW1lcyBhZ2FpbnN0IFBsYWlkXFwncyBkYXRhYmFzZSB2aWEgW0RhdGFiYXNlIEF1dGhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9kYXRhYmFzZS1hdXRoLykuIEl0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhY2NvdW50IG51bWJlcnMgdGhhdCB3ZXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoZSBQbGFpZCBMaW5rIGZsb3cuICBUaGlzIGVuZHBvaW50IGlzIGN1cnJlbnRseSBpbiBFYXJseSBBdmFpbGFiaWxpdHk7IGNvbnRhY3Qgc2FsZXMgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgVmVyaWZ5IGF1dGggZGF0YVxuICAgICAqIEBwYXJhbSB7QXV0aFZlcmlmeVJlcXVlc3R9IGF1dGhWZXJpZnlSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aFZlcmlmeShhdXRoVmVyaWZ5UmVxdWVzdDogQXV0aFZlcmlmeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoVmVyaWZ5KGF1dGhWZXJpZnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSByaXNrIG9mIGEgYmFuayBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdH0gYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgSUQuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHN1bW1hcnkgR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdH0gYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckhpc3RvcnlMaXN0KGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYHJlamVjdGVkYCwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBjbGVhcmVkYCwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgY2xlYXJlZGAuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBwZW5kaW5nX3Jldmlld2AuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0gb3IgYWRkIG5ldyBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIuICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYW4gaWRlbnRpdHkgZGF0YSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL2V3YV9yZXBvcnQvdjEvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhbiBFYXJuZWQgV2FnZSBBY2Nlc3MgKEVXQSkgc2NvcmUgdGhhdCBxdWFudGlmaWVzIHRoZSBkZWxpbnF1ZW5jeSByaXNrIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGl0ZW0uIFRoZSBzY29yZSBpcyBkZXJpdmVkIGZyb20gYSBjb21iaW5hdGlvbiBvZiBjYXNoZmxvdyBwYXR0ZXJucyBhbmQgbmV0d29yay1iYXNlZCBiZWhhdmlvcmFsIGZlYXR1cmVzLiAgVGhlIHJlc3BvbnNlIHJldHVybnMgYSBsaXN0IG9mIEVXQSBzY29yZXMsIHdoZXJlIGVhY2ggc2NvcmUgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWwgYWR2YW5jZSBhbW91bnQgcmFuZ2UuIFRoZXNlIHNjb3JlcyBlc3RpbWF0ZSB0aGUgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQgZm9yIGFkdmFuY2VzIHdpdGhpbiB0aGF0IHJhbmdlLiAgU2NvcmUgcmFuZ2U6IDEtOTkgIEludGVycHJldGF0aW9uOiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIGEgZ3JlYXRlciBsaWtlbGlob29kIG9mIHJlcGF5bWVudC4gIFRoaXMgZW5kcG9pbnQgZW5hYmxlcyBjbGllbnRzIHRvIGFzc2VzcyByZXBheW1lbnQgcmlzayBhbmQgbWFrZSBkYXRhLWRyaXZlbiBkZWNpc2lvbnMgd2hlbiBkZXRlcm1pbmluZyBlbGlnaWJpbGl0eSBvciBsaW1pdHMgZm9yIGVhcm5lZCB3YWdlIGFkdmFuY2VzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBFV0EgU2NvcmUgUmVwb3J0XG4gICAgICogQHBhcmFtIHtCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0fSBiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmV0YUV3YVJlcG9ydFYxR2V0KGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3Q6IEJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZXRhRXdhUmVwb3J0VjFHZXQoYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgcmVjb3JkLiBZb3UgY2FuIHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyB5b3UgaGF2ZSBhdmFpbGFibGUuIElmIGFueSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nIGZvciB0aGUgcHJvZHVjdHMgeW91IGludGVuZCB0byB1c2UsIGl0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBgcmVxdWlyZW1lbnRzX2R1ZWAgZmllbGQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0OiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlKGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgZnVsbCBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRldGFpbHMgb2YgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldChiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0OiBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0KGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgZW5kIGN1c3RvbWVyIHJlY29yZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFuIGV4aXN0aW5nIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGUocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBidXNpbmVzcyB2ZXJpZmljYXRpb24gdG8gY2hlY2sgYSBidXNpbmVzc1xcJ3MgaWRlbnRpdHkgYW5kIHJpc2sgcHJvZmlsZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0J1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGUoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5idXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZShidXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgc3BlY2lmaWMgYnVzaW5lc3MgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJ1c2luZXNzIFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7QnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBidXNpbmVzc1ZlcmlmaWNhdGlvbkdldChidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0KGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY2FzaGZsb3dfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUcmFuc2FjdGlvbnMgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGBoYXNfbW9yZWAgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gTm90ZSB0aGF0IGRhdGEgaXNuXFwndCBsaWtlbHkgdG8gYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvY2FzaGZsb3dfcmVwb3J0L2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgY2FzaGZsb3dfcmVwb3J0YCwgb3IgaWYgaXQgd2FzblxcJ3QsIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBDQVNIRkxPV19SRVBPUlRfUkVBRFlgIHdlYmhvb2suXG4gICAgICogQHN1bW1hcnkgR2V0cyB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY2FzaGZsb3dSZXBvcnRHZXQoY2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jYXNoZmxvd19yZXBvcnQvaW5zaWdodHMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgaW5zaWdodHMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gSW5zaWdodHMgYXJlIG9ubHkgY2FsY3VsYXRlZCBvbiBjcmVkaXQgYW5kIGRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHN1bW1hcnkgR2V0cyBpbnNpZ2h0cyBkYXRhIGluIENhc2hmbG93IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0KGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCBpcyBhbiBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbSAoZ2l2ZW4gYW4gYGl0ZW1faWRgKS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgQ2FzaGZsb3cgUmVwb3J0IGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiAgQWZ0ZXIgY2FsbGluZyBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCBhbGVydGluZyBjbGllbnRzIHRoYXQgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGNhbiB0aGVuIGJlIGluZ2VzdGVkIHZpYSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIG9yIHRoZSB3ZWJob29rIHdpbGwgY29udGFpbiBhbiBlcnJvciBjb2RlIGluZm9ybWluZyB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmVmcmVzaGluZyB0cmFuc2FjdGlvbnMgZGF0YS4gIE5vdGUgdGhhdCB0aGUgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKS4gSWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2QgZm9yIHJlcXVlc3RzLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YSBpbiBgY2FzaGZsb3dfcmVwb3J0YFxuICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdH0gY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNhc2hmbG93UmVwb3J0UmVmcmVzaChjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0OiBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY2FzaGZsb3dSZXBvcnRSZWZyZXNoKGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRyYW5zYWN0aW9ucyBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYGhhc19tb3JlYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBOb3RlIHRoYXQgZGF0YSBpc25cXCd0IGxpa2VseSB0byBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgY2FzaGZsb3dfcmVwb3J0YCwgb3IgaWYgaXQgd2FzblxcJ3QsIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBDQVNIRkxPV19SRVBPUlRfUkVBRFlgIHdlYmhvb2suXG4gICAgICogQHN1bW1hcnkgR2V0cyB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0KGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXQoY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGxlZ2FjeSBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byBbdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3BmYy1taWdyYXRpb24vKSBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGxlZ2FjeSBjYXRlZ29yaWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gRXh0cmVtZWx5IHJlY2VudCBldmVudHMgKG9jY3VycmluZyB3aXRoaW4gdGhlIHBhc3QgMTIgaG91cnMpIG1heSBub3QgYmUgYXZhaWxhYmxlIHZpYSB0aGlzIGVuZHBvaW50LiBVcCB0byB0aHJlZSB5ZWFycyBvZiBjb25zZW50IGxvZ3Mgd2lsbCBiZSBhdmFpbGFibGUgdmlhIHRoZSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7Q29uc2VudEV2ZW50c0dldFJlcXVlc3R9IGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdDogQ29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQREYgUmVwb3J0c1xuICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Q6IENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgaW5zaWdodHMsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfY2FzaGZsb3dfaW5zaWdodHNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCB0byByZWZyZXNoIGRhdGEgaW4gYW4gZXhpc3RpbmcgcmVwb3J0LiBBIENvbnN1bWVyIFJlcG9ydCB3aWxsIGxhc3QgZm9yIDI0IGhvdXJzIGJlZm9yZSBleHBpcmluZzsgeW91IHNob3VsZCBjYWxsIGFueSBgL2dldGAgZW5kcG9pbnRzIG9uIHRoZSByZXBvcnQgYmVmb3JlIGl0IGV4cGlyZXMuIElmIGEgcmVwb3J0IGV4cGlyZXMsIHlvdSBjYW4gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBhZ2FpbiB0byByZS1nZW5lcmF0ZSBpdCBhbmQgcmVmcmVzaCB0aGUgZGF0YSBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggb3IgY3JlYXRlIGEgQ29uc3VtZXIgUmVwb3J0XG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnRDcmVhdGUoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgTk9URTogVGhlIGZvbGxvd2luZyBzY2hlbWEgd2FzIHVwZGF0ZWQgaW4gQXByaWwgMjAyNiB0byByZWZsZWN0IHRoZSByZXNwb25zZSB3aGVuIHRoZSBwcm92aWRlZCB2ZXJzaW9uIGlzIFxcXCJJSTJcXFwiLiBQbGVhc2Ugc2VlIFt0aGlzIGRvY3VtZW50XShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNoZWFkaW5nPWgucnVkYW16aW51czJpKSBmb3IgZ3VpZGFuY2Ugb24gbWlncmF0aW5nIHRvIElJMiBpZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyB0aGUgSUkxIHZlcnNpb24sIGFuZCBbdGhpcyBzZWN0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNib29rbWFyaz1pZC50ZGNjMndwazBoNjApIGZvciBhbiBleGFtcGxlIElJMSByZXNwb25zZSBhbG9uZyB3aXRoIGl0cyBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjM2Yzg1bjJpcmNxayNoZWFkaW5nPWguNzlkd3I1YzFpc3psKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTGVuZFNjb3JlIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cywgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9sZW5kX3Njb3JlYCBwcm9kdWN0IG9yIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgd2l0aCB0aGUgYGNyYV9sZW5kX3Njb3JlYCBwcm9kdWN0LCBQbGFpZCB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIExlbmRTY29yZSBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0KGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXQoY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgcHJvZHVjdCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbmV0d29ya19pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgUGxhaWQgd2lsbCBnZW5lcmF0ZSB0aGUgYXR0cmlidXRlcyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgbmV0d29yayBhdHRyaWJ1dGVzIGZvciB0aGUgdXNlclxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gcGFydG5lcnNcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgUGFydG5lciBJbnNpZ2h0cyBvciBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGJlIGluY2x1ZGVkIGluIHRoZSBQREYgYXMgd2VsbCwgdXNlIHRoZSBgYWRkLW9uc2AgZmllbGQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBDb25zdW1lciBSZXBvcnQgYXMgYSBQREZcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBob21lIGxlbmRpbmcgcmVwb3J0cyBmb3IgYSB1c2VyLiBUbyBvYnRhaW4gYSBWb0Egb3IgRW1wbG95bWVudCBSZWZyZXNoIHJlcG9ydCwgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYGNyYV9iYXNlX3JlcG9ydGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHZhcmlvdXMgaG9tZSBsZW5kaW5nIHJlcG9ydHMgZm9yIGEgdXNlclxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0KGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdCwgc3BlY2lmaWNhbGx5IGZvcm1hdHRlZCBmb3IgSG9tZSBMZW5kaW5nIHZlcmlmaWNhdGlvbiB1c2UgY2FzZXMuIEJlZm9yZSBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGVuc3VyZSB0aGF0IHlvdVxcJ3ZlIGNyZWF0ZWQgYSBWT0EgcmVwb3J0IHRocm91Z2ggTGluayBvciB0aGUgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQsIGFuZCBoYXZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2suICBUaGUgcmVzcG9uc2UgdG8gYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFZlcmlmaWNhdGlvbiBQREZcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2NyZWRpdF9wcm9maWxlL3JlcG9ydC9nZXRgIHJldHJpZXZlcyBhIGNyZWRpdCBwcm9maWxlIHJlcG9ydCBmb3IgYSB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBjcmVkaXQgcHJvZmlsZSByZXBvcnQgZm9yIGEgdXNlclxuICAgICAqIEBwYXJhbSB7Q3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldChjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdDogQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0KGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnNcbiAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXIoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50c1xuICAgICAqIEBwYXJhbSB7Q1JBTG9hbnNSZWdpc3RlclJlcXVlc3R9IGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdDogQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVyIGEgbGlzdCBvZiBsb2Fuc1xuICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zVW5yZWdpc3RlcihjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0OiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBsb2FuIGRhdGFcbiAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVXBkYXRlUmVxdWVzdH0gY3JhTG9hbnNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIENhc2ggRmxvdyBVcGRhdGVzIHJlcG9ydCBieSBwYXNzaW5nIGluIHRoZSBgdXNlcl9pZGAgcmVmZXJyZWQgdG8gaW4gdGhlIHdlYmhvb2sgeW91IHJlY2VpdmVkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIHRvIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIGxpbmtlZCBDUkEgSXRlbSwgd2hpY2ggYXJlIHVwZGF0ZWQgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSAoYmVzdC1lZmZvcnQpLiBJbiB0aGUgY3VycmVudCBDYXNoIEZsb3cgVXBkYXRlcyBiZXRhIGV4cGVyaWVuY2UsIG9ubHkgb25lIEl0ZW0gcGVyIHVzZXIgbWF5IGJlIHN1YnNjcmliZWQgZm9yIG1vbml0b3JpbmcgdXBkYXRlcy5cbiAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byB1bnN1YnNjcmliZSBmcm9tIHByZXZpb3VzbHkgc3Vic2NyaWJlZCBNb25pdG9yaW5nIEluc2lnaHRzLlxuICAgICAqIEBzdW1tYXJ5IFVuc3Vic2NyaWJlIGZyb20gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIGNyZWF0ZSBhbiBBdWRpdCBDb3B5IHRva2VuIG9mIGFuIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCB0byBzaGFyZSB3aXRoIGEgcGFydGljaXBhdGluZyBHb3Zlcm5tZW50LVNwb25zb3JlZCBFbnRlcnByaXNlIChHU0UpIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiBGYW5uaWUgTWFlXFwncyBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSBvciB1dGlsaXplIEZyZWRkaWUgTWFjXFwncyBMb2FuIFByb2R1Y3QgQWR2aXNvcsKuIChMUEHCrikgQXNzZXQgYW5kIEluY29tZSBNb2RlbGVyIChBSU0pLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIEF1ZGl0IENvcHkgVG9rZW4gYnkgYWRkaW5nIHRoZSByZXBvcnQgdG9rZW5zIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQgdG8gdGhlIGBhdWRpdF9jb3B5X3Rva2VuYC4gSWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gYWxyZWFkeSBjb250YWlucyBhIHJlcG9ydCBvZiBhIGNlcnRhaW4gdHlwZSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b2tlbiBwcm92aWRlZCBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgYSBzcGVjaWZpZWQgdXNlciBpbiBQREYgZm9ybWF0LiAgQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgaXMgZGVwcmVjYXRlZC4gVGhlIGJhY2tlbmQgaW1wbGVtZW50YXRpb24gd2FzIHJlbW92ZWQgKHJldHVybnMgYW4gYFVuaW1wbGVtZW50ZWRgIGVycm9yIGF0IHJ1bnRpbWUpLCBhbmQgdGhlIGVuZHBvaW50IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudGVkIEFQSSBzdXJmYWNlLiBUbyByZWZyZXNoIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGV4aXN0aW5nIHVzZXIsIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZSBzbyB0aGV5IGNhbiBjb25maXJtIHRoZWlyIGluY29tZSBzb3VyY2VzLiBGb3IgYSBmdWxseSBiYWNrZW5kIHJlZnJlc2gsIG1pZ3JhdGUgdG8gQ1JBIEluY29tZSBJbnNpZ2h0cyBhbmQgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3R9IGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhYm91dCBhIHNwZWNpZmljIERhc2hib2FyZCB1c2VyIGJhc2VkIG9uIHRoZSBgZGFzaGJvYXJkX3VzZXJfaWRgIGZpZWxkLCB3aGljaCBpcyByZXR1cm5lZCBpbiB0aGUgYGF1ZGl0X3RyYWlsYCBvYmplY3Qgb2YgY2VydGFpbiBNb25pdG9yIGFuZCBCZWFjb24gZW5kcG9pbnRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyByZXZpZXdlciB3aG8gcGVyZm9ybWVkIGEgRGFzaGJvYXJkIGFjdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIERhc2hib2FyZCB1c2VyXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF1ZGl0IG9yIHRyYWNrIHRoZSBsaXN0IG9mIHJldmlld2VycyBmb3IgTW9uaXRvciwgQmVhY29uLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3RzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgRGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlkXFwncyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgZW1wbG95bWVudHMgdGhyb3VnaCBhIHVzZXIgcGF5cm9sbCB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29uc2VudCBncmFudCBieSBpdHMgaWRlbnRpZmllclxuICAgICAqIEBzdW1tYXJ5IEdldCBGRFggQ29uc2VudCBHcmFudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBmZHhDb25zZW50c0dldChjb25zZW50SWQ6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeENvbnNlbnRzR2V0KGNvbnNlbnRJZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmV2b2NhdGlvbiBoaXN0b3J5IG9mIGEgY29uc2VudCBncmFudFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEZEWCBDb25zZW50IEdyYW50IHJldm9jYXRpb24gcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBmZHhDb25zZW50c1Jldm9jYXRpb25HZXQoY29uc2VudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZHhDb25zZW50c1Jldm9jYXRpb25HZXQoY29uc2VudElkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmRzIGEgUkVWT0tFRCBzdGF0dXMgcmVjb3JkIHRvIHRoZSBuYW1lZCBjb25zZW50IGdyYW50XG4gICAgICogQHN1bW1hcnkgUmV2b2tlIEZEWCBDb25zZW50IEdyYW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnNlbnRJZCBDb25zZW50IEdyYW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGZkeENvbnNlbnRzUmV2b2tlKGNvbnNlbnRJZDogc3RyaW5nLCByZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZHhDb25zZW50c1Jldm9rZShjb25zZW50SWQsIHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkOiBzdHJpbmcsIG9BVVRIU1RBVEVJRD86IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmdldFJlY2lwaWVudChyZWNpcGllbnRJZCwgb0FVVEhTVEFURUlELCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBSZWNpcGllbnRzXG4gICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudHNcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGdldFJlY2lwaWVudHMob3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmdldFJlY2lwaWVudHMob3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YCB0byByZXRyaWV2ZSBpZGVudGl0eSBkZXRhaWxzIHdoZW4gdXNpbmcgW0lkZW50aXR5IERvY3VtZW50IFVwbG9hZF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS9pZGVudGl0eS1kb2N1bWVudC11cGxvYWQvKS5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICogQHBhcmFtIHtJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgb3IgYC9zaWduYWwvZXZhbHVhdGVgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgIGZpZWxkLiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgdHdvIGZpZWxkcyBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiBgdXNlcl9pZGAgaXMgcHJvdmlkZWQsIHRoZXJlIG11c3QgYmUgYW4gYXNzb2NpYXRlZCB1c2VyIG90aGVyd2lzZSBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgLCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICAgSWYgYHVzZXJfaWRgIGlzIG5vdCBwcm92aWRlZCwgeW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIElmIGB1c2VyX2lkYCBpcyBwcm92aWRlZCwgdXNlciBpbmZvcm1hdGlvbiBjYW4gbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuIFBsZWFzZSB1c2UgdGhlIGAvdXNlci91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB1c2VyIGRhdGEgaW5zdGVhZC4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvblxcJ3MgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnRcXCdzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGludmVzdG1lbnQgZGF0YVxuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0OiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAqIEBzdW1tYXJ5IEdldCBhbiBJc3N1ZVxuICAgICAqIEBwYXJhbSB7SXNzdWVzR2V0UmVxdWVzdH0gaXNzdWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0OiBJc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgYW4gaXNzdWUgYXNzb2NpYXRlZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOiAgYGl0ZW1faWRgLCBgbGlua19zZXNzaW9uX2lkYCBvciBMaW5rIHNlc3Npb24gYHJlcXVlc3RfaWRgLiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTZWFyY2hSZXF1ZXN0fSBpc3N1ZXNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU2VhcmNoKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIGEgdXNlclxcJ3MgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9uXFwncyBhY2Nlc3MgdG8gdGhlIFVzZXJcXCdzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaXRlbS9wcm9kdWN0cy90ZXJtaW5hdGVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdGVybWluYXRlIGFuIEl0ZW0uIE9uY2UgdGVybWluYXRlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpcyBubyBsb25nZXIgdmFsaWQsIGJpbGxpbmcgZm9yIHRoZSBJdGVtXFwncyBwcm9kdWN0cyBpcyBlbmRlZCwgYW5kIHJlbGV2YW50IHdlYmhvb2tzIGFyZSBmaXJlZC4gIGAvaXRlbS9wcm9kdWN0cy90ZXJtaW5hdGVgIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gb2ZmYm9hcmQgdXNlcnMgb3IgZGlzY29ubmVjdCBhY2NvdW50cyBsaW5rZWQgdmlhIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IFRlcm1pbmF0ZSBwcm9kdWN0cyBmb3IgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZShpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0OiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVByb2R1Y3RzVGVybWluYXRlKGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBDYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIGEgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSB3aGVuIG9mZmJvYXJkaW5nIHVzZXJzIG9yIGlmIGEgdXNlciBjaG9vc2VzIHRvIGRpc2Nvbm5lY3QgYW4gYWNjb3VudCBsaW5rZWQgdmlhIFBsYWlkLiBGb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzLCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgTGlhYmlsaXRpZXMsIGFuZCBJbnZlc3RtZW50cywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyByZXF1aXJlZCB0byBlbmQgc3Vic2NyaXB0aW9uIGJpbGxpbmcgZm9yIHRoZSBJdGVtLCB1bmxlc3MgdGhlIGVuZCB1c2VyIHJldm9rZWQgcGVybWlzc2lvbiAoZS5nLiB2aWEgW2h0dHBzOi8vbXkucGxhaWQuY29tL10oaHR0cHM6Ly9teS5wbGFpZC5jb20vKSkuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU3Vic2NyaXB0aW9uIGZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3N1YnNjcmlwdGlvbi1mZWUpLiAgT24gYSBUcmlhbCBwbGFuLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGRvZXMgbm90IGltcGFjdCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBUcmlhbCBJdGVtcyAoYmFuayBjb25uZWN0aW9ucykgeW91IGhhdmUgYXZhaWxhYmxlLiAgUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIGFjY2VzcyB0byB0aGVtIHNwZWNpZmljYWxseSB1c2luZyB0aGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyN3ZWJob29rX3VwZGF0ZV9hY2tub3dsZWRnZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgYHBheW1lbnRfaW5pdGlhdGlvbmAgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgYGxpbmtfdG9rZW5gLlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElEIGZvciBhIExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAuIEZvciBtb3N0IFBsYWlkIHByb2R1Y3RzLCB0aGUgYHB1YmxpY190b2tlbmAgaXMgc2F2ZWQgYW5kIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBmbG93LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBCeSBkZWZhdWx0LCB0aGlzIGVuZHBvaW50IHdpbGwgb25seSByZXR1cm4gY29tcGxldGUgZXZlbnQgZGF0YSBmb3IgSG9zdGVkIExpbmsgc2Vzc2lvbnMuIFRvIHVzZSBgL2xpbmsvdG9rZW4vZ2V0YCB0byByZXRyaWV2ZSBldmVudCBkYXRhIGZvciBub24tSG9zdGVkLUxpbmsgc2Vzc2lvbnMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCB0aGF0IHlvdXIgYWNjb3VudCBiZSBlbmFibGVkIGZvciBMaW5rIGV2ZW50cy4gSWYgeW91IGRvIG5vdCBoYXZlIGFuIGFjY291bnQgbWFuYWdlciwgeW91IGNhbiBzdWJtaXQgdGhpcyByZXF1ZXN0IHZpYSBhIHN1cHBvcnQgdGlja2V0LiBFbmFibGVtZW50IGZvciBMaW5rIGV2ZW50cyB3aWxsIGFsc28gY2F1c2UgeW91IHRvIHJlY2VpdmUgYWRkaXRpb25hbCB3ZWJob29rcyByZWxhdGVkIHRvIExpbmsgZXZlbnRzLCBzdWNoIGFzIHRoZSBgU0VTU0lPTl9GSU5JU0hFRGAgYW5kIGBFVkVOVFNgIHdlYmhvb2suXG4gICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9uZXR3b3JrL3N0YXR1cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgUGxhaWQgaGFzIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgc3RyZWFtbGluZWQgZXhwZXJpZW5jZSwgc3VjaCBhcyBMYXllci4gVG8gYWNjZXNzIHRoaXMgZW5kcG9pbnQsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBOb3RlOiBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBjaGVjayBmb3IgTGF5ZXIgZWxpZ2liaWxpdHkgaW4gdGhlIGZyb250ZW5kLiBgL25ldHdvcmsvc3RhdHVzL2dldGAgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY2hlY2tpbmcgTGF5ZXIgZWxpZ2liaWxpdHkgaWYgYSBmcm9udGVuZCBjaGVjayBpcyBub3QgcG9zc2libGUgZm9yIHlvdXIgdXNlIGNhc2UuIEZvciBpbnN0cnVjdGlvbnMgb24gcGVyZm9ybWluZyBhIGZyb250ZW5kIGVsaWdpYmlsaXR5IGNoZWNrLCBzZWUgdGhlIFtMYXllciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuXG4gICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL29hdXRoL2ludHJvc3BlY3RgIHJldHVybnMgbWV0YWRhdGEgYWJvdXQgYW4gYWNjZXNzIHRva2VuIG9yIHJlZnJlc2ggdG9rZW4uICBOb3RlOiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgbWV0YWRhdGEgYWJvdXQgYW4gT0F1dGggdG9rZW5cbiAgICAgKiBAcGFyYW0ge09BdXRoSW50cm9zcGVjdFJlcXVlc3R9IG9BdXRoSW50cm9zcGVjdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBvYXV0aEludHJvc3BlY3Qob0F1dGhJbnRyb3NwZWN0UmVxdWVzdDogT0F1dGhJbnRyb3NwZWN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLm9hdXRoSW50cm9zcGVjdChvQXV0aEludHJvc3BlY3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL29hdXRoL3Jldm9rZWAgcmV2b2tlcyBhbiBhY2Nlc3Mgb3IgcmVmcmVzaCB0b2tlbiwgcHJldmVudGluZyBhbnkgZnVydGhlciB1c2UuIElmIGEgcmVmcmVzaCB0b2tlbiBpcyByZXZva2VkLCBhbGwgYWNjZXNzIGFuZCByZWZyZXNoIHRva2VucyBkZXJpdmVkIGZyb20gaXQgYXJlIGFsc28gcmV2b2tlZCwgaW5jbHVkaW5nIGV4Y2hhbmdlZCB0b2tlbnMuICBOb3RlOiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXZva2UgYW4gT0F1dGggdG9rZW5cbiAgICAgKiBAcGFyYW0ge09BdXRoUmV2b2tlUmVxdWVzdH0gb0F1dGhSZXZva2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgb2F1dGhSZXZva2Uob0F1dGhSZXZva2VSZXF1ZXN0OiBPQXV0aFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5vYXV0aFJldm9rZShvQXV0aFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvb2F1dGgvdG9rZW5gIGlzc3VlcyBhbiBhY2Nlc3MgdG9rZW4gYW5kIHJlZnJlc2ggdG9rZW4gZGVwZW5kaW5nIG9uIHRoZSBgZ3JhbnRfdHlwZWAgcHJvdmlkZWQuIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBvciByZWZyZXNoIGFuIE9BdXRoIGFjY2VzcyB0b2tlblxuICAgICAqIEBwYXJhbSB7T0F1dGhUb2tlblJlcXVlc3R9IG9BdXRoVG9rZW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgb2F1dGhUb2tlbihvQXV0aFRva2VuUmVxdWVzdDogT0F1dGhUb2tlblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5vYXV0aFRva2VuKG9BdXRoVG9rZW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy4gVG8gY3JlYXRlIGVuZCBjdXN0b21lcnMsIGl0IHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgb25seSwgZXZlbiB3aGVuIGNyZWF0aW5nIFNhbmRib3ggQVBJIGtleXMuIElmIGNhbGxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgaXQgd2lsbCByZXR1cm4gYSBzYW1wbGUgcmVzcG9uc2UsIGJ1dCBubyBjdXN0b21lciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBBUEkga2V5cyB3aWxsIG5vdCBiZSB2YWxpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBmdWxsIFByb2R1Y3Rpb24uXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCYWNzIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW50XFwncyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLiAgUG9sbGluZyBmb3Igc3RhdHVzIHVwZGF0ZXMgaW4gUHJvZHVjdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQuIFJlcGVhdGVkbHkgY2FsbGluZyBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgdG8gY2hlY2sgYSBwYXltZW50XFwncyBzdGF0dXMgaXMgdW5yZWxpYWJsZSBhbmQgbWF5IHRyaWdnZXIgQVBJIHJhdGUgbGltaXRzLiBPbmx5IHRoZSBgcGF5bWVudF9zdGF0dXNfdXBkYXRlYCB3ZWJob29rIHNob3VsZCBiZSB1c2VkIHRvIHJlY2VpdmUgcmVhbC10aW1lIHN0YXR1cyB1cGRhdGVzIGluIFByb2R1Y3Rpb24uICBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiAgUHJvdmlkaW5nIGNvdW50ZXJwYXJ0eSBpbmZvcm1hdGlvbiBzdWNoIGFzIGRhdGUgb2YgYmlydGggYW5kIGFkZHJlc3MgaW5jcmVhc2VzIHRoZSBsaWtlbGlob29kIG9mIHJlZnVuZCBiZWluZyBzdWNjZXNzZnVsIHdpdGhvdXQgaHVtYW4gaW50ZXJ2ZW50aW9uLiBcbiAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudHMgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3N1cHBvcnQucGxhaWQuY29tL2hjL2VuLXVzL2FydGljbGVzLzI3ODk1ODI2OTQ3NzM1LVdoYXQtUGxhaWQtcHJvZHVjdHMtYXJlLXN1cHBvcnRlZC1pbi1lYWNoLWNvdW50cnktYW5kLXJlZ2lvbikgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdFxcJ3MgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudCBhdXRob3JpemVkIGJ5IGEgcHJvY2Vzc29yIHRva2VuLCBpbmNsdWRpbmcgYWNjb3VudCBudW1iZXJzLCBhY2NvdW50IG93bmVycywgaG9sZGluZ3MsIGFuZCBkYXRhIHByb3ZlbmFuY2UgaW5mb3JtYXRpb24uICBUbyByZWNlaXZlIEludmVzdG1lbnRzIEF1dGggd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCBhY2NvdW50IGF1dGhlbnRpY2F0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldChwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciB5b3UgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YC4gVGhpcyBoZWxwcyBpbXByb3ZlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZSBhY2N1cmFjeSBmb3IgeW91ciBhY2NvdW50IGFuZCBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGUgcnVsZSBwZXJmb3JtYW5jZSBhbmQgcnVsZSB0dW5pbmcgY2FwYWJpbGl0aWVzIGluIHRoZSBEYXNoYm9hcmQuIElmIHlvdXIgZWZmZWN0aXZlIGRlY2lzaW9uIGNoYW5nZXMgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCAoZm9yIGV4YW1wbGUsIHlvdSBpbmRpY2F0ZWQgdGhhdCB5b3UgYWNjZXB0ZWQgYSB0cmFuc2FjdGlvbiwgYnV0IGxhdGVyIG9uLCB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIHJlamVjdGVkIGl0LCBzbyBpdCB3YXMgbmV2ZXIgaW5pdGlhdGVkKSwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAsIGFzIFBsYWlkIGNhbiBpbmZlciBvdXRjb21lcyBmcm9tIHlvdXIgVHJhbnNmZXIgYWN0aXZpdHkuICBJZiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGVuZHBvaW50IHdpbGwgbm90IGltcGFjdCBzY29yZXMgKEJhbGFuY2UgZG9lcyBub3QgdXNlIHNjb3JlcyksIGJ1dCBpcyBuZWNlc3NhcnkgdG8gdmlldyBhY2N1cmF0ZSB0cmFuc2FjdGlvbiBvdXRjb21lcyBhbmQgdHVuZSBydWxlIGxvZ2ljIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHVzZXMgUnVsZXNldHMgdGhhdCBhcmUgY29uZmlndXJlZCBvbiB0aGUgZW5kIGN1c3RvbWVyXFwncyBEYXNoYm9hcmQgYW5kIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIHByb2R1Y3Qgb3IgdGhlIEJhbGFuY2UgcHJvZHVjdC4gV2hpY2ggcHJvZHVjdCBpcyB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgYHJ1bGVzZXRfa2V5YCB0aGF0IHlvdSBwcm92aWRlLiBOb3RlIHRoYXQgb25seSBjdXN0b21lci1jb25maWd1cmVkIHJ1bGVzZXRzIHdvcmsgd2l0aCB0aGlzIGVuZHBvaW50OyBhcyBhIHByb2Nlc3NvciBwYXJ0bmVyLCB5b3UgY2Fubm90IGNyZWF0ZSBvciBjb25maWd1cmUgeW91ciBvd24gcnVsZXNldHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2lnbmFsIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgaGF2ZSBoaWdoZXIgbGF0ZW5jeSBpZiBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLCBvciB3aGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQuIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJlcXVlc3QgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS4gIE5vdGUgdGhhdCB0aGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlbiBpcyBhIG9uZS10aW1lIHVzZSB0b2tlbi4gVG8gc3RvcmUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UsIHlvdSBjYW4gdXNlIGEgU3RyaXBlIGN1c3RvbWVyIG9iamVjdCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLCBvciB5b3UgY2FuIHVzZSBhIFN0cmlwZSBDdXN0b20gYWNjb3VudCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLiBUaGlzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBzaG91bGQgd29yayBpbmRlZmluaXRlbHksIHVubGVzcyB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNoYW5nZXMgb3IgdGhleSByZXZva2UgUGxhaWRcXCdzIHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGVpciBhY2NvdW50LiBTdHJpcGUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZSBiYW5rIGFjY291bnQgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZC4gSWYgeW91IGV2ZXIgbmVlZCB0byBjaGFuZ2UgdGhlIGJhbmsgYWNjb3VudCBkZXRhaWxzIHVzZWQgYnkgU3RyaXBlIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyLCBoYXZlIHRoZSB1c2VyIGdvIHRocm91Z2ggTGluayBhZ2FpbiBhbmQgY3JlYXRlIGEgbmV3IGJhbmsgYWNjb3VudCB0b2tlbiBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuICBUbyByZXZva2UgYSBiYW5rIGFjY291bnQgdG9rZW4sIHRoZSBlbnRpcmUgdW5kZXJseWluZyBhY2Nlc3MgdG9rZW4gbXVzdCBiZSByZXZva2VkIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIElmIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMsIG11bHRpcGxlIGRpZmZlcmVudCBwcm9jZXNzb3IgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIGZvciBhIHNpbmdsZSBhY2Nlc3MgdG9rZW4uIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW4gYmUgbW9kaWZpZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9zZXRgLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2VyXFwncyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZy4gZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGEgdXNlclxcJ3MgUGxhaWQgTmV0d29yayBzdGF0dXNcbiAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgYSBQcm90ZWN0IFRydXN0IEluZGV4IHNjb3JlIGZvciBhIHVzZXIuIFRoZSBtb2RlbCBzZWxlY3RlZCBkZXRlcm1pbmVzIHdoYXQgaXMgc2NvcmVkIGFuZCB3aGF0IGFkZGl0aW9uYWwgZmllbGRzIHRoZSByZXNwb25zZSBjb250YWlucy4gRm9yIGV4YW1wbGUsIGB0aS1saW5rLXNlc3Npb24tMi4wYCBzY29yZXMgYSBjb21wbGV0ZWQgTGluayBzZXNzaW9uIGZvciBmcmF1ZCByaXNrOyBgY2FzaC1hZHZhbmNlLW9uYm9hcmRpbmctMS4wYCBzY29yZXMgcmVwYXltZW50IHJpc2sgZm9yIGEgZmlyc3QtdGltZSBjYXNoIGFkdmFuY2UgYW5kIGFkZGl0aW9uYWxseSBwb3B1bGF0ZXMgcGVyLWFtb3VudC1idWNrZXQgc3Vic2NvcmVzLiBDYXNoLWFkdmFuY2UgbW9kZWxzIHJlcXVpcmUgdGhhdCB0aGUgdXNlciBoYXZlIGEgUGxhaWQgSXRlbSB3aXRoIFRyYW5zYWN0aW9ucyBlbmFibGVkLCBvciBhbiBBc3NldHMgUmVwb3J0LCBiZWZvcmUgc2NvcmluZy4gIFRoZSBlbmRwb2ludCByZXR1cm5zIEhUVFAgNDAwIHdpdGggYGVycm9yX3R5cGVgID0gYElOVkFMSURfUkVRVUVTVGAgYW5kIGBlcnJvcl9jb2RlYCA9IGBGQUlMRURfUFJFQ09ORElUSU9OYCB3aGVuIGEgcmVxdWlyZWQgcHJlY29uZGl0aW9uIGlzIG5vdCBtZXQ6IGZvciBsaW5rLXNlc3Npb24gbW9kZWxzLCB3aGVuIHRoZSBMaW5rIHNlc3Npb24gaGFzIG5vdCBjb21wbGV0ZWQ7IGZvciBjYXNoLWFkdmFuY2UgbW9kZWxzLCB3aGVuIHRoZSB1c2VyIGhhcyBub3Qgc3VjY2Vzc2Z1bGx5IGxpbmtlZCBhbnkgSXRlbS5cbiAgICAgKiBAc3VtbWFyeSBDb21wdXRlIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmVzIGFuZCBzdWJzY29yZXNcbiAgICAgKiBAcGFyYW0ge1Byb3RlY3RDb21wdXRlUmVxdWVzdH0gcHJvdGVjdENvbXB1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvdGVjdENvbXB1dGUocHJvdGVjdENvbXB1dGVSZXF1ZXN0OiBQcm90ZWN0Q29tcHV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm90ZWN0Q29tcHV0ZShwcm90ZWN0Q29tcHV0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnQgaW5jbHVkaW5nIFRydXN0IEluZGV4IHNjb3JlIGFuZCBmcmF1ZCBhdHRyaWJ1dGVzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnRcbiAgICAgKiBAcGFyYW0ge1Byb3RlY3RFdmVudEdldFJlcXVlc3R9IHByb3RlY3RFdmVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm90ZWN0RXZlbnRHZXQocHJvdGVjdEV2ZW50R2V0UmVxdWVzdDogUHJvdGVjdEV2ZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgbmV3IGV2ZW50IHRvIGVucmljaCB1c2VyIGRhdGEgYW5kIG9wdGlvbmFsbHkgZ2V0IGEgVHJ1c3QgSW5kZXggc2NvcmUgZm9yIHRoZSBldmVudC5cbiAgICAgKiBAc3VtbWFyeSBTZW5kIGEgbmV3IGV2ZW50IHRvIGVucmljaCB1c2VyIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb3RlY3RFdmVudFNlbmRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb3RlY3RFdmVudFNlbmQocHJvdGVjdEV2ZW50U2VuZFJlcXVlc3Q6IFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvdGVjdEV2ZW50U2VuZChwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgUHJvdGVjdCByZXBvcnQgdG8gZG9jdW1lbnQgZnJhdWQgaW5jaWRlbnRzLCBpbnZlc3RpZ2F0aW9uIG91dGNvbWVzLCBvciBvdGhlciByaXNrIGV2ZW50cy4gVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlcG9ydCB2YXJpb3VzIHR5cGVzIG9mIGluY2lkZW50cyBpbmNsdWRpbmcgYWNjb3VudCB0YWtlb3ZlcnMsIGlkZW50aXR5IGZyYXVkLCB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zLCBhbmQgb3RoZXIgc2VjdXJpdHkgZXZlbnRzLiBUaGUgcmVwb3J0ZWQgZGF0YSBoZWxwcyBpbXByb3ZlIGZyYXVkIGRldGVjdGlvbiBtb2RlbHMgYW5kIHByb3ZpZGVzIHZhbHVhYmxlIGZlZWRiYWNrIHRvIGVuaGFuY2UgdGhlIG92ZXJhbGwgc2VjdXJpdHkgb2YgdGhlIFBsYWlkIG5ldHdvcmsuIFJlcG9ydHMgY2FuIGJlIGNyZWF0ZWQgZm9yIGNvbmZpcm1lZCBpbmNpZGVudHMgdGhhdCBoYXZlIGJlZW4gZnVsbHkgaW52ZXN0aWdhdGVkLCBvciBmb3Igc3VzcGVjdGVkIGluY2lkZW50cyB0aGF0IHJlcXVpcmUgZnVydGhlciByZXZpZXcuIFlvdSBjYW4gYXNzb2NpYXRlIHJlcG9ydHMgd2l0aCBzcGVjaWZpYyB1c2Vycywgc2Vzc2lvbnMsIG9yIHRyYW5zYWN0aW9ucyB0byBwcm92aWRlIGNvbXByZWhlbnNpdmUgY29udGV4dCBhYm91dCB0aGUgaW5jaWRlbnQuIEVhY2ggcmVwb3J0IG11c3QgaW5jbHVkZSBgdXNlcl9pZGAsIG9yIGFuIGBpbmNpZGVudF9ldmVudGAgd2l0aCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIGlkZW50aWZpZXI6IGBsaW5rX3Nlc3Npb25faWRgLCBgaWR2X3Nlc3Npb25faWRgLCBgcHJvdGVjdF9ldmVudF9pZGAsIGBzaWduYWxfY2xpZW50X3RyYW5zYWN0aW9uX2lkYCwgb3IgYGFjY2Vzc190b2tlbmAuIENvbnRleHQgZmllbGRzIHN1Y2ggYXMgYGludGVybmFsX3JlZmVyZW5jZWAsIGB0aW1lYCwgYGFtb3VudGAsIGFuZCBgYmFua19hY2NvdW50YCBkbyBub3Qgc2F0aXNmeSB0aGlzIGlkZW50aWZpZXIgcmVxdWlyZW1lbnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgUHJvdGVjdCByZXBvcnRcbiAgICAgKiBAcGFyYW0ge1Byb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0fSBwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb3RlY3RSZXBvcnRDcmVhdGUocHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3Q6IFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvdGVjdFJlcG9ydENyZWF0ZShwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gZ2V0IGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBhcyBpdCByZWxhdGVzIHRvIHRoZWlyIGZyYXVkIHByb2ZpbGUgd2l0aCBQcm90ZWN0LlxuICAgICAqIEBzdW1tYXJ5IEdldCBQcm90ZWN0IHVzZXIgaW5zaWdodHNcbiAgICAgKiBAcGFyYW0ge1Byb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSBwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb3RlY3RVc2VySW5zaWdodHNHZXQocHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvdGVjdFVzZXJJbnNpZ2h0c0dldChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9jcmEvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoIEZsb3cgVXBkYXRlcyAoTW9uaXRvcmluZykgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzXG4gICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0OiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvaXRlbS9hcHBsaWNhdGlvbi9zZWVkYCBjcmVhdGVzIGEgdGVzdCBjb25uZWN0ZWQgYXBwbGljYXRpb24gb24gYW4gZXhpc3RpbmcgUGVybWlzc2lvbnMgTWFuYWdlciBJdGVtXFwncyBsb2dpbi4gVGhlIHNlZWRlZCBhcHBsaWNhdGlvbiB3aWxsIGFwcGVhciBpbiBzdWJzZXF1ZW50IGNhbGxzIHRvIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YC4gIFRoZSBgYWNjZXNzX3Rva2VuYCBtdXN0IGJlbG9uZyB0byBhIFBlcm1pc3Npb25zIE1hbmFnZXIgSXRlbSBjcmVhdGVkIHZpYSBgL2l0ZW0vaW1wb3J0YCBpbiBTYW5kYm94LiBUaGUgYGFwcGxpY2F0aW9uX2lkYCBpZGVudGlmaWVzIHRoZSBhcHBsaWNhdGlvbiB0byBzZWVkIGFzIGEgY29ubmVjdGVkIGFwcC4gVG8gZGlzY29ubmVjdCBhIHNlZWRlZCBhcHBsaWNhdGlvbiwgdXNlIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgLlxuICAgICAqIEBzdW1tYXJ5IFNlZWQgYSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgUGVybWlzc2lvbnMgTWFuYWdlciBzYW5kYm94IGl0ZW1cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdH0gc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWQoc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0OiBTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZChzYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIHNpbXVsYXRpbmcgYSBkZWZhdWx0IHVwZGF0ZSBldmVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdCBhcyBzcGVjaWZpZWQgd2l0aCB0aGUgYHdlYmhvb2tfdHlwZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gVmFsaWQgU2FuZGJveCBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgdHlwZXMgaW5jbHVkZTogYEFVVEhgLCBgSURFTlRJVFlgLCBgVFJBTlNBQ1RJT05TYCwgYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2AsIGBMSUFCSUxJVElFU2AsIGBIT0xESU5HU2AuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIHByb2R1Y3QsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IEZpcmVkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgYWNjb3VudCBpcyBhdmFpbGFibGUgb24gdGhlIEl0ZW0gYW5kIHlvdSBjYW4gbGF1bmNoIHVwZGF0ZSBtb2RlIHRvIHJlcXVlc3QgYWNjZXNzIHRvIGl0LiAgYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmA6IEZpcmVkIHdoZW4gYSBnaXZlbiBTYW1lLURheSBNaWNyby1kZXBvc2l0IEl0ZW0gaXMgdmVyaWZpZWQgdmlhIFNNUyB2ZXJpZmljYXRpb24uICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBQRU5ESU5HX0RJU0NPTk5FQ1RgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2lsbCBzdG9wIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlIChlLmcuIGR1ZSB0byBhIHBsYW5uZWQgYmFuayBtaWdyYXRpb24pIGFuZCBtdXN0IGJlIHNlbnQgdGhyb3VnaCB1cGRhdGUgbW9kZSB0byBjb250aW51ZSB3b3JraW5nLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25zXFwnIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgeW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT0F1dGggaW5zdGl0dXRpb25cbiAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9BdXRoIGluc3RpdHV0aW9uXG4gICAgICogQHBhcmFtIHtTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3R9IHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgdmFyaW91cyBwYXltZW50IGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVGhpcyBlbmRwb2ludCB3aWxsIHRyaWdnZXIgdGhlIGNvcnJlc3BvbmRpbmcgcGF5bWVudCBzdGF0dXMgd2ViaG9vay5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHJvY2Vzc29yX3Rva2VuYCBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElEIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHJvY2Vzc29yX3Rva2VuYCBjb3JyZXNwb25kcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiB1c2UgdGhpcyBgcHJvY2Vzc29yX3Rva2VuYCB3aXRoIHRoZSBgL3Byb2Nlc3Nvci9gIEFQSSBlbmRwb2ludHMgaW4gU2FuZGJveC4gWW91IGNhbiBhbHNvIHVzZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YSwgb3Igd2l0aCBQbGFpZFxcJ3MgW3ByZS1wb3B1bGF0ZWQgU2FuZGJveCB0ZXN0IGFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdGVzdC1jcmVkZW50aWFscy8pLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zYWN0aW9ucy9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBuZXcgdHJhbnNhY3Rpb25zIGZvciBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCB1cCB0byAxMCB0cmFuc2FjdGlvbnMgdG8gYW55IEl0ZW0gYXQgYSB0aW1lLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggSXRlbXMgdGhhdCB3ZXJlIGNyZWF0ZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgdXNpbmcgdGhlIGB1c2VyX3RyYW5zYWN0aW9uc19keW5hbWljYCB0ZXN0IHVzZXIuIFlvdSBjYW4gdXNlIHRoaXMgdG8gYWRkIHRyYW5zYWN0aW9ucyB0byB0ZXN0IHRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludHMuICBDdXN0b20gdHJhbnNhY3Rpb25zIGFyZSBvbmx5IGFwcGxpZWQgdG8gdGhlIGRlcG9zaXRvcnkgYWNjb3VudC4gU3VwcG9ydCBmb3IgcGVyLWFjY291bnQgdGFyZ2V0aW5nIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBzYW5kYm94IHRyYW5zYWN0aW9uc1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZShzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlKHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luL2AgZnVuY3Rpb25zIHRoZSBzYW1lIGFzIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgYnV0IHdpbGwgbW9kaWZ5IEl0ZW1zIHJlbGF0ZWQgdG8gYSBVc2VyLiBUaGlzIGVuZHBvaW50IGZvcmNlcyBlYWNoIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmAsIHlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBpdGVtKHMpIGZvciBhIFNhbmRib3ggVXNlciBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zZXNzaW9uL3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciBMYXllci4gVGhlIHJldHVybmVkIExpbmsgdG9rZW4gaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyB0aGUgTGluayBTREsuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIExheWVyXG4gICAgICogQHBhcmFtIHtTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0fSBzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2Vzc2lvblRva2VuQ3JlYXRlKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3Q6IFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zZXNzaW9uVG9rZW5DcmVhdGUoc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgeW91IGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLiBUaGlzIGhlbHBzIGltcHJvdmUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGFjY3VyYWN5IGZvciB5b3VyIGFjY291bnQgYW5kIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoZSBydWxlIHBlcmZvcm1hbmNlIGFuZCBydWxlIHR1bmluZyBjYXBhYmlsaXRpZXMgaW4gdGhlIERhc2hib2FyZC4gSWYgeW91ciBlZmZlY3RpdmUgZGVjaXNpb24gY2hhbmdlcyBhZnRlciBjYWxsaW5nIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCwgYXMgUGxhaWQgY2FuIGluZmVyIG91dGNvbWVzIGZyb20geW91ciBUcmFuc2ZlciBhY3Rpdml0eS4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgQmVmb3JlIHVzaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIHJ1bGVzZXRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pIGluIHRoZSBEYXNoYm9hcmQgdW5kZXIgWyoqU2lnbmFsLT5SdWxlcyoqXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc2lnbmFsL3Jpc2stcHJvZmlsZXMpLiAgYC9zaWduYWwvZXZhbHVhdGVgIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgb3IgdGhlIEJhbGFuY2UgcHJvZHVjdC4gV2hpY2ggcHJvZHVjdCBpcyB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgYHJ1bGVzZXRfa2V5YCB0aGF0IHlvdSBwcm92aWRlLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IGhhdmUgaGlnaGVyIGxhdGVuY3kgd2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXF1ZXN0IGRhdGEuIEJhbGFuY2Utb25seSBydWxlc2V0cyBtYXkgaGF2ZSBsYXRlbmN5IG9mIHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhbiBJdGVtIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzIHVzZWQgdG8gZGV2ZWxvcCBhIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gVGhpcyBzaG91bGQgYmUgZG9uZSBvbiBJdGVtcyB3aGVyZSBgc2lnbmFsYCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCB0aGUgaW5pdGlhbCBjYWxsIHRvIGAvc2lnbmFsL2V2YWx1YXRlYCBvbiB0aGF0IEl0ZW0gd2lsbCBiZSBsZXNzIGFjY3VyYXRlLCBiZWNhdXNlIFBsYWlkIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gbGVzcyBkYXRhIGZvciBjb21wdXRpbmcgdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHlvdXIgaW50ZWdyYXRpb24gaXMgcHVyZWx5IEJhbGFuY2Utb25seSwgdGhpcyBlbmRwb2ludCB3aWxsIGhhdmUgbm8gZWZmZWN0LCBhcyBCYWxhbmNlLW9ubHkgcnVsZXNldHMgZG8gbm90IGNhbGN1bGF0ZSBhIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3Jlc1xuICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZHMgaW50byB5b3VyIHNjb3JlcyBhbmQgdHVuZSBydWxlIGxvZ2ljLiBJZiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGVuZHBvaW50IHdpbGwgbm90IGltcGFjdCBzY29yZXMgKGFzIEJhbGFuY2UgZG9lcyBub3QgdXNlIHNjb3JlcyksIGJ1dCBpcyBuZWNlc3NhcnkgdG8gdmlldyBhY2N1cmF0ZSB0cmFuc2FjdGlvbiBvdXRjb21lcyBhbmQgdHVuZSBydWxlIGxvZ2ljIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9zaWduYWwvc2NoZWR1bGVgIHRvIHNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24uXG4gICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsU2NoZWR1bGVSZXF1ZXN0fSBzaWduYWxTY2hlZHVsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxTY2hlZHVsZShzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBFbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlclxcJ3MgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgdG8gcmVtb3ZlIGEgdHJhbnNhY3Rpb24gcnVsZS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC90cmFuc2FjdGlvbnMvc3luY2AsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBpbnRlZ3JhdGlvbiBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBhbiBleGlzdGluZyBpbnRlZ3JhdGlvbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZy4gZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIEEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCB0byBjcmVhdGUgYSB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gVGhlIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gd2lsbCBleHBpcmUgaWYgbm90IHVzZWQgYWZ0ZXIgb25lIGhvdXIuIChZb3UgY2FuIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGF1dGhvcml6YXRpb24gbGlmZXRpbWUuKSAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBhZGRpdGlvbmFsIHVzZXIgaW5wdXQgaXMgbmVlZGVkLCB1c3VhbGx5IHRvIGZpeCBhIGJyb2tlbiBiYW5rIGNvbm5lY3Rpb24sIGJlZm9yZSBQbGFpZCBjYW4gcHJvcGVybHkgYXNzZXNzIHRoZSByaXNrLiBZb3UgbmVlZCB0byBsYXVuY2ggTGluayBpbiB1cGRhdGUgbW9kZSB0byBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgdXNlciBhY3Rpb24uIFdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCB0byBnZXQgYSBuZXcgTGluayB0b2tlbiwgaW5zdGVhZCBvZiBwcm92aWRpbmcgYGFjY2Vzc190b2tlbmAgaW4gdGhlIHJlcXVlc3QsIHlvdSBzaG91bGQgc2V0IFtgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNmZXItYXV0aG9yaXphdGlvbi1pZCkgYXMgdGhlIGBhdXRob3JpemF0aW9uLmlkYC4gQWZ0ZXIgdGhlIExpbmsgZmxvdyBpcyBjb21wbGV0ZWQsIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbi4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUtRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBnZXQgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBvZiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYW4gYWNjb3VudCB0byBiZSB1c2VkIHdpdGggVHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgd29ya3Mgb24gYWxsIFRyYW5zZmVyLWNhcGFibGUgSXRlbXMsIGluY2x1ZGluZyB0aG9zZSBjcmVhdGVkIGJ5IGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IGlzIHJldHJ5YWJsZSBhbmQgaWRlbXBvdGVudDsgaWYgYSB0cmFuc2ZlciB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgaXQgd2lsbCByZXR1cm4gdGhlIHRyYW5zZmVyIGRldGFpbHMgd2l0aG91dCBjcmVhdGluZyBhIG5ldyB0cmFuc2Zlci4gQSB0cmFuc2ZlciBtYXkgc3RpbGwgYmUgY3JlYXRlZCBpZiBhIDUwMCBlcnJvciBpcyByZXR1cm5lZDsgdG8gZGV0ZWN0IHRoaXMgc2NlbmFyaW8sIHVzZSBbVHJhbnNmZXIgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3JlY29uY2lsaW5nLXRyYW5zZmVycy8pLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW91XFwnbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIGBtdWx0aXBhcnQvZm9ybS1kYXRhYC4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgNTAwIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGxlZGdlcnMsIGlmIHlvdSBoYXZlIG11bHRpcGxlLiBJZiB5b3VcXCdyZSBhIHBsYXRmb3JtLCB5b3UgY2FuIG1vdmUgZnVuZHMgYmV0d2VlbiBvbmUgb2YgeW91ciBsZWRnZXJzIGFuZCBvbmUgb2YgeW91ciBjdXN0b21lclxcJ3MgbGVkZ2VyLlxuICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIGxlZGdlciBldmVudHMgZm9yIGEgc3BlY2lmaWMgbGVkZ2VyIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBsZWRnZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0KHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJFdmVudExpc3QodHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy4gIEluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCB0aGlzIGVuZHBvaW50IHJldHVybnMgc3RhdGljIHBsYWNlaG9sZGVyIHZhbHVlcyByYXRoZXIgdGhhbiBtZXRyaWNzIGNvbXB1dGVkIGZyb20geW91ciBTYW5kYm94IHRyYW5zZmVyIGFjdGl2aXR5LlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIHByZXZpb3VzbHktdmVyaWZpZWQgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyIG9yIFtzdXBwb3J0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydCkuXG4gICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IGZ1bmRpbmcgYWNjb3VudCBmb3IgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IGZ1bmRpbmcgYWNjb3VudCBmb3IgYW4gb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIHN1Ym1pdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYXRvciB5b3UgYXJlIG9uYm9hcmRpbmcsIGluY2x1ZGluZyB0aGUgb3JpZ2luYXRvclxcJ3MgYWdyZWVtZW50IHRvIHRoZSByZXF1aXJlZCBsZWdhbCB0ZXJtcy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gb3JpZ2luYXRvciBmb3IgVHJhbnNmZXIgZm9yIFBsYXRmb3JtcyBjdXN0b21lcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3IgKGUuZy4gYmVuZWZpY2lhbCBvd25lciBvciBjb250cm9sIHBlcnNvbikgYW5kIG9wdGlvbmFsbHkgc3VibWl0IHBlcnNvbmFsIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGVtLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgYWRkaXRpb25hbCBvbmJvYXJkaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVlZGVkIGJ5IFBsYWlkIHRvIGFwcHJvdmUgb3IgZGVjbGluZSB0aGUgb3JpZ2luYXRvci4gU2VlIFtSZXF1aXJlbWVudCB0eXBlIHNjaGVtYSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFORVFrVEQwc1ZLNTBpQVFpNnhIaWdyZXhEVXhaNFF4WHFTRWZWX0ZGVGlVLykgZm9yIGEgbGlzdCBvZiByZXF1aXJlbWVudCB0eXBlcyBhbmQgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBhZGRpdGlvbmFsIG9uYm9hcmRpbmcgaW5mb3JtYXRpb24gb24gYmVoYWxmIG9mIGFuIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlkXFwncyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgVHJhbnNmZXIgZm9yIFBsYXRmb3JtcyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuICBBIHJlZnVuZCBjYW4gc3RpbGwgYmUgaXNzdWVkIGV2ZW4gaWYgdGhlIEl0ZW1cXCdzIGBhY2Nlc3NfdG9rZW5gIGlzIG5vIGxvbmdlciB2YWxpZCAoZS5nLiBpZiB0aGUgdXNlciByZXZva2VkIE9BdXRoIGNvbnNlbnQgb3IgdGhlIEl0ZW0gd2FzIGRlbGV0ZWQgdmlhIGAvaXRlbS9yZW1vdmVgKSwgYXMgbG9uZyBhcyB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgcGFpciB1c2VkIHRvIG1ha2UgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGlzIHN0aWxsIHZhbGlkLiBBIHJlZnVuZCBjYW5ub3QgYmUgaXNzdWVkIGlmIHRoZSBJdGVtIGhhcyBhbiBbaW52YWxpZGF0ZWQgVEFOXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLCB3aGljaCBjYW4gb2NjdXIgYXQgQ2hhc2Ugb3IgUE5DLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3Mgc2VuZGluZyBjbGllbnQtc3BlY2lmaWMgZXZlbnRzIHJlbGF0ZWQgdG8gTGF5ZXIgc2Vzc2lvbnMgZm9yIGFuYWx5dGljcyBhbmQgdHJhY2tpbmcgcHVycG9zZXMuXG4gICAgICogQHN1bW1hcnkgU2VuZCBVc2VyIEFjY291bnQgU2Vzc2lvbiBFdmVudFxuICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZCh1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kKHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB1c2VyIHBlcm1pc3Npb25lZCBhY2NvdW50IGRhdGEsIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLCBmb3IgdXNlIHdpdGggW1BsYWlkIExheWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyKS4gTm90ZSB0aGF0IGVuZCB1c2VycyBhcmUgcGVybWl0dGVkIHRvIGVkaXQgdGhlIHByZWZpbGxlZCBpZGVudGl0eSBkYXRhIGluIHRoZSBMaW5rIGZsb3cgYmVmb3JlIHNoYXJpbmcgaXQgd2l0aCB5b3U7IHlvdSBzaG91bGQgdHJlYXQgYW55IGlkZW50aXR5IGRhdGEgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcyB1c2VyLXN1Ym1pdHRlZCwgdW52ZXJpZmllZCBkYXRhLiBGb3IgYSB2ZXJpZmljYXRpb24gbGF5ZXIsIHlvdSBjYW4gYWRkIFtJZGVudGl0eSBWZXJpZmljYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uLykgdG8geW91ciBmbG93LCBvciBjaGVjayB0aGUgc3VibWl0dGVkIGlkZW50aXR5IGRhdGEgYWdhaW5zdCBiYW5rIGFjY291bnQgZGF0YSBmcm9tIGxpbmtlZCBhY2NvdW50cyB1c2luZyBbSWRlbnRpdHkgTWF0Y2hdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvI2lkZW50aXR5LW1hdGNoKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgKiBAcGFyYW0ge1VzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3R9IHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgUGxhaWQgcHJvZHVjdHMgYW5kIGZsb3dzIHRoYXQgdXNlIHRoZSB1c2VyIG9iamVjdCwgYC91c2VyL2NyZWF0ZWAgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBtdXN0IGNhbGwgdGhpcyBlbmRwb2ludCBiZWZvcmUgY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpZiB5b3UgYXJlIHVzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nOiBQbGFpZCBDaGVjaywgSW5jb21lIFZlcmlmaWNhdGlvbiwgTXVsdGktSXRlbSBMaW5rLCBvciBQbGFpZCBQcm90ZWN0IChJZGVudGl0eSkuIElmIHlvdSBhcmUgdXNpbmcgUGxhaWQgUHJvdGVjdCBMaW5rIHNlc3Npb24gc2NvcmluZywgeW91IGRvIG5vdCBuZWVkIHRvIGNhbGwgYC91c2VyL2NyZWF0ZWAgZmlyc3Q7IFBsYWlkIHdpbGwgcmVzb2x2ZSBvciBjcmVhdGUgdGhlIHVzZXIgd2hlbiBgdXNlci5jbGllbnRfdXNlcl9pZGAgaXMgcHJvdmlkZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIEZvciBjdXN0b21lcnMgd2hvIGJlZ2FuIHVzaW5nIHRoaXMgZW5kcG9pbnQgb24gb3IgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUsIHRoaXMgZW5kcG9pbnQgdGFrZXMgYSBgY2xpZW50X3VzZXJfaWRgIGFuZCBhbiBgaWRlbnRpdHlgIG9iamVjdCBhbmQgd2lsbCByZXR1cm4gYSBgdXNlcl9pZGAuIEZvciBjdXN0b21lcnMgd2hvIGJlZ2FuIHVzaW5nIGl0IGJlZm9yZSB0aGF0IGRhdGUsIHRoZSBlbmRwb2ludCB0YWtlcyBhIGBjbGllbnRfdXNlcl9pZGAgYW5kIGEgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgYW5kIHdpbGwgcmV0dXJuIGEgYHVzZXJfdG9rZW5gIGFuZCBgdXNlcl9pZGAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS4gSW4gb3JkZXIgdG8gY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGZvciBhIHVzZXIsIHRoZSBgaWRlbnRpdHlgIChuZXcpIG9yIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgKGxlZ2FjeSkgb2JqZWN0IG11c3QgYmUgcHJlc2VudC4gSWYgaXQgaXMgbm90IHByb3ZpZGVkIGR1cmluZyB0aGUgYC91c2VyL2NyZWF0ZWAgY2FsbCwgaXQgY2FuIGJlIGFkZGVkIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuICAgSW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIHRoZSBmb2xsb3dpbmcgYGlkZW50aXR5YCBmaWVsZHMsIGF0IG1pbmltdW0sIGFyZSByZXF1aXJlZCBhbmQgbXVzdCBiZSBub24tZW1wdHk6IGBuYW1lYCwgYGRhdGVfb2ZfYmlydGhgLCBgZW1haWxzYCwgYHBob25lX251bWJlcnNgLCBhbmQgYGFkZHJlc3Nlc2AsICh3aXRoIGF0IGxlYXN0IG9uZSBlbWFpbCwgcGhvbmUgbnVtYmVyLCBhbmQgYWRkcmVzcyBkZXNpZ25hdGVkIGFzIGBwcmltYXJ5YCkuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiBJZiBjcmVhdGluZyBhIHJlcG9ydCBmb3Igc2hhcmluZyB3aXRoIGEgR1NFIHN1Y2ggYXMgRmFubmllIG9yIEZyZWRkaWUsIHRoZSB1c2VyXFwncyBmdWxsIFNTTiBtdXN0IGJlIHByb3ZpZGVkIHZpYSB0aGUgYGlkX251bWJlcnNgIGZpZWxkLiBQcm92aWRpbmcgYXQgbGVhc3QgYSBwYXJ0aWFsIFNTTiBpcyBhbHNvIHN0cm9uZ2x5IHJlY29tbWVuZGVkIGZvciBhbGwgdXNlIGNhc2VzLCBzaW5jZSBpdCBpbXByb3ZlcyB0aGUgYWNjdXJhY3kgb2YgbWF0Y2hpbmcgdXNlciByZWNvcmRzIGR1cmluZyBjb21wbGlhbmNlIHByb2Nlc3NlcyBzdWNoIGFzIGZpbGUgZGlzY2xvc3VyZSwgZGlzcHV0ZSwgb3Igc2VjdXJpdHkgZnJlZXplIHJlcXVlc3RzLiAgIFdoZW4gdXNpbmcgUGxhaWQgUHJvdGVjdCwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHByb3ZpZGUgYW4gYGlkZW50aXR5YCBvYmplY3QgdG8gYmV0dGVyIGlkZW50aWZ5IGFuZCBibG9jayBmcmF1ZCBhY3Jvc3MgeW91ciBMaW5rIHNlc3Npb25zLiAgIFBsYWlkIHdpbGwgbm9ybWFsaXplIGlkZW50aXR5IGZpZWxkcyBiZWZvcmUgc3RvcmluZyB0aGVtIGFuZCB1dGlsaXplIHRoZSBzYW1lIGlkZW50aXR5IGFjcm9zcyBkaWZmZXJlbnQgdXNlci1iYXNlZCBwcm9kdWN0cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIEZpbmFuY2lhbCBJbnNpZ2h0cyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyB0aGUgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgYW5kIExpYWJpbGl0aWVzIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBUcmFuc2FjdGlvbnMgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB1c2VyIGl0ZW1zIGZvciBGaW5hbmNpYWwtSW5zaWdodHMgYnVuZGxlXG4gICAgICogQHBhcmFtIHtVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0fSB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckZpbmFuY2lhbERhdGFSZWZyZXNoKHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3Q6IFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyRmluYW5jaWFsRGF0YVJlZnJlc2godXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHVzZXIgZGV0YWlscyB1c2luZyBhIGB1c2VyX2lkYC4gVGhpcyBlbmRwb2ludCBvbmx5IHN1cHBvcnRzIHVzZXJzIHRoYXQgd2VyZSBjcmVhdGVkIG9uIHRoZSBuZXcgdXNlciBBUEkgZmxvdywgd2l0aG91dCBhIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHVzZXIgaWRlbnRpdHkgYW5kIGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtVc2VyR2V0UmVxdWVzdH0gdXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyR2V0KHVzZXJHZXRSZXF1ZXN0OiBVc2VyR2V0UmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyR2V0KHVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyBjdXN0b21lcnMgdG8gZXhwbGljaXRseSBwdXJnZSBpZGVudGl0eS9QSUkgZGF0YSBwcm92aWRlZCB0byBQbGFpZCBmb3IgYSBnaXZlbiB1c2VyLiBUaGlzIGlzIG5vdCBleHBvc2VkIHRvIGN1c3RvbWVycyBieSBkZWZhdWx0LCBhcyBpdCBpcyBtZWFudCBmb3Igc3BlY2lhbCBzY2VuYXJpb3Mgb3IgcmVxdWVzdHMsIGJ1dCBQbGFpZCBpcyBvYmxpZ2F0ZWQgdG8gZW5hYmxlIGN1c3RvbWVycyB0byBkZWxldGUgUElJIHByb3ZpZGVkIHRvIHVzLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge1VzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3R9IHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySWRlbnRpdHlSZW1vdmUodXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdDogVXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VySWRlbnRpdHlSZW1vdmUodXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlcyBJdGVtcyB0byB0aGUgdGFyZ2V0IHVzZXIuIElmIGFuIEl0ZW0gaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGFub3RoZXIgdXNlciwgdGhlIEl0ZW0gd2lsbCBiZSBkaXNhc3NvY2lhdGVkIHdpdGggdGhlIGV4aXN0aW5nIHVzZXIgYW5kIGFzc29jaWF0ZWQgdG8gdGhlIHRhcmdldCB1c2VyLiBUaGlzIG9wZXJhdGlvbiBzdXBwb3J0cyBhIG1heCBvZiAxMDAgSXRlbXMuXG4gICAgICogQHN1bW1hcnkgQXNzb2NpYXRlIEl0ZW1zIHRvIGEgVXNlclxuICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdH0gdXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJJdGVtc0Fzc29jaWF0ZSh1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0OiBVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckl0ZW1zQXNzb2NpYXRlKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLCBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuIFBsYWlkIGFzc29jaWF0ZXMgYW4gSXRlbSB3aXRoIGEgVXNlciB3aGVuIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgd2l0aGluIGEgTGluayBzZXNzaW9uIGluaXRpYWxpemVkIHdpdGggdGhhdCBgdXNlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgR2V0IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHNwZWNpZmljIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuIEl0IGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBvbiBlYWNoIEl0ZW0gaW5kaXZpZHVhbGx5LCBidXQgc3VwcG9ydHMgdXNlIGNhc2VzIChzdWNoIGFzIFBsYWlkIENoZWNrKSB3aGVyZSBhY2Nlc3MgdG9rZW5zIGFyZSBub3QgYXZhaWxhYmxlLiBBbGwgc3BlY2lmaWVkIEl0ZW1zIG11c3QgYmVsb25nIHRvIHRoZSB1c2VyIG9yIHRoZSBlbnRpcmUgb3BlcmF0aW9uIGZhaWxzLiBTaW1pbGFyIHRvIGAvaXRlbS9yZW1vdmVgLCB0aGlzIGRlbGV0ZXMgSXRlbSBwcm9kdWN0IGRhdGEgYW5kIHRlcm1pbmF0ZXMgYmlsbGluZyBvbiB0aGUgSXRlbVxcJ3MgcHJvZHVjdHMuIE9uY2UgcmVtb3ZlZCwgSXRlbXMgY2Fubm90IGJlIHJlY29ubmVjdGVkIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBMaW5rIGFnYWluLiBUaGlzIGVuZHBvaW50IGlzIG5vdCBpbnRlbmRlZCB0byByZW1vdmUgYWxsIGRhdGEgZm9yIGEgdXNlciwgYXMgaXQgd2lsbCBvbmx5IHJlbW92ZSBJdGVtcyBhbmQgbm8gb3RoZXIgZGF0YSBmb3IgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGhhcyBhbnkgdXNlci1iYXNlZCByZWN1cnJpbmcgc3Vic2NyaXB0aW9uIHByb2R1Y3RzIChGaW5hbmNpYWwgTWFuYWdlbWVudCwgUGxhaWQgUHJvdGVjdCwgb3IgQ1JBIENhc2ggRmxvdyBVcGRhdGVzKSBhbmQgaXMgZGVsZXRpbmcgdGhlaXIgYWNjb3VudCB3aXRoIHlvdXIgcHJvZHVjdCwgYWxzbyBjYWxsIGAvdXNlci9wcm9kdWN0cy90ZXJtaW5hdGVgIHRvIGVuZCB0aG9zZSBzdWJzY3JpcHRpb25zOyBwZXItSXRlbSBiaWxsaW5nIGlzIGFscmVhZHkgdGVybWluYXRlZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgYSB1c2VyIGluaXRpYXRlZCBkYXRhIGRlbGV0aW9uIHJlcXVlc3QsIHNlZSB0aGUgW0NvbnN1bWVyIFNlcnZpY2UgQ2VudGVyXShodHRwczovL3BsYWlkLmNvbS9jaGVjay9jb25zdW1lci1zZXJ2aWNlLWNlbnRlci8pIHRvIHJldm9rZSBhY2Nlc3MgdG8gZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgSXRlbXMgZnJvbSBhIFVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc1JlbW92ZVJlcXVlc3R9IHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySXRlbXNSZW1vdmUodXNlckl0ZW1zUmVtb3ZlUmVxdWVzdDogVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJJdGVtc1JlbW92ZSh1c2VySXRlbXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXJtaW5hdGVzIHVzZXItYmFzZWQgcmVjdXJyaW5nIHN1YnNjcmlwdGlvbiBidW5kbGVzIG9yIHByb2R1Y3RzIChGaW5hbmNpYWwgTWFuYWdlbWVudCwgUGxhaWQgUHJvdGVjdCwgYW5kIENSQSBDYXNoIEZsb3cgVXBkYXRlcykgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLiBBZnRlciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LCB0aGUgdXNlciB3aWxsIG5vIGxvbmdlciBiZSBiaWxsZWQgZm9yIHRoZXNlIHByb2R1Y3RzLiBGb3IgQ1JBIE1vbml0b3JpbmcsIHRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQgYnV0IGhpc3RvcmljYWwgZGF0YSByZW1haW5zIGF2YWlsYWJsZSBmb3IgZnV0dXJlIHJlcG9ydCByZXF1ZXN0cy5cbiAgICAgKiBAc3VtbWFyeSBUZXJtaW5hdGUgdXNlci1iYXNlZCBwcm9kdWN0c1xuICAgICAqIEBwYXJhbSB7VXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gdXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZSh1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0OiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlclByb2R1Y3RzVGVybWluYXRlKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIHNoYXJlZCB3aXRoIGFuZCB1c2VkIGJ5IGEgc3BlY2lmaWVkIHRoaXJkLXBhcnR5IGNsaWVudCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhyb3VnaCBzdXBwb3J0ZWQgZW5kcG9pbnRzLiAgRW5zdXJlIHlvdSBzdG9yZSB0aGUgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gIGFsb25nIHdpdGggdGhlIGB1c2VyX3Rva2VuYCBhbmQgYHRoaXJkX3BhcnR5X2NsaWVudF9pZGAsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdXNlci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgVXNlciB1c2luZyB0aGUgVHJhbnNhY3Rpb25zIGJ1bmRsZS4gVGhpcyBidW5kbGUgcmVmcmVzaGVzIG9ubHkgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGRhdGEuIFRoaXMgZW5kcG9pbnQgaXMgZm9yIGNsaWVudHMgd2hvIHVzZSB0aGUgVHJhbnNhY3Rpb25zIEluc2lnaHRzIGJ1bmRsZSBhbmQgd2FudCB0byBwcm9hY3RpdmVseSB1cGRhdGUgYWxsIGxpbmtlZCBJdGVtcyB1bmRlciBhIHVzZXIuIFRoZSByZWZyZXNoIG1heSBzdWNjZWVkIG9yIGZhaWwgb24gYSBwZXItSXRlbSBiYXNpcy4gVXNlIHRoZSBgcmVzdWx0c2AgYXJyYXkgaW4gdGhlIHJlc3BvbnNlIHRvIHVuZGVyc3RhbmQgdGhlIG91dGNvbWUgZm9yIGVhY2ggSXRlbS4gIFRoaXMgZW5kcG9pbnQgaXMgZGlzdGluY3QgZnJvbSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgd2hpY2ggdHJpZ2dlcnMgYSByZWZyZXNoIGZvciBhIHNpbmdsZSBJdGVtLiBVc2UgYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCB0byB0YXJnZXQgYWxsIEl0ZW1zIGZvciBhIHVzZXIgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHVzZXIgaXRlbXMgZm9yIFRyYW5zYWN0aW9ucyBidW5kbGVcbiAgICAgKiBAcGFyYW0ge1VzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclRyYW5zYWN0aW9uc1JlZnJlc2godXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVHJhbnNhY3Rpb25zUmVmcmVzaCh1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgdXBkYXRlcyB1c2VyIGluZm9ybWF0aW9uIGZvciBhbiBleGlzdGluZyBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gLiBJZiBhbiBleGlzdGluZyBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gIGlzIG1pc3NpbmcgZmllbGRzIHJlcXVpcmVkIGZvciBhIGdpdmVuIHVzZSBjYXNlIChlLmcuIGNyZWF0aW5nIGEgQ29uc3VtZXIgUmVwb3J0KSB1c2UgYC91c2VyL3VwZGF0ZWAgdG8gYWRkIHZhbHVlcyBmb3IgdGhvc2UgZmllbGRzLiAgSWRlbnRpdHkgdXBkYXRlcyB1c2UgbWVyZ2Ugc2VtYW50aWNzOiBwcm92aWRlZCBmaWVsZHMgb3ZlcndyaXRlIGV4aXN0aW5nIG9uZXM7IG9taXR0ZWQgZmllbGRzIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdDogV2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHN1bW1hcnkgTGlzdCBlLXdhbGxldCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IFdhdGNobGlzdCBTY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBXYXRjaGxpc3QgUHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG59XG5cblxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQTZGNUY7Ozs7R0FJRztBQUNILElBQVksd0JBS1g7QUFMRCxXQUFZLHdCQUF3QjtJQUNoQywyQ0FBZSxDQUFBO0lBQ2YsMERBQThCLENBQUE7SUFDOUIsZ0RBQW9CLENBQUE7SUFDcEIsOENBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUxXLHdCQUF3QixHQUF4QixnQ0FBd0IsS0FBeEIsZ0NBQXdCLFFBS25DO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUN4QixtQ0FBZSxDQUFBO0lBQ2Ysd0NBQW9CLENBQUE7SUFDcEIsc0NBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUpXLGdCQUFnQixHQUFoQix3QkFBZ0IsS0FBaEIsd0JBQWdCLFFBSTNCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNoQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBS25CO0FBa0NEOzs7TUFHTTtBQUNOLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN0Qiw2REFBMkMsQ0FBQTtJQUMzQyxzQ0FBb0IsQ0FBQTtJQUNwQiw4Q0FBNEIsQ0FBQTtJQUM1QixxQ0FBbUIsQ0FBQTtBQUN2QixDQUFDLEVBTFcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFLekI7QUFtSUQ7OztNQUdNO0FBQ04sSUFBWSxt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QUFDLHNDQUFzQyxDQUFDLDZDQUE2QyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxrQ0FBa0MsQ0FBQyx5Q0FBb0YsRUFBRSxPQUFhO1FBQ3pJLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsa0NBQWtDLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2TCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHlCQUF5QixDQUFDLGdDQUFrRSxFQUFFLE9BQWE7UUFDOUcsT0FBTyxrQkFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLENBQUM7Q0FDSjtBQTM3SEQsNEJBMjdIQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjcwNi4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQW5hbHl6ZWQgQUFNVkEgZGF0YSBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0LiAgTm90ZTogVGhpcyBmaWVsZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgVS5TLiBkcml2ZXJcXCdzIGxpY2Vuc2VzIGlzc3VlZCBieSBwYXJ0aWNpcGF0aW5nIHN0YXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQUFNVkFBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFBTVZBQW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdmVyYWxsIG91dGNvbWUgb2YgY2hlY2tpbmcgdGhlIGFzc29jaWF0ZWQgaGl0IGFnYWluc3QgdGhlIGlzc3Vpbmcgc3RhdGUgZGF0YWJhc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpc192ZXJpZmllZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQUFNVkFNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX2lzc3VlX2RhdGU6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpZF9leHBpcmF0aW9uX2RhdGU6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIHN0cmVldDogQUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQU1WQU1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgY2l0eTogQUFNVkFNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBnZW5kZXI6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBoZWlnaHQ6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBTWF0Y2hSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEFBTVZBQW5hbHlzaXNcbiAgICAgKi9cbiAgICBleWVfY29sb3I6IEFBTVZBTWF0Y2hSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQUFNVkFBbmFseXNpc1xuICAgICAqL1xuICAgIGZpcnN0X25hbWU6IEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgbWlkZGxlX25hbWU6IEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFEZXRhaWxlZE1hdGNoUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBBQU1WQUFuYWx5c2lzXG4gICAgICovXG4gICAgbGFzdF9uYW1lOiBBQU1WQURldGFpbGVkTWF0Y2hSZXN1bHQ7XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIGNoZWNraW5nIHRoZSBhc3NvY2lhdGVkIGhpdCBhZ2FpbnN0IHN0YXRlIGRhdGFiYXNlcy4gICBgbWF0Y2hgIC0gVGhlIGZpZWxkIGlzIGFuIGV4YWN0IG1hdGNoIHdpdGggdGhlIHN0YXRlIGRhdGFiYXNlLiAgYHBhcnRpYWxfbWF0Y2hgIC0gVGhlIGZpZWxkIGlzIGEgcGFydGlhbCBtYXRjaCB3aXRoIHRoZSBzdGF0ZSBkYXRhYmFzZS4gIGBub19tYXRjaGAgLSBUaGUgZmllbGQgaXMgbm90IGFuIGV4YWN0IG1hdGNoIHdpdGggdGhlIHN0YXRlIGRhdGFiYXNlLiAgYG5vX2RhdGFgIC0gVGhlIGZpZWxkIHdhcyB1bmFibGUgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHN0YXRlIGRhdGFiYXNlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFBTVZBRGV0YWlsZWRNYXRjaFJlc3VsdCB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBjaGVja2luZyB0aGUgcGFydGljdWxhciBmaWVsZCBhZ2FpbnN0IHN0YXRlIGRhdGFiYXNlcy4gICBgbWF0Y2hgIC0gVGhlIGZpZWxkIGlzIGFuIGV4YWN0IG1hdGNoIHdpdGggdGhlIHN0YXRlIGRhdGFiYXNlLiAgYG5vX21hdGNoYCAtIFRoZSBmaWVsZCBpcyBub3QgYW4gZXhhY3QgbWF0Y2ggd2l0aCB0aGUgc3RhdGUgZGF0YWJhc2UuICBgbm9fZGF0YWAgLSBUaGUgZmllbGQgd2FzIHVuYWJsZSB0byBiZSBjaGVja2VkIGFnYWluc3Qgc3RhdGUgZGF0YWJhc2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUFNVkFNYXRjaFJlc3VsdCB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHRyYW5zZmVyLiBSZXF1aXJlZCBmb3IgdHJhbnNmZXJzIG9uIGFuIEFDSCBuZXR3b3JrLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0FDSCBTRUMgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvY3JlYXRpbmctdHJhbnNmZXJzLyNhY2gtc2VjLWNvZGVzKS4gIENvZGVzIHN1cHBvcnRlZCBmb3IgY3JlZGl0czogYGNjZGAsIGBwcGRgIENvZGVzIHN1cHBvcnRlZCBmb3IgZGViaXRzOiBgY2NkYCwgYHBwZGAsIGB0ZWxgLCBgd2ViYCAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gVGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lci4gQXV0aG9yaXphdGlvbiB3YXMgb2J0YWluZWQgaW4gd3JpdGluZyBlaXRoZXIgaW4gcGVyc29uIG9yIHZpYSBhbiBlbGVjdHJvbmljIGRvY3VtZW50IHNpZ25pbmcsIGUuZy4gRG9jdXNpZ24sIGJ5IHRoZSBjb25zdW1lci4gQ2FuIGJlIHVzZWQgZm9yIGNyZWRpdHMgb3IgZGViaXRzLiAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeS4gVGhlIHRyYW5zZmVyIGRlYml0cyBhIGNvbnN1bWVyXFwncyBiYW5rIGFjY291bnQuIEF1dGhvcml6YXRpb24gZnJvbSB0aGUgY29uc3VtZXIgaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXQgKGUuZy4gYSB3ZWIgb3IgbW9iaWxlIGFwcGxpY2F0aW9uKS4gQ2FuIGJlIHVzZWQgZm9yIHNpbmdsZSBkZWJpdHMgb3IgcmVjdXJyaW5nIGRlYml0cy4gIGBcXFwidGVsXFxcImAgLSBUZWxlcGhvbmUtSW5pdGlhdGVkIEVudHJ5LiBUaGUgdHJhbnNmZXIgZGViaXRzIGEgY29uc3VtZXIuIERlYml0IGF1dGhvcml6YXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgb3JhbGx5IG92ZXIgdGhlIHRlbGVwaG9uZSB2aWEgYSByZWNvcmRlZCBjYWxsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUNIQ2xhc3Mge1xuICAgIENjZCA9ICdjY2QnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFRlbCA9ICd0ZWwnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIEFQUiBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQVBSXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICAvKipcbiAgICAgKiBBbm51YWwgUGVyY2VudGFnZSBSYXRlIGFwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFsYW5jZSB0byB3aGljaCB0aGUgQVBSIGFwcGxpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYXByX3R5cGU6IEFQUkFwclR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSB0aGF0IGlzIHN1YmplY3RlZCB0byB0aGUgQVBSIGlmIGEgYmFsYW5jZSB3YXMgY2FycmllZCBiZXlvbmQgcGF5bWVudCBkdWUgZGF0ZS4gSG93IGl0IGlzIGNhbGN1bGF0ZWQgY2FuIHZhcnkgYnkgY2FyZCBpc3N1ZXIuIEl0IGlzIG9mdGVuIGNhbGN1bGF0ZWQgYXMgYW4gYXZlcmFnZSBkYWlseSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGJhbGFuY2Vfc3ViamVjdF90b19hcHI6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIG1vbmV5IGNoYXJnZWQgZHVlIHRvIGludGVyZXN0IGZyb20gbGFzdCBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgaW50ZXJlc3RfY2hhcmdlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBUFJBcHJUeXBlRW51bSB7XG4gICAgQmFsYW5jZVRyYW5zZmVyQXByID0gJ2JhbGFuY2VfdHJhbnNmZXJfYXByJyxcbiAgICBDYXNoQXByID0gJ2Nhc2hfYXByJyxcbiAgICBQdXJjaGFzZUFwciA9ICdwdXJjaGFzZV9hcHInLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCdcbn1cblxuLyoqXG4gKiBBbGxvdyBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBieSBhY2NvdW50LiBVbmxpc3RlZCAoZS5nLiBtaXNzaW5nKSBhY2NvdW50cyB3aWxsIGJlIGNvbnNpZGVyZWQgYG5ld19hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X3Byb2R1Y3RfYWNjZXNzPzogQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRBc3NldHMge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uLiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkLiAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkLiAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IChkZXByZWNhdGVkKSBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBpcyBjdXJyZW50bHkgYW4gb3B0LWluIGZpZWxkIGFuZCBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcmVwb3J0IGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogQXNzZXRSZXBvcnRJbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZT86IE93bmVyc2hpcFR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC4gIEF2YWlsYWJsZSBmb3IgYGNyZWRpdGAgYW5kIGBkZXBvc2l0b3J5YCB0eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGFjY291bnRfaW5zaWdodHM/OiBBY2NvdW50SW5zaWdodHMgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogQSBzZXQgb2YgZmllbGRzIGRlc2NyaWJpbmcgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQuIEZvciByZWFsLXRpbWUgdmFsdWVzLCB1c2UgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgb3IgYC9zaWduYWwvZXZhbHVhdGVgICh3aXRoIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQpLCB3aGljaCBhcmUgZmV0Y2hlZCBsaXZlIGZyb20gdGhlIGluc3RpdHV0aW9uIGF0IHJlcXVlc3QgdGltZS4gVmFsdWVzIHJldHVybmVkIGJ5IG90aGVyIGVuZHBvaW50cyBtYXkgYmUgY2FjaGVkLCBvciBhZGp1c3RlZCBieSBQbGFpZCB0byByZWZsZWN0IHRyYW5zYWN0aW9uIGFjdGl2aXR5IHJlY2VpdmVkIHNpbmNlIHRoZSBsYXN0IHJlZnJlc2guXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbC10aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBvciBieSBgL3NpZ25hbC9ldmFsdWF0ZWAgd2l0aCBhIEJhbGFuY2Utb25seSBydWxlc2V0LiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIGludG8gZW5hYmxpbmcgW2xpbWl0ZWQtcHVycG9zZSBjaGVja2luZyBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyNlbmFibGluZy1saW1pdGVkLXB1cnBvc2UtY2hlY2tpbmctYWNjb3VudHMtZm9yLXJlbnQtb3ItbW9ydGdhZ2UpLCB3aGljaCBhbHdheXMgaGF2ZSBgbnVsbGAgdmFsdWVzIGZvciBib3RoIGBhdmFpbGFibGVgIGFuZCBgY3VycmVudGAgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiBTaW1pbGFyIHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpcyB0eXBpY2FsbHkgZXhwZWN0ZWQsIHdoaWxlIGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgb3IgYnkgYC9zaWduYWwvZXZhbHVhdGVgIHdpdGggYSBCYWxhbmNlLW9ubHkgcnVsZXNldDsgaWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgVHJhbnNhY3Rpb25zLCB0aGUgYmFsYW5jZSB3aWxsIGJlIGF0IGxlYXN0IGFzIHJlY2VudCBhcyB0aGUgbW9zdCByZWNlbnQgVHJhbnNhY3Rpb24gdXBkYXRlLiBJZiB5b3UgcmVxdWlyZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIG9yIGAvc2lnbmFsL2V2YWx1YXRlYCBjYWxsZWQgd2l0aCBhIEJhbGFuY2Utb25seSBgcnVsZXNldF9rZXlgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLCB1bmxlc3MgeW91IGhhdmUgb3B0ZWQgaW50byBlbmFibGluZyBbbGltaXRlZC1wdXJwb3NlIGNoZWNraW5nIGFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI2VuYWJsaW5nLWxpbWl0ZWQtcHVycG9zZS1jaGVja2luZy1hY2NvdW50cy1mb3ItcmVudC1vci1tb3J0Z2FnZSksIHdoaWNoIGFsd2F5cyBoYXZlIGBudWxsYCB2YWx1ZXMgZm9yIGJvdGggYGF2YWlsYWJsZWAgYW5kIGBjdXJyZW50YCBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoZSBiYWxhbmNlIHdhcyB1cGRhdGVkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBvbmx5IHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgYWNjb3VudCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QmFzZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIFdoZW4gdXNpbmcgYSBDUkEgZW5kcG9pbnQgKGFuIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIGkuZS4gYW55IGVuZHBvaW50IGJlZ2lubmluZyB3aXRoIGAvY3JhL2ApLCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIHdpbGwgbm90IG1hdGNoIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgYnkgYSBub24tQ1JBIGVuZHBvaW50LiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgZWl0aGVyIHRoZSBhY2NvdW50XFwncyBkaXNwbGF5ZWQgbWFzayBvciB0aGUgYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHVzaW5nIEF1dGggYW5kIGZhbGxpbmcgYmFjayB0byBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQuICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB1bnNlbnRgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCBidXQgUGxhaWQgaGFzIG5vdCB5ZXQgc2VudCB0aGUgbWljcm8tZGVwb3NpdC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc2lnbmFsIGZvciBiZWluZyBpbnZhbGlkIGFuZC9vciBoYXZlIG5vIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIFR5cGljYWxseSB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSByb3V0aW5nIG51bWJlciBpcyBpbnZhbGlkLCB0aGUgYWNjb3VudCBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIGZvcm1hdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRpbmcgbnVtYmVyLCBvciB0aGUgYWNjb3VudCBoYXMgYmVlbiByZXBvcnRlZCBhcyBjbG9zZWQgb3IgZnJvemVuLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc2A6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgbWF0Y2ggYSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBvZiBhbiBhY2NvdW50IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGFuZCB0aGUgYWNjb3VudCBpcyBub3Qga25vd24gYnkgUGxhaWQgdG8gYmUgZnJvemVuIG9yIGNsb3NlZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc29tZSBzaWduYWwgZm9yIGJlaW5nIHZhbGlkOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgd2VyZSBub3QgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYnV0IHRoZSByb3V0aW5nIG51bWJlciBpcyB2YWxpZCBhbmQgdGhlIGFjY291bnQgbnVtYmVyIGlzIGEgcG90ZW50aWFsIHZhbGlkIGFjY291bnQgbnVtYmVyIGZvciB0aGF0IHJvdXRpbmcgbnVtYmVyLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfbWF0Y2hlZGA6IChkZXByZWNhdGVkKSBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBudWxsYCBvciBlbXB0eSBzdHJpbmc6IE5laXRoZXIgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gbm9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudEJhc2VWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlciBuYW1lIHRoYXQgd2FzIHVzZWQgZm9yIG1pY3JvLWRlcG9zaXQgYW5kL29yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gVGhpcyBuYW1lIHdhcyBtYW51YWxseS1lbnRlcmVkIGJ5IHRoZSB1c2VyIGR1cmluZyBMaW5rLCB1bmxlc3MgaXQgd2FzIG90aGVyd2lzZSBwcm92aWRlZCB2aWEgdGhlIGB1c2VyLmxlZ2FsX25hbWVgIHJlcXVlc3QgZmllbGQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhhdCBjcmVhdGVkIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlLCBQTkMsIGFuZCBVUyBCYW5rKS4gQmVjYXVzZSB0aGVzZSBhY2NvdW50cyBoYXZlIGEgZGlmZmVyZW50IGFjY291bnQgbnVtYmVyIGVhY2ggdGltZSB0aGV5IGFyZSBsaW5rZWQsIHRoaXMgZmllbGQgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWNjb3VudCBudW1iZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gYWNjb3VudCBhY3Jvc3MgbXVsdGlwbGUgSXRlbXMgZm9yIHBheW1lbnRzIHVzZSBjYXNlcywgaGVscGluZyB0byByZWR1Y2UgZHVwbGljYXRlIEl0ZW1zIG9yIGF0dGVtcHRlZCBmcmF1ZC4gSW4gU2FuZGJveCwgdGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgZm9yIFRBTi1iYXNlZCBpbnN0aXR1dGlvbnMgKGBpbnNfNTZgLCBgaW5zXzEzYCwgYGluc18xMjc5OTBgKSBhcyB3ZWxsIGFzIHRoZSBPQXV0aCBTYW5kYm94IGluc3RpdHV0aW9uIChgaW5zXzEyNzI4N2ApOyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEJhc2VWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBVbnNlbnQgPSAndW5zZW50JyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3MnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzV2l0aENhdXRpb24gPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb24nLFxuICAgIERhdGFiYXNlSW5zaWdodHNGYWlsID0gJ2RhdGFiYXNlX2luc2lnaHRzX2ZhaWwnXG59XG5cbi8qKlxuICogQSBzaW5nbGUgYWNjb3VudCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhc2VOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBXaGVuIHVzaW5nIGEgQ1JBIGVuZHBvaW50IChhbiBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCBpLmUuIGFueSBlbmRwb2ludCBiZWdpbm5pbmcgd2l0aCBgL2NyYS9gKSwgdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCB3aWxsIG5vdCBtYXRjaCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIGJ5IGEgbm9uLUNSQSBlbmRwb2ludC4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBlaXRoZXIgdGhlIGFjY291bnRcXCdzIGRpc3BsYXllZCBtYXNrIG9yIHRoZSBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlTnVsbGFibGVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlTnVsbGFibGVcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHVzaW5nIEF1dGggYW5kIGZhbGxpbmcgYmFjayB0byBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQuICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB1bnNlbnRgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCBidXQgUGxhaWQgaGFzIG5vdCB5ZXQgc2VudCB0aGUgbWljcm8tZGVwb3NpdC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc2lnbmFsIGZvciBiZWluZyBpbnZhbGlkIGFuZC9vciBoYXZlIG5vIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIFR5cGljYWxseSB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSByb3V0aW5nIG51bWJlciBpcyBpbnZhbGlkLCB0aGUgYWNjb3VudCBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIGZvcm1hdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRpbmcgbnVtYmVyLCBvciB0aGUgYWNjb3VudCBoYXMgYmVlbiByZXBvcnRlZCBhcyBjbG9zZWQgb3IgZnJvemVuLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc2A6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgbWF0Y2ggYSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBvZiBhbiBhY2NvdW50IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGFuZCB0aGUgYWNjb3VudCBpcyBub3Qga25vd24gYnkgUGxhaWQgdG8gYmUgZnJvemVuIG9yIGNsb3NlZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc29tZSBzaWduYWwgZm9yIGJlaW5nIHZhbGlkOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgd2VyZSBub3QgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYnV0IHRoZSByb3V0aW5nIG51bWJlciBpcyB2YWxpZCBhbmQgdGhlIGFjY291bnQgbnVtYmVyIGlzIGEgcG90ZW50aWFsIHZhbGlkIGFjY291bnQgbnVtYmVyIGZvciB0aGF0IHJvdXRpbmcgbnVtYmVyLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfbWF0Y2hlZGA6IChkZXByZWNhdGVkKSBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBudWxsYCBvciBlbXB0eSBzdHJpbmc6IE5laXRoZXIgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gbm9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QmFzZU51bGxhYmxlVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXIgbmFtZSB0aGF0IHdhcyB1c2VkIGZvciBtaWNyby1kZXBvc2l0IGFuZC9vciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgbWljcm8tZGVwb3NpdCBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFRoaXMgbmFtZSB3YXMgbWFudWFsbHktZW50ZXJlZCBieSB0aGUgdXNlciBkdXJpbmcgTGluaywgdW5sZXNzIGl0IHdhcyBvdGhlcndpc2UgcHJvdmlkZWQgdmlhIHRoZSBgdXNlci5sZWdhbF9uYW1lYCByZXF1ZXN0IGZpZWxkIGluIGAvbGluay90b2tlbi9jcmVhdGVgIGZvciB0aGUgTGluayBzZXNzaW9uIHRoYXQgY3JlYXRlZCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZU51bGxhYmxlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UsIFBOQywgYW5kIFVTIEJhbmspLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIGlzIHBvcHVsYXRlZCBmb3IgVEFOLWJhc2VkIGluc3RpdHV0aW9ucyAoYGluc181NmAsIGBpbnNfMTNgLCBgaW5zXzEyNzk5MGApIGFzIHdlbGwgYXMgdGhlIE9BdXRoIFNhbmRib3ggaW5zdGl0dXRpb24gKGBpbnNfMTI3Mjg3YCk7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlTnVsbGFibGVcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRIb2xkZXJDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VOdWxsYWJsZVxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEJhc2VOdWxsYWJsZVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBFbnVtZXJhdGVzIHRoZSBhY2NvdW50IHN1YnR5cGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpc2hlcyBmb3IgdGhlIHVzZXIgdG8gYmUgYWJsZSB0byBzZWxlY3QgZnJvbS4gRm9yIG1vcmUgZGV0YWlscyByZWZlciB0byBQbGFpZCBkb2N1bWVudGF0aW9uIG9uIGFjY291bnQgZmlsdGVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgbG9hbj86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVGhlIGBhY2NvdW50X2ZpbHRlcnNgIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBDcmVkaXRGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5GaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsb2FuPzogTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBJbnZlc3RtZW50RmlsdGVyO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGFjY291bnRcXCdzIGNhdGVnb3JpemF0aW9uIGFzIGVpdGhlciBhIHBlcnNvbmFsIG9yIGEgYnVzaW5lc3MgYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgaW4gYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50SG9sZGVyQ2F0ZWdvcnkge1xuICAgIEJ1c2luZXNzID0gJ2J1c2luZXNzJyxcbiAgICBQZXJzb25hbCA9ICdwZXJzb25hbCcsXG4gICAgVW5yZWNvZ25pemVkID0gJ3VucmVjb2duaXplZCdcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIFdoZW4gdXNpbmcgYSBDUkEgZW5kcG9pbnQgKGFuIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIGkuZS4gYW55IGVuZHBvaW50IGJlZ2lubmluZyB3aXRoIGAvY3JhL2ApLCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIHdpbGwgbm90IG1hdGNoIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgYnkgYSBub24tQ1JBIGVuZHBvaW50LiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHVzaW5nIEF1dGggYW5kIGZhbGxpbmcgYmFjayB0byBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQuICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB1bnNlbnRgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCBidXQgUGxhaWQgaGFzIG5vdCB5ZXQgc2VudCB0aGUgbWljcm8tZGVwb3NpdC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc2lnbmFsIGZvciBiZWluZyBpbnZhbGlkIGFuZC9vciBoYXZlIG5vIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIFR5cGljYWxseSB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSByb3V0aW5nIG51bWJlciBpcyBpbnZhbGlkLCB0aGUgYWNjb3VudCBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIGZvcm1hdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRpbmcgbnVtYmVyLCBvciB0aGUgYWNjb3VudCBoYXMgYmVlbiByZXBvcnRlZCBhcyBjbG9zZWQgb3IgZnJvemVuLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc2A6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgbWF0Y2ggYSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBvZiBhbiBhY2NvdW50IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGFuZCB0aGUgYWNjb3VudCBpcyBub3Qga25vd24gYnkgUGxhaWQgdG8gYmUgZnJvemVuIG9yIGNsb3NlZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc29tZSBzaWduYWwgZm9yIGJlaW5nIHZhbGlkOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgd2VyZSBub3QgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYnV0IHRoZSByb3V0aW5nIG51bWJlciBpcyB2YWxpZCBhbmQgdGhlIGFjY291bnQgbnVtYmVyIGlzIGEgcG90ZW50aWFsIHZhbGlkIGFjY291bnQgbnVtYmVyIGZvciB0aGF0IHJvdXRpbmcgbnVtYmVyLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfbWF0Y2hlZGA6IChkZXByZWNhdGVkKSBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBudWxsYCBvciBlbXB0eSBzdHJpbmc6IE5laXRoZXIgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gbm9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX2luc2lnaHRzPzogQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgZm9yIEl0ZW1zIGF0IGluc3RpdHV0aW9ucyB0aGF0IHVzZSBUb2tlbml6ZWQgQWNjb3VudCBOdW1iZXJzIChpLmUuLCBDaGFzZSwgUE5DLCBhbmQgVVMgQmFuaykuIEJlY2F1c2UgdGhlc2UgYWNjb3VudHMgaGF2ZSBhIGRpZmZlcmVudCBhY2NvdW50IG51bWJlciBlYWNoIHRpbWUgdGhleSBhcmUgbGlua2VkLCB0aGlzIGZpZWxkIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFjY291bnQgbnVtYmVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGFjY291bnQgYWNyb3NzIG11bHRpcGxlIEl0ZW1zIGZvciBwYXltZW50cyB1c2UgY2FzZXMsIGhlbHBpbmcgdG8gcmVkdWNlIGR1cGxpY2F0ZSBJdGVtcyBvciBhdHRlbXB0ZWQgZnJhdWQuIEluIFNhbmRib3gsIHRoaXMgZmllbGQgaXMgcG9wdWxhdGVkIGZvciBUQU4tYmFzZWQgaW5zdGl0dXRpb25zIChgaW5zXzU2YCwgYGluc18xM2AsIGBpbnNfMTI3OTkwYCkgYXMgd2VsbCBhcyB0aGUgT0F1dGggU2FuZGJveCBpbnN0aXR1dGlvbiAoYGluc18xMjcyODdgKTsgaW4gUHJvZHVjdGlvbiwgaXQgd2lsbCBvbmx5IGJlIHBvcHVsYXRlZCBmb3IgYWNjb3VudHMgYXQgYXBwbGljYWJsZSBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBVbnNlbnQgPSAndW5zZW50JyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3MnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzV2l0aENhdXRpb24gPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb24nLFxuICAgIERhdGFiYXNlSW5zaWdodHNGYWlsID0gJ2RhdGFiYXNlX2luc2lnaHRzX2ZhaWwnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG4vKipcbiAqIElkZW50aXR5IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIFdoZW4gdXNpbmcgYSBDUkEgZW5kcG9pbnQgKGFuIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIGkuZS4gYW55IGVuZHBvaW50IGJlZ2lubmluZyB3aXRoIGAvY3JhL2ApLCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIHdpbGwgbm90IG1hdGNoIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgYnkgYSBub24tQ1JBIGVuZHBvaW50LiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgZWl0aGVyIHRoZSBhY2NvdW50XFwncyBkaXNwbGF5ZWQgbWFzayBvciB0aGUgYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHVzaW5nIEF1dGggYW5kIGZhbGxpbmcgYmFjayB0byBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQuICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB1bnNlbnRgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCBidXQgUGxhaWQgaGFzIG5vdCB5ZXQgc2VudCB0aGUgbWljcm8tZGVwb3NpdC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc2lnbmFsIGZvciBiZWluZyBpbnZhbGlkIGFuZC9vciBoYXZlIG5vIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIFR5cGljYWxseSB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSByb3V0aW5nIG51bWJlciBpcyBpbnZhbGlkLCB0aGUgYWNjb3VudCBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIGZvcm1hdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRpbmcgbnVtYmVyLCBvciB0aGUgYWNjb3VudCBoYXMgYmVlbiByZXBvcnRlZCBhcyBjbG9zZWQgb3IgZnJvemVuLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc2A6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgbWF0Y2ggYSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBvZiBhbiBhY2NvdW50IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGFuZCB0aGUgYWNjb3VudCBpcyBub3Qga25vd24gYnkgUGxhaWQgdG8gYmUgZnJvemVuIG9yIGNsb3NlZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc29tZSBzaWduYWwgZm9yIGJlaW5nIHZhbGlkOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgd2VyZSBub3QgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYnV0IHRoZSByb3V0aW5nIG51bWJlciBpcyB2YWxpZCBhbmQgdGhlIGFjY291bnQgbnVtYmVyIGlzIGEgcG90ZW50aWFsIHZhbGlkIGFjY291bnQgbnVtYmVyIGZvciB0aGF0IHJvdXRpbmcgbnVtYmVyLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfbWF0Y2hlZGA6IChkZXByZWNhdGVkKSBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBudWxsYCBvciBlbXB0eSBzdHJpbmc6IE5laXRoZXIgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gbm9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlciBuYW1lIHRoYXQgd2FzIHVzZWQgZm9yIG1pY3JvLWRlcG9zaXQgYW5kL29yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gVGhpcyBuYW1lIHdhcyBtYW51YWxseS1lbnRlcmVkIGJ5IHRoZSB1c2VyIGR1cmluZyBMaW5rLCB1bmxlc3MgaXQgd2FzIG90aGVyd2lzZSBwcm92aWRlZCB2aWEgdGhlIGB1c2VyLmxlZ2FsX25hbWVgIHJlcXVlc3QgZmllbGQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhhdCBjcmVhdGVkIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlLCBQTkMsIGFuZCBVUyBCYW5rKS4gQmVjYXVzZSB0aGVzZSBhY2NvdW50cyBoYXZlIGEgZGlmZmVyZW50IGFjY291bnQgbnVtYmVyIGVhY2ggdGltZSB0aGV5IGFyZSBsaW5rZWQsIHRoaXMgZmllbGQgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWNjb3VudCBudW1iZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gYWNjb3VudCBhY3Jvc3MgbXVsdGlwbGUgSXRlbXMgZm9yIHBheW1lbnRzIHVzZSBjYXNlcywgaGVscGluZyB0byByZWR1Y2UgZHVwbGljYXRlIEl0ZW1zIG9yIGF0dGVtcHRlZCBmcmF1ZC4gSW4gU2FuZGJveCwgdGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgZm9yIFRBTi1iYXNlZCBpbnN0aXR1dGlvbnMgKGBpbnNfNTZgLCBgaW5zXzEzYCwgYGluc18xMjc5OTBgKSBhcyB3ZWxsIGFzIHRoZSBPQXV0aCBTYW5kYm94IGluc3RpdHV0aW9uIChgaW5zXzEyNzI4N2ApOyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgdXBsb2FkZWQgYXMgcHJvb2Ygb2YgYWNjb3VudCBvd25lcnNoaXAuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWQ+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWQ+IHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbjsgZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIGxpbmtlZCBhY2NvdW50IGlzIGEgYnVzaW5lc3MgYWNjb3VudCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRBbGxPZlxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgdXBsb2FkZWQgYXMgcHJvb2Ygb2YgYWNjb3VudCBvd25lcnNoaXAuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWQ+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGl0eSBtYXRjaCBzY29yZXMgZm9yIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBXaGVuIHVzaW5nIGEgQ1JBIGVuZHBvaW50IChhbiBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCBpLmUuIGFueSBlbmRwb2ludCBiZWdpbm5pbmcgd2l0aCBgL2NyYS9gKSwgdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCB3aWxsIG5vdCBtYXRjaCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIGJ5IGEgbm9uLUNSQSBlbmRwb2ludC4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX2luc2lnaHRzPzogQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgZm9yIEl0ZW1zIGF0IGluc3RpdHV0aW9ucyB0aGF0IHVzZSBUb2tlbml6ZWQgQWNjb3VudCBOdW1iZXJzIChpLmUuLCBDaGFzZSwgUE5DLCBhbmQgVVMgQmFuaykuIEJlY2F1c2UgdGhlc2UgYWNjb3VudHMgaGF2ZSBhIGRpZmZlcmVudCBhY2NvdW50IG51bWJlciBlYWNoIHRpbWUgdGhleSBhcmUgbGlua2VkLCB0aGlzIGZpZWxkIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFjY291bnQgbnVtYmVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGFjY291bnQgYWNyb3NzIG11bHRpcGxlIEl0ZW1zIGZvciBwYXltZW50cyB1c2UgY2FzZXMsIGhlbHBpbmcgdG8gcmVkdWNlIGR1cGxpY2F0ZSBJdGVtcyBvciBhdHRlbXB0ZWQgZnJhdWQuIEluIFNhbmRib3gsIHRoaXMgZmllbGQgaXMgcG9wdWxhdGVkIGZvciBUQU4tYmFzZWQgaW5zdGl0dXRpb25zIChgaW5zXzU2YCwgYGluc18xM2AsIGBpbnNfMTI3OTkwYCkgYXMgd2VsbCBhcyB0aGUgT0F1dGggU2FuZGJveCBpbnN0aXR1dGlvbiAoYGluc18xMjcyODdgKTsgaW4gUHJvZHVjdGlvbiwgaXQgd2lsbCBvbmx5IGJlIHBvcHVsYXRlZCBmb3IgYWNjb3VudHMgYXQgYXBwbGljYWJsZSBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmFtZU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogTmFtZU1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZU51bWJlck1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBQaG9uZU51bWJlck1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbWFpbEFkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IEVtYWlsQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IE5hbWVNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVOdW1iZXJNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBQaG9uZU51bWJlck1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbWFpbEFkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGlzIGlzIGEgY29udGFpbmVyIG9iamVjdCBmb3IgYWxsIGxlbmRpbmctcmVsYXRlZCBpbnNpZ2h0cy4gVGhpcyBmaWVsZCB3aWxsIGJlIHJldHVybmVkIG9ubHkgZm9yIEV1cm9wZWFuIGN1c3RvbWVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0luZGljYXRvcnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJpc2s/OiBSaXNrSW5kaWNhdG9ycyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FmZm9yZGFiaWxpdHlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYWZmb3JkYWJpbGl0eT86IEFmZm9yZGFiaWxpdHlJbnNpZ2h0cyB8IG51bGw7XG59XG4vKipcbiAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3Mgc3BlY2lmaWMgcHJvZHVjdHMgb24gdGhpcyBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3Mge1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYWNjb3VudCBkYXRhLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudF9kYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBiYW5rIHN0YXRlbWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0YXggZG9jdW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgdGF4X2RvY3VtZW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHNwZWNpZmljIHByb2R1Y3RzIG9uIHRoaXMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBhY2NvdW50IGRhdGEuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0YXggZG9jdW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0YXhfZG9jdW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IGFjY291bnRzIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBjYXJkaW5hbGl0eS4gYE1VTFRJX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgbXVsdGlwbGUgYWNjb3VudHMuIGBTSU5HTEVfU0VMRUNUYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGljayBvbmx5IGEgc2luZ2xlIGFjY291bnQuIGBBTExgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBtdXN0IHNoYXJlIGFsbCBvZiB0aGVpciBhY2NvdW50cyBhbmQgc2hvdWxkIG5vdCBiZSBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkgdG8gZGUtc2VsZWN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50U2VsZWN0aW9uQ2FyZGluYWxpdHkge1xuICAgIFNpbmdsZVNlbGVjdCA9ICdTSU5HTEVfU0VMRUNUJyxcbiAgICBNdWx0aVNlbGVjdCA9ICdNVUxUSV9TRUxFQ1QnLFxuICAgIEFsbCA9ICdBTEwnXG59XG5cbi8qKlxuICogU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFN1YnR5cGUge1xuICAgIF80MDFhID0gJzQwMWEnLFxuICAgIF80MDFrID0gJzQwMWsnLFxuICAgIF80MDNCID0gJzQwM0InLFxuICAgIF80NTdiID0gJzQ1N2InLFxuICAgIF81MjkgPSAnNTI5JyxcbiAgICBBdXRvID0gJ2F1dG8nLFxuICAgIEJyb2tlcmFnZSA9ICdicm9rZXJhZ2UnLFxuICAgIEJ1c2luZXNzID0gJ2J1c2luZXNzJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIENkID0gJ2NkJyxcbiAgICBDaGVja2luZyA9ICdjaGVja2luZycsXG4gICAgQ29tbWVyY2lhbCA9ICdjb21tZXJjaWFsJyxcbiAgICBDb25zdHJ1Y3Rpb24gPSAnY29uc3RydWN0aW9uJyxcbiAgICBDb25zdW1lciA9ICdjb25zdW1lcicsXG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgQ3J5cHRvRXhjaGFuZ2UgPSAnY3J5cHRvIGV4Y2hhbmdlJyxcbiAgICBFYnQgPSAnZWJ0JyxcbiAgICBFZHVjYXRpb25TYXZpbmdzQWNjb3VudCA9ICdlZHVjYXRpb24gc2F2aW5ncyBhY2NvdW50JyxcbiAgICBGaHNhID0gJ2Zoc2EnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBMaWYgPSAnbGlmJyxcbiAgICBMaWZlSW5zdXJhbmNlID0gJ2xpZmUgaW5zdXJhbmNlJyxcbiAgICBMaW1pdGVkUHVycG9zZUNoZWNraW5nID0gJ2xpbWl0ZWQgcHVycG9zZSBjaGVja2luZycsXG4gICAgTGluZU9mQ3JlZGl0ID0gJ2xpbmUgb2YgY3JlZGl0JyxcbiAgICBMaXJhID0gJ2xpcmEnLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTHJpZiA9ICdscmlmJyxcbiAgICBMcnNwID0gJ2xyc3AnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIE11dHVhbEZ1bmQgPSAnbXV0dWFsIGZ1bmQnLFxuICAgIE5vbkN1c3RvZGlhbFdhbGxldCA9ICdub24tY3VzdG9kaWFsIHdhbGxldCcsXG4gICAgTm9uVGF4YWJsZUJyb2tlcmFnZUFjY291bnQgPSAnbm9uLXRheGFibGUgYnJva2VyYWdlIGFjY291bnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBPdmVyZHJhZnQgPSAnb3ZlcmRyYWZ0JyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnLFxuICAgIFBlbnNpb24gPSAncGVuc2lvbicsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFByb2ZpdFNoYXJpbmdQbGFuID0gJ3Byb2ZpdCBzaGFyaW5nIHBsYW4nLFxuICAgIFFzaHIgPSAncXNocicsXG4gICAgUmRzcCA9ICdyZHNwJyxcbiAgICBSZXNwID0gJ3Jlc3AnLFxuICAgIFJldGlyZW1lbnQgPSAncmV0aXJlbWVudCcsXG4gICAgUmxpZiA9ICdybGlmJyxcbiAgICBSb3RoID0gJ3JvdGgnLFxuICAgIFJvdGg0MDFrID0gJ3JvdGggNDAxaycsXG4gICAgUm90aDQwM0IgPSAncm90aCA0MDNCJyxcbiAgICBSb3RoNDU3YiA9ICdyb3RoIDQ1N2InLFxuICAgIFJvdGhQZW5zaW9uID0gJ3JvdGggcGVuc2lvbicsXG4gICAgUm90aFByb2ZpdFNoYXJpbmdQbGFuID0gJ3JvdGggcHJvZml0IHNoYXJpbmcgcGxhbicsXG4gICAgUm90aFRocmlmdFNhdmluZ3NQbGFuID0gJ3JvdGggdGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgUnJpZiA9ICdycmlmJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNhcnNlcCA9ICdzYXJzZXAnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgU2VwSXJhID0gJ3NlcCBpcmEnLFxuICAgIFNpbXBsZUlyYSA9ICdzaW1wbGUgaXJhJyxcbiAgICBTaXBwID0gJ3NpcHAnLFxuICAgIFN0b2NrUGxhbiA9ICdzdG9jayBwbGFuJyxcbiAgICBTdHVkZW50ID0gJ3N0dWRlbnQnLFxuICAgIFRocmlmdFNhdmluZ3NQbGFuID0gJ3RocmlmdCBzYXZpbmdzIHBsYW4nLFxuICAgIFRmc2EgPSAndGZzYScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFVnbWEgPSAndWdtYScsXG4gICAgVXRtYSA9ICd1dG1hJyxcbiAgICBWYXJpYWJsZUFubnVpdHkgPSAndmFyaWFibGUgYW5udWl0eSdcbn1cblxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgdHlwZSBpcyBjYWxsZWQgYGJyb2tlcmFnZWAgaW5zdGVhZC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgb3RoZXI6YCBOb24tc3BlY2lmaWVkIGFjY291bnQgdHlwZSAgU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGFjY291bnQgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcgc3VidHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogSW5zaWdodHMgZnJvbSBwZXJmb3JtaW5nIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBmb3IgdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgdXNpbmcgRGF0YWJhc2UgQXV0aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHNjb3JlIG9mIHRoZSBuYW1lIG1hdGNoIGJldHdlZW4gdGhlIGdpdmVuIG5hbWUgcHJvdmlkZWQgZHVyaW5nIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiAoYXZhaWxhYmxlIGluIHRoZSBbYHZlcmlmaWNhdGlvbl9uYW1lYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXV0aC8jYXV0aC1nZXQtcmVzcG9uc2UtYWNjb3VudHMtdmVyaWZpY2F0aW9uLW5hbWUpIGZpZWxkIGlmIHVzaW5nIHN0YW5kYXJkIERhdGFiYXNlIEF1dGgsIG9yIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGlmIHVzaW5nIGAvYXV0aC92ZXJpZnlgKSBhbmQgbWF0Y2hlZCBQbGFpZCBuZXR3b3JrIGFjY291bnRzLiBJZiBkZWZpbmVkLCB3aWxsIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuIFdpbGwgYmUgdW5kZWZpbmVkIGlmIG5hbWUgbWF0Y2hpbmcgd2FzIG5vdCBlbmFibGVkIGZvciB0aGUgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHNlc3Npb24gb3IgaWYgdGhlcmUgd2VyZSBubyBlbGlnaWJsZSBQbGFpZCBuZXR3b3JrIG1hdGNoZXMgdG8gY29tcGFyZSB0aGUgZ2l2ZW4gbmFtZSB3aXRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWVfbWF0Y2hfc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBuZXR3b3JrX3N0YXR1czogQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzUHJldmlvdXNSZXR1cm5zfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmV2aW91c19yZXR1cm5zPzogQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzUHJldmlvdXNSZXR1cm5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNBY2NvdW50TnVtYmVyRm9ybWF0fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcl9mb3JtYXQ6IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c0FjY291bnROdW1iZXJGb3JtYXQ7XG59XG4vKipcbiAqIEluZGljYXRvciBvZiBhY2NvdW50IG51bWJlciBmb3JtYXQgdmFsaWRpdHkgZm9yIGluc3RpdHV0aW9uLiAgYHZhbGlkYDogaW5kaWNhdGVzIHRoYXQgdGhlIGFjY291bnQgbnVtYmVyIGhhcyBhIGNvcnJlY3QgZm9ybWF0IGZvciB0aGUgaW5zdGl0dXRpb24uICBgaW52YWxpZGA6IGluZGljYXRlcyB0aGF0IHRoZSBhY2NvdW50IG51bWJlciBoYXMgYW4gaW5jb3JyZWN0IGZvcm1hdCBmb3IgdGhlIGluc3RpdHV0aW9uLiAgYHVua25vd25gOiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSB3YXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZm9ybWF0IGlzIGNvcnJlY3QgZm9yIHRoZSBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c0FjY291bnROdW1iZXJGb3JtYXQge1xuICAgIFZhbGlkID0gJ3ZhbGlkJyxcbiAgICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBTdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyIGluIHRoZSBQbGFpZCBuZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1cyB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgd2UgZm91bmQgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIGFjY291bnQgZm9yIHRoZSBBQ0ggYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXNcbiAgICAgKi9cbiAgICBoYXNfbnVtYmVyc19tYXRjaDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIGFjY291bnQgZm9yIHRoZSBBQ0ggYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgaXMgYWxyZWFkeSB2ZXJpZmllZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c1xuICAgICAqL1xuICAgIGlzX251bWJlcnNfbWF0Y2hfdmVyaWZpZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGtub3duIEFDSCByZXR1cm5zIGZvciB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJuc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJucyB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBpbmNsdWRlIGEga25vd24gYWRtaW5pc3RyYXRpdmUgQUNIIHJldHVybiBmb3IgdGhpcyBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzUHJldmlvdXNSZXR1cm5zXG4gICAgICovXG4gICAgaGFzX3ByZXZpb3VzX2FkbWluaXN0cmF0aXZlX3JldHVybjogYm9vbGVhbjtcbn1cbi8qKlxuICogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogT3B0aW9uYWwgcGFyYW1ldGVycyB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgbnVsbGAuICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgKmFuZCogb25lIG9yIG1vcmUgYWNjb3VudCB0eXBlcyBiZWluZyByZXF1ZXN0ZWQgaXMgYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IChzdWNoIGFzIGEgY3JlZGl0IGNhcmQpIGFzIENhcGl0YWwgT25lIGRvZXMgbm90IHByb3ZpZGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBJbiB0aGlzIGNhc2UsIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgYXMgd2VsbCBhcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cyBhdCBDYXBpdGFsIE9uZSAoaW5jbHVkaW5nIGFsbCBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cykgdGhpcyBmaWVsZCBpcyBpZ25vcmVkIGFuZCByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGZldGNoZWQuICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBpZ25vcmVkLCBhbmQgbm8gYWNjZXB0YWJsZSBiYWxhbmNlIGlzIGF2YWlsYWJsZSwgYW4gYElOVkFMSURfUkVTVUxUYCBlcnJvciB3aXRoIHRoZSBjb2RlIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hY2NvdW50cy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YCBhbmQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3YXMgY2FsbGVkLCBlYWNoIGFjY291bnQgd2lsbCBpbmNsdWRlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpb24vYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpb25TdGF0ZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBBdHRlbXB0ID0gJ0FUVEVNUFQnLFxuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJyxcbiAgICBTa2lwcGVkID0gJ1NLSVBQRUQnXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgY29uc2VudCBhY3Rpdml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWN0aXZpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjdGl2aXR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBhY3Rpdml0eTogQWN0aXZpdHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYWN0aXZpdHkgd2FzIGluaXRpYXRlZCBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGluaXRpYXRlZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjdGl2aXR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFwcGxpY2F0aW9uIElEIG9mIHRoZSBjbGllbnQgd2hvIGluaXRpYXRlZCB0aGUgYWN0aXZpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBpbml0aWF0b3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWN0aW9uU3RhdGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgc3RhdGU6IEFjdGlvblN0YXRlO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGAsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHRhcmdldF9hcHBsaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgc2NvcGVzPzogU2NvcGVzTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtQ3JlYXRlQXV0aGVudGljYXRpb259XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgYXV0aGVudGljYXRpb24/OiBJdGVtQ3JlYXRlQXV0aGVudGljYXRpb247XG59XG4vKipcbiAqIFR5cGVzIG9mIGNvbnNlbnQgYWN0aXZpdGllc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWN0aXZpdHlUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEl0ZW1DcmVhdGUgPSAnSVRFTV9DUkVBVEUnLFxuICAgIEl0ZW1JbXBvcnQgPSAnSVRFTV9JTVBPUlQnLFxuICAgIEl0ZW1VcGRhdGUgPSAnSVRFTV9VUERBVEUnLFxuICAgIEl0ZW1VbmxpbmsgPSAnSVRFTV9VTkxJTksnLFxuICAgIFBvcnRhbFVubGluayA9ICdQT1JUQUxfVU5MSU5LJyxcbiAgICBQb3J0YWxJdGVtc0RlbGV0ZSA9ICdQT1JUQUxfSVRFTVNfREVMRVRFJyxcbiAgICBJdGVtUmVtb3ZlID0gJ0lURU1fUkVNT1ZFJyxcbiAgICBJbnZhcmlhbnRDaGVja2VyRGVsZXRpb24gPSAnSU5WQVJJQU5UX0NIRUNLRVJfREVMRVRJT04nLFxuICAgIFNjb3Blc1VwZGF0ZSA9ICdTQ09QRVNfVVBEQVRFJ1xufVxuXG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzXG4gICAgICovXG4gICAgcHJpbWFyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHNcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHNcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBhZGRyZXNzIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgYWRkcmVzcyBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgc2NvcmUgY2FuIHJhbmdlIGZyb20gMCB0byAxMDAgd2hlcmUgMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc01hdGNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogTWF0Y2ggc2NvcmUgZm9yIGFkZHJlc3MuIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2gsIDk5LTkwIGlzIGEgc3Ryb25nIG1hdGNoLCA4OS03MCBpcyBhIHBhcnRpYWwgbWF0Y2gsIGFueXRoaW5nIGJlbG93IDcwIGlzIGNvbnNpZGVyZWQgYSB3ZWFrIG1hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIGFkZHJlc3MgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIHBvc3RhbCBjb2RlIHdhcyBwcm92aWRlZCBmb3IgYm90aCBhbmQgd2FzIGEgbWF0Y2hcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19wb3N0YWxfY29kZV9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBIHBoeXNpY2FsIG1haWxpbmcgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGRhdGE6IEFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGFkZHJlc3Mgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcHJpbWFyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGJlaW5nIHVzZWQgZm9yIGNvbW1lcmNpYWwgb3IgcmVzaWRlbnRpYWwgcHVycG9zZXMuICBOb3RlOiBUaGlzIHZhbHVlIHdpbGwgYmUgYG5vX2RhdGFgIHdoZW4gUGxhaWQgZG9lcyBub3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZGV0ZXJtaW5lIHRoZSBhZGRyZXNzXFwncyB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBZGRyZXNzUHVycG9zZUxhYmVsIHtcbiAgICBSZXNpZGVudGlhbCA9ICdyZXNpZGVudGlhbCcsXG4gICAgQ29tbWVyY2lhbCA9ICdjb21tZXJjaWFsJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZmZvcmRhYmlsaXR5IGluc2lnaHRzIGZvY3VzIG9uIHByb3ZpZGluZyBzaWduYWwgb24gdGhlIGFiaWxpdHkgb2YgYSBib3Jyb3dlciB0byByZXBheSB0aGVpciBsb2FuIHdpdGhvdXQgZXhwZXJpZW5jaW5nIGZpbmFuY2lhbCBzdHJhaW4uIEl0IHByb3ZpZGVzIGluc2lnaHRzIG9uIGZhY3RvcnMgc3VjaCBhcyBhIHVzZXJcXCdzIG1vbnRobHkgaW5jb21lIGFuZCBleHBlbnNlcywgZGlzcG9zYWJsZSBpbmNvbWUsIGF2ZXJhZ2UgZXhwZW5kaXR1cmUsIGV0Yy4sIGhlbHBpbmcgbGVuZGVycyBnYXVnZSB0aGUgbGV2ZWwgb2YgYWZmb3JkYWJpbGl0eSBvZiBhIGJvcnJvd2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZmZvcmRhYmlsaXR5SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZmZvcmRhYmlsaXR5SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHBlbmRpdHVyZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBZmZvcmRhYmlsaXR5SW5zaWdodHNcbiAgICAgKi9cbiAgICBleHBlbmRpdHVyZT86IEV4cGVuZGl0dXJlSW5zaWdodHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWZmb3JkYWJpbGl0eUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lPzogSW5jb21lSW5zaWdodHMgfCBudWxsO1xufVxuLyoqXG4gKiBBIG1vbmV0YXJ5IGFtb3VudCB3aXRoIGl0cyBhc3NvY2lhdGVkIGN1cnJlbmN5IGluZm9ybWF0aW9uLCBzdXBwb3J0aW5nIGJvdGggb2ZmaWNpYWwgYW5kIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFtb3VudFdpdGhDdXJyZW5jeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFtb3VudFdpdGhDdXJyZW5jeSB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBhcmVudCBvYmplY3QgcmVwcmVzZW50cyBhIGNhdGVnb3J5IG9mIHRyYW5zYWN0aW9ucywgc3VjaCBhcyBgdG90YWxfYW1vdW50YCwgYHRyYW5zZmVyc19pbmAsIGB0b3RhbF9pbmNvbWVgLCBldGMuIHRoZSBgYW1vdW50YCByZXByZXNlbnRzIHRoZSBzdW0gb2YgYWxsIG9mIHRoZSB0cmFuc2FjdGlvbnMgaW4gdGhlIGdyb3VwLiAgSWYgdGhlIHBhcmVudCBvYmplY3QgaXMgYGNhc2hfZmxvd2AsIHRoZSBgYW1vdW50YCByZXByZXNlbnRzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhbGwgdGhlIGluZmxvd3MgbWludXMgYWxsIHRoZSBvdXRmbG93cyBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0IGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdy4gIElmIHRoZSBwYXJlbnQgb2JqZWN0IGlzIGBtaW5pbXVtX2JhbGFuY2VgLCB0aGUgYGFtb3VudGAgcmVwcmVzZW50cyB0aGUgbG93ZXN0IGJhbGFuY2Ugb2YgdGhlIGFjY291bnQgZHVyaW5nIHRoZSBnaXZlbiB0aW1lIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gYW1vdW50IGFuZCBhIG1vbnRobHkgYXZlcmFnZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBbW91bnRXaXRoQ3VycmVuY3lXaXRoTW9udGhseUF2ZXJhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbW91bnRXaXRoQ3VycmVuY3lXaXRoTW9udGhseUF2ZXJhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBtb250aGx5IGF2ZXJhZ2UgYW1vdW50IG9mIGFsbCB0aGUgYWdncmVnYXRlZCB0cmFuc2FjdGlvbnMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBmb3IgdGhlIGdpdmVuIHRpbWUgd2luZG93LiAgVGhlIGF2ZXJhZ2UgaXMgY2FsY3VsYXRlZCBieSBkaXZpZGluZyB0aGUgdG90YWwgYW1vdW50IG9mIHRoZSB0cmFuc2FjdGlvbnMgYnkgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZVxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQW1vdW50V2l0aEN1cnJlbmN5V2l0aE1vbnRobHlBdmVyYWdlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFwcGxpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGAsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYXBwbGljYXRpb24gd2FzIGdyYW50ZWQgcHJvZHVjdGlvbiBhY2Nlc3MgYXQgUGxhaWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBqb2luX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGFwcGxpY2F0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbm5lY3RlZCBhcHAgc3RhdGluZyB3aHkgdGhleSB1c2UgdGhlaXIgcmVzcGVjdGl2ZSBlbmFibGVkIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVhc29uX2Zvcl9hY2Nlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIGNsaWVudFxcJ3MgYnJvYWQgdXNlIGNhc2UgYXMgYXNzZXNzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VfY2FzZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgY2xpZW50XFwncyBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb21wYW55X2xlZ2FsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjaXR5IG9mIHRoZSBjbGllbnRcXCdzIGhlYWRxdWFydGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZWdpb24gb2YgdGhlIGNsaWVudFxcJ3MgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zdGFsIGNvZGUgb2YgdGhlIGNsaWVudFxcJ3MgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IGNvZGUgb2YgdGhlIGNsaWVudFxcJ3MgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBcHBsaWNhdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgc2NoZW1hIGZvciBgL2FwcGxpY2F0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgLCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0RGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBc3NldCBBY2NvdW50IEN1cnJlbnQgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0Q3VycmVudEJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBtYXJrZXQgdmFsdWUgb2YgaG9sZGluZ3MgKG5vbi1yZXN0cmljdGVkLCB2ZXN0ZWQsIG5vdCBjcnlwdG8sIG5vdCBvdGhlciwgbm90IGNhc2gpIE5vdGU6IEFueSBlbXBsb3llciBzdG9jayBwbGFuIGJhbGFuY2UgbXVzdCBiZSBleGNsdWRlZCBmcm9tIHRoZSB0b3RhbCBhY2NvdW50IGJhbGFuY2UgKGlkZW50aWZpY2F0aW9uIGlzIFxcJ3N0b2NrIHBsYW5cXCcpXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdCYWxhbmNlQW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIb2xkaW5nc0JhbGFuY2UgbmV0IE1hcmdpbkFtb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nQmFsYW5jZU5ldE1hcmdpbkFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgbWFya2V0IHZhbHVlIG9mIGFsbCBib25kcyBoZWxkIChub24tcmVzdHJpY3RlZCwgdmVzdGVkKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRCb25kc0JhbGFuY2VBbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG1hcmtldCB2YWx1ZSBvZiBhbGwgc3RvY2tzIGhlbGQgKG5vbi1yZXN0cmljdGVkLCB2ZXN0ZWQsIG5vdCBlbXBsb3llciBzcG9uc29yZWQgc3RvY2sgcGxhbilcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0U3RvY2tzQmFsYW5jZUFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYmFsYW5jZSBvZiBhbGwgY3J5cHRvY3VycmVuY3kgaGVsZCAobm9uLXJlc3RyaWN0ZWQsIHZlc3RlZClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0Q3J5cHRvQmFsYW5jZUFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYmFsYW5jZSBvZiBhbGwgb3RoZXIgaG9sZGluZyB0eXBlcyAobm9uLXJlc3RyaWN0ZWQsIHZlc3RlZClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3RoZXJCYWxhbmNlQW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBsb2FuIGJhbGFuY2UgKGFtb3VudCBvd2VkIGJ5IGFjY291bnQgb3duZXIpXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldE1hcmdpbkFtb3VudEJhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGFtb3VudCBhdmFpbGFibGUgZm9yIGNhc2ggd2l0aGRyYXdhbFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRBdmFpbGFibGVDYXNoQmFsYW5jZUFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogY2FzaCBiYWxhbmNlIG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldENhc2hCYWxhbmNlQW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHlwZTogQXNzZXRUeXBlO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgQXNzZXQgRGVzY3JpcHRpb24uIFNvbWUgZXhhbXBsZXMgYXJlIEludmVzdG1lbnQgVGF4LURlZmVycmVkLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCwgUk9USCwgNTI5LCBCaWxsZXIsIFJPTExPVkVSLCBDRCwgU2F2aW5ncywgSW52ZXN0bWVudCBUYXhhYmxlLCBJUkEsIE1vcnRnYWdlLCBMaW5lIE9mIENyZWRpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHlwZUFkZGl0aW9uYWxEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gRXhhbXBsZTogV2hlbiBsb29raW5nIGZvciAzIG1vbnRocyBvZiBkYXRhIGZyb20gdGhlIEZJLCBwYXNzIGluIDkwIGRheXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERheXNSZXF1ZXN0ZWRDb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE93bmVyc2hpcCB0eXBlIG9mIHRoZSBhc3NldCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRPd25lcnNoaXBUeXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBhY2NvdW50IGlzIGEgcmV0aXJlbWVudCBhY2NvdW50IChlLmcuLCA0MDFLLCA0MDNiLCA0NTcsIHRocmlmdCBzYXZpbmdzIHBsYW5zLCB0cmFkaXRpb25hbCBhbmQgUm90aCwgSVJBcywgU0VQLUlSQSwgU0lNUExFLUlSQSwgS0VPR0gsIHN0YXRlIHJldGlyZW1lbnQgc2F2aW5ncyBwbGFucywgb3RoZXIgaW5kZXBlbmRlbnQgYW5kIElSUy1xdWFsaWZpZWQgZW1wbG95ZXIgcmV0aXJlbWVudCBwbGFucylcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0UmV0aXJlbWVudEluZGljYXRvcj86IEFzc2V0RGV0YWlsQXNzZXRSZXRpcmVtZW50SW5kaWNhdG9yRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IGlzIGVtcGxveWVyIHNwb25zb3JlZCByZXRpcmVtZW50IGFjY291bnQgb3Igbm90IChlLmcuLCA0MDFLLCA0MDNiLCA0NTcsIHRocmlmdCBzYXZpbmdzIHBsYW4pXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEVtcGxveWVyU3BvbnNvcmVkSW5kaWNhdG9yPzogQXNzZXREZXRhaWxBc3NldEVtcGxveWVyU3BvbnNvcmVkSW5kaWNhdG9yRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBc3NldERldGFpbEFzc2V0UmV0aXJlbWVudEluZGljYXRvckVudW0ge1xuICAgIFllcyA9ICdZZXMnLFxuICAgIE5vID0gJ05vJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBc3NldERldGFpbEFzc2V0RW1wbG95ZXJTcG9uc29yZWRJbmRpY2F0b3JFbnVtIHtcbiAgICBZZXMgPSAnWWVzJyxcbiAgICBObyA9ICdObydcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0SG9sZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRIb2xkZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyXG4gICAgICovXG4gICAgTkFNRTogQXNzZXRIb2xkZXJOYW1lO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0SG9sZGVyTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyTmFtZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVucGFyc2VkIG5hbWUgb2YgZWl0aGVyIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkZXJOYW1lXG4gICAgICovXG4gICAgRnVsbE5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldEhvbGRpbmcge1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZCBvZiBpbnZlc3RtZW50IHBvc2l0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nSUQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVVMgRG9sbGFyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQ3VycmVuY3k6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgaG9sZGluZ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGluZ1xuICAgICAqL1xuICAgIEFzc2V0SG9sZGluZ0Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEludmVzdG1lbnQgcG9zaXRpb25cXCdzIG1hcmtldCB0aWNrZXIgc3ltYm9sXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nU3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlY3VyaXR5IG5hbWUgb2YgaW52ZXN0bWVudCBob2xkaW5nXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nU2VjdXJpdHlOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB1bml0cyBvZiBob2xkaW5nXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nVW5pdHM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogbWFya2V0IHZhbHVlIG9mIGludmVzdG1lbnQgcG9zaXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdNYXJrZXRWYWx1ZUFtb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBjdXJyZW50IHByaWNlIG9mIGludmVzdG1lbnQgaG9sZGluZ1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGluZ1xuICAgICAqL1xuICAgIEFzc2V0SG9sZGluZ0N1cnJlbnRQcmljZUFtb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIGhvbGRpbmcgKGUuZy4gYm9uZCwgc3RvY2ssIGNyeXB0bywgb3RoZXIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRIb2xkaW5nXG4gICAgICovXG4gICAgQXNzZXRIb2xkaW5nVHlwZTogQXNzZXRIb2xkaW5nQXNzZXRIb2xkaW5nVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHN0b2NrIGlzIHJlc3RyaWN0ZWQsIGkuZS4gXFxcIlJlc3RyaWN0ZWRcXFwiIG9yIFxcXCJOb3QgUmVzdHJpY3RlZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdSZXN0cmljdGVkSW5kaWNhdG9yOiBBc3NldEhvbGRpbmdBc3NldEhvbGRpbmdSZXN0cmljdGVkSW5kaWNhdG9yRW51bTtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgaG9sZGluZyB2ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRpbmdcbiAgICAgKi9cbiAgICBBc3NldEhvbGRpbmdWZXN0ZWRBbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQXNzZXRIb2xkaW5nQXNzZXRIb2xkaW5nVHlwZUVudW0ge1xuICAgIEJvbmQgPSAnQm9uZCcsXG4gICAgU3RvY2sgPSAnU3RvY2snLFxuICAgIENyeXB0byA9ICdDcnlwdG8nLFxuICAgIE90aGVyID0gJ090aGVyJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBc3NldEhvbGRpbmdBc3NldEhvbGRpbmdSZXN0cmljdGVkSW5kaWNhdG9yRW51bSB7XG4gICAgWWVzID0gJ1llcycsXG4gICAgTm8gPSAnTm8nXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRpbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRIb2xkaW5ncyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGluZ3NcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xESU5HOiBBcnJheTxBc3NldEhvbGRpbmc+O1xufVxuLyoqXG4gKiBBc3NldCBJbnZlc3RtZW50IFRyYW5zYWN0aW9uIFR5cGUgRW51bWVyYXRlZCBkZXJpdmVkIGJ5IFZlbmRvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQnV5ID0gJ0J1eScsXG4gICAgU2VsbCA9ICdTZWxsJyxcbiAgICBEaXZpZGVuZHMgPSAnRGl2aWRlbmRzJyxcbiAgICBJbnRlcmVzdCA9ICdJbnRlcmVzdCcsXG4gICAgVHJhbnNmZXJzID0gJ1RyYW5zZmVycycsXG4gICAgUmVpbnZlc3RtZW50cyA9ICdSZWludmVzdG1lbnRzJyxcbiAgICBGdW5kc1JlY2VpdmVkID0gJ0Z1bmRzUmVjZWl2ZWQnLFxuICAgIE90aGVyID0gJ090aGVyJ1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXIge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXJzIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXAgdG8gNCBhY2NvdW50IG93bmVyc1xcJyBmdWxsIG5hbWVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGluc2lnaHRzPzogQWNjb3VudEluc2lnaHRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudC4gQmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgYmFsYW5jZSBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsLXRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgYm9ycm93ZWQgZnVuZHMgaW4gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gRm9yIGludmVzdG1lbnQtdHlwZSBhY2NvdW50cywgdGhlIG1hcmdpbiBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBib3Jyb3dlZCBhc3NldHMgaW4gdGhlIGFjY291bnQsIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uIFRoaXMgaXMgY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMgbWFyZ2luIG9yIGEgbG9hbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbWFyZ2luX2xvYW5fYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBhbmQgZXhwZWN0ZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgYW5kIHRoZSBJdGVtIGNvbnRhaW5zIG9uZSBvciBtb3JlIGFjY291bnRzIHdpdGggYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IHR5cGUsIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBDYXBpdGFsIE9uZSBkZXBvc2l0b3J5IGFjY291bnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGFjY291bnQgdHlwZXMgb24gYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBTZWUgW2FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgYWNjb3VudCB0eXBlcy4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCBmb3IgSXRlbXMgd2l0aCB0aGlzIGZpZWxkIHJlcXVpcmVkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFkZC1vbnMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIEFzc2V0IFJlcG9ydC4gIGBpbnZlc3RtZW50c2A6IFRoZSBJbnZlc3RtZW50cyBhZGQtb24gYGZhc3RfYXNzZXRzYDogVGhlIEZhc3QgQXNzZXRzIGFkZC1vblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRSZXBvcnRBZGRPbnMge1xuICAgIEludmVzdG1lbnRzID0gJ2ludmVzdG1lbnRzJyxcbiAgICBGYXN0QXNzZXRzID0gJ2Zhc3RfYXNzZXRzJ1xufVxuXG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0b3JfaWRgIG9mIHRoZSB0aGlyZCBwYXJ0eSB3aXRoIHdob20geW91IHdvdWxkIGxpa2UgdG8gc2hhcmUgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdG9yX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIGdldCBhcyBhIFBERi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIEF1ZGl0IENvcHkgeW91IHdvdWxkIGxpa2UgdG8gcmV2b2tlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBdWRpdCBDb3B5IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBJdGVtcyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gVGhlIGBhc3NldHNgIHByb2R1Y3QgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgZm9yIHRoZSBJdGVtcyBkdXJpbmcgTGluazsgdGhlIEFzc2V0cyBwcm9kdWN0IGNhbm5vdCBiZSBhZGRlZCBhZnRlciBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gaW50ZWdlciBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC4gSWYgdXNpbmcgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHksIGBkYXlzX3JlcXVlc3RlZGAgbXVzdCBiZSBhdCBsZWFzdCA2MSBmb3IgbmV3IG9yaWdpbmF0aW9ucyBvciBhdCBsZWFzdCAzMSBmb3IgcmVmaW5hbmNpbmdzLiAgQW4gQXNzZXQgUmVwb3J0IHJlcXVlc3RlZCB3aXRoIFxcXCJBZGRpdGlvbmFsIEhpc3RvcnlcXFwiICh0aGF0IGlzLCB3aXRoIG1vcmUgdGhhbiA2MSBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkpIHdpbGwgaW5jdXIgYW4gQWRkaXRpb25hbCBIaXN0b3J5IGZlZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuIFRoZSBvcHRpb25hbCBgdXNlcmAgb2JqZWN0IGlzIHJlcXVpcmVkIGZvciB0aGUgcmVwb3J0IHRvIGJlIGVsaWdpYmxlIGZvciBGYW5uaWUgTWFlXFwncyBEYXkgMSBDZXJ0YWludHkgcHJvZ3JhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBBc3NldHMgd2ViaG9va3MsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RlZCBBc3NldCBSZXBvcnQgaXMgcmVhZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIHRydWUgdG8gcmV0dXJuIGJhbGFuY2UgYW5kIGlkZW50aXR5IGVhcmxpZXIgYXMgYSBmYXN0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9mYXN0X3JlcG9ydD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGFzc2V0IHJlcG9ydC4gUG9zc2libGUgdmFsdWVzOiBgXFxcImludmVzdG1lbnRzXFxcImBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhZGQtb25zIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBBc3NldCBSZXBvcnQuICBXaGVuIEZhc3QgQXNzZXRzIGlzIHJlcXVlc3RlZCwgUGxhaWQgd2lsbCBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IHRoZSBGYXN0IEFzc2V0IFJlcG9ydCwgd2hpY2ggd2lsbCBjb250YWluIG9ubHkgSWRlbnRpdHkgYW5kIEJhbGFuY2UgaW5mb3JtYXRpb24sIGFuZCB0aGUgRnVsbCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgYWxzbyBjb250YWluIFRyYW5zYWN0aW9ucyBpbmZvcm1hdGlvbi4gQSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vayB3aWxsIGJlIGZpcmVkIGZvciBlYWNoIEFzc2V0IFJlcG9ydCB3aGVuIGl0IGlzIHJlYWR5LCBhbmQgdGhlIGByZXBvcnRfdHlwZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB3ZWJob29rIGlzIGZpcmluZyBmb3IgdGhlIGBGVUxMYCBvciBgRkFTVGAgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCB3aXRoIGBmYXN0X3JlcG9ydGAgc2V0IHRvIGB0cnVlYC4gVGhlcmUgaXMgbm8gYWRkaXRpb25hbCBjaGFyZ2UgZm9yIHVzaW5nIEZhc3QgQXNzZXRzLiBUbyBjcmVhdGUgYSBGYXN0IEFzc2V0IFJlcG9ydCwgUGxhaWQgbXVzdCBzdWNjZXNzZnVsbHkgcmV0cmlldmUgYm90aCBJZGVudGl0eSBhbmQgQmFsYW5jZSBkYXRhOyBpZiBQbGFpZCBlbmNvdW50ZXJzIGFuIGVycm9yIG9idGFpbmluZyB0aGlzIGRhdGEsIHRoZSBGYXN0IEFzc2V0IFJlcG9ydCB3aWxsIG5vdCBiZSBjcmVhdGVkLiBIb3dldmVyLCBhcyBsb25nIGFzIFBsYWlkIGNhbiBvYnRhaW4gVHJhbnNhY3Rpb25zIGRhdGEsIHRoZSBGdWxsIEFzc2V0IFJlcG9ydCB3aWxsIHN0aWxsIGJlIGF2YWlsYWJsZS4gIFdoZW4gSW52ZXN0bWVudHMgaXMgcmVxdWVzdGVkLCBgaW52ZXN0bWVudHNgIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBgb3B0aW9uYWxfcHJvZHVjdHNgIGFycmF5IHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0QWRkT25zPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFkZF9vbnM/OiBBcnJheTxBc3NldFJlcG9ydEFkZE9ucz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHVzZXI/OiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCAoYHRydWVgKSwgdGhlIGFzeW5jaHJvbm91cyByZXBvcnQgZ2VuZXJhdGlvbiBmYWlscyB1bmxlc3MgYWxsIEl0ZW1zIGV4dHJhY3Qgc3VjY2Vzc2Z1bGx5LiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIHJlcG9ydCB3aWxsIHN0aWxsIGJlIGdlbmVyYXRlZCBhcyBsb25nIGFzIGF0IGxlYXN0IG9uZSBJdGVtIGV4dHJhY3RzIHN1Y2Nlc3NmdWxseTsgZXh0cmFjdGlvbiBmYWlsdXJlcyBvbiB0aGUgcmVtYWluaW5nIEl0ZW1zIGFyZSB0b2xlcmF0ZWQuIFRoaXMgc2V0dGluZyBhcHBsaWVzIG9ubHkgdG8gZmFpbHVyZXMgdGhhdCBvY2N1ciBkdXJpbmcgYXN5bmNocm9ub3VzIGV4dHJhY3Rpb24uIEl0IGRvZXMgbm90IHJlbGF4IHRoZSBzeW5jaHJvbm91cyBjaGVjayBhdCBjYWxsIHRpbWU6IGlmIGFueSBJdGVtIGlzIGFscmVhZHkgdW5oZWFsdGh5IHdoZW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBpcyBpbnZva2VkLCB0aGUgcmVxdWVzdCBmYWlscyBpbW1lZGlhdGVseSByZWdhcmRsZXNzIG9mIHRoaXMgdmFsdWUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1aXJlX2FsbF9pdGVtcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRGcmVkZGllfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIERFQUw6IEFzc2V0UmVwb3J0RnJlZGRpZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMgKGFrYSBWT0Egb3IgRnJlZGRpZSBNYWMgU2NoZW1hKSBzY2hlbWEgdmVyc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIFNjaGVtYVZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGZvciB3aGljaCB0byBjcmVhdGUgYW4gYXNzZXQgcmVwb3J0IGZvci4gVGhlIGxhdGVzdCBhc3NldCByZXBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB5b3Ugd291bGQgbGlrZSB0byByZXRyaWV2ZSB0aGUgQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGBmYWxzZWAgb3RoZXJ3aXNlLiBUaGlzIGZpZWxkIGRlZmF1bHRzIHRvIGBmYWxzZWAgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnNpZ2h0cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGZldGNoIFxcXCJmYXN0XFxcIiB2ZXJzaW9uIG9mIGFzc2V0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC4gQ2FuIG9ubHkgYmUgdXNlZCBpZiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdhcyBjYWxsZWQgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGZhc3RfcmVwb3J0PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgb3IgYWRkIGRhdGEgdG8gYC9hc3NldF9yZXBvcnQvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfdG9faW5jbHVkZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IEFzc2V0UmVwb3J0O1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBBc3NldCBSZXBvcnQgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgaWRlbnRpdHkgaW5mb3JtYXRpb24gY2Fubm90IGJlIHJldHVybmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxXYXJuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBzZWN1cml0aWVzIGhvbGRpbmcgYXQgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgc2VjdXJpdHlfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gU2VjdXJpdHkgZGF0YSBpcyBub3Qgc3BlY2lmaWMgdG8gYSB1c2VyXFwncyBhY2NvdW50OyBhbnkgdXNlciB3aG8gaGVsZCB0aGUgc2FtZSBzZWN1cml0eSBhdCB0aGUgc2FtZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXQgdGhlIHNhbWUgdGltZSB3b3VsZCBoYXZlIGlkZW50aWNhbCBzZWN1cml0eSBkYXRhLiBUaGUgYHNlY3VyaXR5X2lkYCBmb3IgdGhlIHNhbWUgc2VjdXJpdHkgd2lsbCB0eXBpY2FsbHkgYmUgdGhlIHNhbWUgYWNyb3NzIGRpZmZlcmVudCBpbnN0aXR1dGlvbnMsIGJ1dCB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLiBUaGUgYHNlY3VyaXR5X2lkYCBkb2VzIG5vdCB0eXBpY2FsbHkgY2hhbmdlLCBidXQgbWF5IGNoYW5nZSBpZiBpbmhlcmVudCBkZXRhaWxzIG9mIHRoZSBzZWN1cml0eSBjaGFuZ2UgZHVlIHRvIGEgY29ycG9yYXRlIGFjdGlvbiwgZm9yIGV4YW1wbGUsIGluIHRoZSBldmVudCBvZiBhIHRpY2tlciBzeW1ib2wgY2hhbmdlIG9yIENVU0lQIGNoYW5nZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ1xcJ3MgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBob2xkaW5ncywgYW5kIG90aGVyd2lzZSBhIHNob3J0IGlkZW50aWZpZXIgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBob2xkaW5nLCBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHRvdGFsIHZhbHVlIG9mIHRoZSBob2xkaW5nLiBUaGlzIGZpZWxkIGlzIGNhbGN1bGF0ZWQgYnkgUGxhaWQgYXMgdGhlIHN1bSBvZiB0aGUgcHVyY2hhc2UgcHJpY2Ugb2YgYWxsIG9mIHRoZSBzaGFyZXMgaW4gdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGNvc3RfYmFzaXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHRoZSBhc3NldCBoZWxkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgc2VjdXJpdHkgaXMgYW4gb3B0aW9uLCBgcXVhbnRpdHlgIHdpbGwgcmVmbGVjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG9wdGlvbnMgKHR5cGljYWxseSB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cyBtdWx0aXBsaWVkIGJ5IDEwMCksIG5vdCB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5XFwncyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBJbnZlc3RtZW50IHRyYW5zYWN0aW9uLCB1bmlxdWUgYWNyb3NzIGFsbCBQbGFpZCB0cmFuc2FjdGlvbnMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9uXFwncyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHZlc3RlZCBhc3NldHMgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVmVzdGVkIGFzc2V0cyBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggW2VxdWl0aWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHMtaG9sZGluZ3MtZ2V0LXJlc3BvbnNlLXNlY3VyaXRpZXMtdHlwZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHZlc3RlZCBob2xkaW5ncyBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB2ZXN0ZWRfdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGxldGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGRlYml0ZWQsIGUuZy4gcHVyY2hhc2VzIG9mIHN0b2NrOyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGNyZWRpdGVkLCBlLmcuIHNhbGVzIG9mIHN0b2NrLiBUcmVhdG1lbnQgcmVtYWlucyB0aGUgc2FtZSBmb3IgY2FzaC1vbmx5IG1vdmVtZW50cyB1bmFzc29jaWF0ZWQgd2l0aCBzZWN1cml0aWVzLiBGb3IgdHJhbnNhY3Rpb25zIHJlcHJlc2VudGluZyBhIHNpbXVsdGFuZW91cyBjYXNoIGNvbnRyaWJ1dGlvbiBhbmQgcHVyY2hhc2Ugb2YgYSBzZWN1cml0eSwgdGhlIHBvcnRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHJlcHJlc2VudGluZyB0aGUgcHVyY2hhc2UgdGFrZXMgcHJlY2VkZW5jZSwgYW5kIHRoZSBgYW1vdW50YCBpcyByZXByZXNlbnRlZCBhcyBwb3NpdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmVlczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzZXQgb2YgZmllbGRzIGRlc2NyaWJpbmcgdGhlIGludmVzdG1lbnRzIGRhdGEgb24gYW4gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFF1YW50aXRpZXMgYW5kIHZhbHVlcyBvZiBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGludmVzdG1lbnQgYWNjb3VudC4gTWFwIHRvIHRoZSBgc2VjdXJpdGllc2AgYXJyYXkgZm9yIHNlY3VyaXR5IGRldGFpbHMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaG9sZGluZ3M/OiBBcnJheTxBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9mIHNwZWNpZmljIHNlY3VyaXRpZXMgaGVsZCBpbiBvbiB0aGUgaW52ZXN0bWVudCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzPzogQXJyYXk8QXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3Rvcnkgb24gdGhlIGludmVzdG1lbnQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8QXNzZXRSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGFuIEFzc2V0IFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGRhdGVfbGFzdF91cGRhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QXNzZXRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRBc3NldHM+O1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgb3IgYWRkIGRhdGEgdG8gYC9hc3NldF9yZXBvcnQvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gaW50ZWdlciBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c190b19pbmNsdWRlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuZWQgYnkgdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC4gTXVzdCBiZSBhbiBpbnRlZ2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgY2Fubm90IGJlIGBudWxsYC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIEFzc2V0cyB3ZWJob29rcywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdGVkIEFzc2V0IFJlcG9ydCBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdXNlcj86IEFzc2V0UmVwb3J0VXNlcjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEFzc2V0IFJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIG9uIHRoZSBhc3NldCByZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY3JlZGl0X2NhdGVnb3J5PzogQ3JlZGl0Q2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgdHJhbnNhY3Rpb24gdG9vayBwbGFjZSwgaW4gSVNPIDg2MDEgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uIFRoaXMgaXMgYSBsZWdhY3kgZmllbGQgdGhhdCBpcyBubyBsb25nZXIgbWFpbnRhaW5lZC4gRm9yIG1lcmNoYW50IG5hbWUsIHVzZSB0aGUgYG1lcmNoYW50X25hbWVgIGZpZWxkLiBGb3IgZGVzY3JpcHRpb24sIHVzZSB0aGUgYG9yaWdpbmFsX2Rlc2NyaXB0aW9uYCBmaWVsZC4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE/OiBQYXltZW50TWV0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogQXNzZXRSZXBvcnRUcmFuc2FjdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV9pZD86IHN0cmluZztcbn1cbi8qKlxuICogYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgRGlnaXRhbCA9ICdkaWdpdGFsJyxcbiAgICBQbGFjZSA9ICdwbGFjZScsXG4gICAgU3BlY2lhbCA9ICdzcGVjaWFsJyxcbiAgICBVbnJlc29sdmVkID0gJ3VucmVzb2x2ZWQnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGVpdGhlciBhIEZhc3QgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGNvbnRhaW4gb25seSBjdXJyZW50IGlkZW50aXR5IGFuZCBiYWxhbmNlIGluZm9ybWF0aW9uLCBvciBhIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBoaXN0b3JpY2FsIGJhbGFuY2UgaW5mb3JtYXRpb24gYW5kIHRyYW5zYWN0aW9uIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydFR5cGUge1xuICAgIEZ1bGwgPSAnRlVMTCcsXG4gICAgRmFzdCA9ICdGQVNUJ1xufVxuXG4vKipcbiAqIFRoZSB1c2VyIG9iamVjdCBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciB0byBiZSBhcHBlbmRlZCB0byB0aGUgQXNzZXQgUmVwb3J0LiBBbGwgZmllbGRzIGFyZSBvcHRpb25hbC4gVGhlIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGFuZCBgc3NuYCBmaWVsZHMgYXJlIHJlcXVpcmVkIGlmIHlvdSB3b3VsZCBsaWtlIHRoZSBSZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFVzZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgeW91IGRldGVybWluZSBhbmQgc3VibWl0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZS4gIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uICBGb3JtYXQ6IFxcXCJkZGQtZGQtZGRkZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZy4uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVRBSUw6IEFzc2V0VHJhbnNhY3Rpb25EZXRhaWw7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLiBOb3RlIHRoYXQgXFxcIkRFU0NSSVBUT05cXFwiIGlzIGFuIGludGVudGlvbmFsIG1pc3NwZWxsaW5nIG1hdGNoaW5nIHRoZSB1cHN0cmVhbSBNSVNNTyBmaWVsZCBuYW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogQXNzZXQgVHJhbnNhY3Rpb24gQ2F0ZWdvcnkgVHlwZSBFbnVtZXJhdGVkIGRlcml2ZWQgYnkgVmVuZG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB7XG4gICAgQXRtRmVlID0gJ0FUTUZlZScsXG4gICAgQWR2ZXJ0aXNpbmcgPSAnQWR2ZXJ0aXNpbmcnLFxuICAgIEFpclRyYXZlbCA9ICdBaXJUcmF2ZWwnLFxuICAgIEFsY29ob2xCYXJzID0gJ0FsY29ob2xCYXJzJyxcbiAgICBBbGxvd2FuY2UgPSAnQWxsb3dhbmNlJyxcbiAgICBBbXVzZW1lbnQgPSAnQW11c2VtZW50JyxcbiAgICBBcnRzID0gJ0FydHMnLFxuICAgIEF1dG9UcmFuc3BvcnQgPSAnQXV0b1RyYW5zcG9ydCcsXG4gICAgQXV0b0luc3VyYW5jZSA9ICdBdXRvSW5zdXJhbmNlJyxcbiAgICBBdXRvUGF5bWVudCA9ICdBdXRvUGF5bWVudCcsXG4gICAgQmFieVN1cHBsaWVzID0gJ0JhYnlTdXBwbGllcycsXG4gICAgQmFieXNpdHRlckRheWNhcmUgPSAnQmFieXNpdHRlckRheWNhcmUnLFxuICAgIEJhbmtGZWUgPSAnQmFua0ZlZScsXG4gICAgQmlsbHNVdGlsaXRpZXMgPSAnQmlsbHNVdGlsaXRpZXMnLFxuICAgIEJvbnVzID0gJ0JvbnVzJyxcbiAgICBCb29rc1N1cHBsaWVzID0gJ0Jvb2tzU3VwcGxpZXMnLFxuICAgIEJ1c2luZXNzU2VydmljZXMgPSAnQnVzaW5lc3MgU2VydmljZXMnLFxuICAgIEJ1eSA9ICdCdXknLFxuICAgIENhc2hBdG0gPSAnQ2FzaEFUTScsXG4gICAgQ2hhcml0eSA9ICdDaGFyaXR5JyxcbiAgICBDaGVjayA9ICdDaGVjaycsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NoaWxkU3VwcG9ydCcsXG4gICAgQ2xvdGhpbmcgPSAnQ2xvdGhpbmcnLFxuICAgIENvZmZlZVNob3BzID0gJ0NvZmZlZVNob3BzJyxcbiAgICBDcmVkaXRDYXJkUGF5bWVudCA9ICdDcmVkaXRDYXJkUGF5bWVudCcsXG4gICAgRGVudGlzdCA9ICdEZW50aXN0JyxcbiAgICBEb2N0b3IgPSAnRG9jdG9yJyxcbiAgICBFZHVjYXRpb24gPSAnRWR1Y2F0aW9uJyxcbiAgICBFbGVjdHJvbmljc1NvZnR3YXJlID0gJ0VsZWN0cm9uaWNzU29mdHdhcmUnLFxuICAgIEVudGVydGFpbm1lbnQgPSAnRW50ZXJ0YWlubWVudCcsXG4gICAgRXllY2FyZSA9ICdFeWVjYXJlJyxcbiAgICBGYXN0Rm9vZCA9ICdGYXN0Rm9vZCcsXG4gICAgRmVkZXJhbFRheCA9ICdGZWRlcmFsVGF4JyxcbiAgICBGZWVzQ2hhcmdlcyA9ICdGZWVzQ2hhcmdlcycsXG4gICAgRmluYW5jZUNoYXJnZSA9ICdGaW5hbmNlQ2hhcmdlJyxcbiAgICBGaW5hbmNpYWwgPSAnRmluYW5jaWFsJyxcbiAgICBGaW5hbmNpYWxBZHZpc29yID0gJ0ZpbmFuY2lhbEFkdmlzb3InLFxuICAgIEZvb2REaW5pbmcgPSAnRm9vZERpbmluZycsXG4gICAgRnVybmlzaGluZ3MgPSAnRnVybmlzaGluZ3MnLFxuICAgIEdhc0Z1ZWwgPSAnR2FzRnVlbCcsXG4gICAgR2lmdHNEb25hdGlvbnMgPSAnR2lmdHNEb25hdGlvbnMnLFxuICAgIEdyb2NlcmllcyA9ICdHcm9jZXJpZXMnLFxuICAgIEd5bSA9ICdHeW0nLFxuICAgIEhhaXIgPSAnSGFpcicsXG4gICAgSGVhbHRoRml0bmVzcyA9ICdIZWFsdGhGaXRuZXNzJyxcbiAgICBIZWFsdGhJbnN1cmFuY2UgPSAnSGVhbHRoSW5zdXJhbmNlJyxcbiAgICBIb2JiaWVzID0gJ0hvYmJpZXMnLFxuICAgIEhvbWUgPSAnSG9tZScsXG4gICAgSG9tZUltcHJvdmVtZW50ID0gJ0hvbWVJbXByb3ZlbWVudCcsXG4gICAgSG9tZUluc3VyYW5jZSA9ICdIb21lSW5zdXJhbmNlJyxcbiAgICBIb21lUGhvbmUgPSAnSG9tZVBob25lJyxcbiAgICBIb21lU2VydmljZXMgPSAnSG9tZVNlcnZpY2VzJyxcbiAgICBIb21lU3VwcGxpZXMgPSAnSG9tZVN1cHBsaWVzJyxcbiAgICBIb3RlbCA9ICdIb3RlbCcsXG4gICAgSW5jb21lID0gJ0luY29tZScsXG4gICAgSW50ZXJlc3RJbmNvbWUgPSAnSW50ZXJlc3RJbmNvbWUnLFxuICAgIEludGVybmV0ID0gJ0ludGVybmV0JyxcbiAgICBJbnZlc3RtZW50cyA9ICdJbnZlc3RtZW50cycsXG4gICAgS2lkcyA9ICdLaWRzJyxcbiAgICBLaWRzQWN0aXZpdGllcyA9ICdLaWRzQWN0aXZpdGllcycsXG4gICAgTGF0ZUZlZSA9ICdMYXRlRmVlJyxcbiAgICBMYXVuZHJ5ID0gJ0xhdW5kcnknLFxuICAgIExhd25HYXJkZW4gPSAnTGF3bkdhcmRlbicsXG4gICAgTGVnYWwgPSAnTGVnYWwnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnTGlmZUluc3VyYW5jZScsXG4gICAgTG9hbkluc3VyYW5jZSA9ICdMb2FuSW5zdXJhbmNlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdMb2FuUGF5bWVudCcsXG4gICAgTG9hbnMgPSAnTG9hbnMnLFxuICAgIE1vYmlsZVBob25lID0gJ01vYmlsZVBob25lJyxcbiAgICBNb3J0Z2FnZVJlbnQgPSAnTW9ydGdhZ2VSZW50JyxcbiAgICBNb3ZpZXNEdmRzID0gJ01vdmllc0RWRHMnLFxuICAgIE11c2ljID0gJ011c2ljJyxcbiAgICBOZXdzcGFwZXJzTWFnYXppbmVzID0gJ05ld3NwYXBlcnNNYWdhemluZXMnLFxuICAgIE9mZmljZVN1cHBsaWVzID0gJ09mZmljZVN1cHBsaWVzJyxcbiAgICBQYXJraW5nID0gJ1BhcmtpbmcnLFxuICAgIFBheWNoZWNrID0gJ1BheWNoZWNrJyxcbiAgICBQZXJzb25hbENhcmUgPSAnUGVyc29uYWxDYXJlJyxcbiAgICBQZXRGb29kU3VwcGxpZXMgPSAnUGV0Rm9vZFN1cHBsaWVzJyxcbiAgICBQZXRHcm9vbWluZyA9ICdQZXRHcm9vbWluZycsXG4gICAgUGV0cyA9ICdQZXRzJyxcbiAgICBQaGFybWFjeSA9ICdQaGFybWFjeScsXG4gICAgUHJpbnRpbmcgPSAnUHJpbnRpbmcnLFxuICAgIFByb3BlcnR5VGF4ID0gJ1Byb3BlcnR5IFRheCcsXG4gICAgUHVibGljVHJhbnNwb3J0YXRpb24gPSAnUHVibGljIFRyYW5zcG9ydGF0aW9uJyxcbiAgICBSZWltYnVyc2VtZW50ID0gJ1JlaW1idXJzZW1lbnQnLFxuICAgIFJlbnRhbENhclRheGkgPSAnUmVudGFsQ2FyVGF4aScsXG4gICAgUmVzdGF1cmFudHMgPSAnUmVzdGF1cmFudHMnLFxuICAgIFNhbGVzVGF4ID0gJ1NhbGVzVGF4JyxcbiAgICBTZXJ2aWNlUGFydHMgPSAnU2VydmljZVBhcnRzJyxcbiAgICBTZXJ2aWNlRmVlID0gJ1NlcnZpY2VGZWUnLFxuICAgIFNoaXBwaW5nID0gJ1NoaXBwaW5nJyxcbiAgICBTaG9wcGluZyA9ICdTaG9wcGluZycsXG4gICAgU3BhTWFzc2FnZSA9ICdTcGFNYXNzYWdlJyxcbiAgICBTcG9ydGluZ0dvb2RzID0gJ1Nwb3J0aW5nR29vZHMnLFxuICAgIFNwb3J0cyA9ICdTcG9ydHMnLFxuICAgIFN0YXRlVGF4ID0gJ1N0YXRlVGF4JyxcbiAgICBTdHVkZW50TG9hbiA9ICdTdHVkZW50IExvYW4nLFxuICAgIFRheGVzID0gJ1RheGVzJyxcbiAgICBUZWxldmlzaW9uID0gJ1RlbGV2aXNpb24nLFxuICAgIFRveXMgPSAnVG95cycsXG4gICAgVHJhbnNmZXIgPSAnVHJhbnNmZXInLFxuICAgIFRyYXZlbCA9ICdUcmF2ZWwnLFxuICAgIFR1aXRpb24gPSAnVHVpdGlvbicsXG4gICAgVW5jYXRlZ29yaXplZCA9ICdVbmNhdGVnb3JpemVkJyxcbiAgICBVdGlsaXRpZXMgPSAnVXRpbGl0aWVzJyxcbiAgICBWYWNhdGlvbiA9ICdWYWNhdGlvbicsXG4gICAgVmV0ZXJpbmFyeSA9ICdWZXRlcmluYXJ5J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEZXNjcmlwdGlvbiBTdHJpbmcgdXAgdG8gMyBvY2N1cnJlbmNlcyAxIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvblxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uVW5pcXVlSWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IFRyYW5zYWN0aW9uIEFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IFRyYW5zYWN0aW9uIERhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25EYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gUG9zdCBEYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUG9zdERhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uVHlwZTogQXNzZXRUcmFuc2FjdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZT86IEFzc2V0SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUG9wdWxhdGUgd2l0aCB3aG8gZGlkIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblBhaWRCeU5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUG9wdWxhdGUgd2l0aCBmb3Igd2hvbSB0aGUgdHJhbnNhY3Rpb24gaXMgZG9uZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUGFpZFRvTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgUHJvdmlkZWQgLSBleGFtcGxlcyBhcmUgYXRtLCBjYXNoLCBjaGVjaywgY3JlZGl0LCBkZWJpdCwgZGVwb3NpdCwgZGlyZWN0RGViaXQsIGRpcmVjdERlcG9zaXQsIGRpdmlkZW5kLCBmZWUsIGludGVyZXN0LCBvdGhlciwgcGF5bWVudCwgcG9pbnRPZlNhbGUsIHJlcGVhdFBheW1lbnQsIHNlcnZpY2VDaGFyZ2UsIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uVHlwZUFkZGl0aW9uYWxEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBc3NldCBJbnZlc3RtZW50IFRyYW5zYWN0aW9uIFR5cGUgRGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZURlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZTogQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgcHJvdmlkZWQgVHJhbnNhY3Rpb24gSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2FjdGlvbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIFR5cGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQ3JlZGl0ID0gJ0NyZWRpdCcsXG4gICAgRGViaXQgPSAnRGViaXQnXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgZmluYW5jaWFsIGFzc2V0cyBpbiBhIG1vcnRnYWdlIGxvYW4gdHJhbnNhY3Rpb24uIEFzc2V0cyBtYXkgYmUgZWl0aGVyIGxpcXVpZCBvciBmaXhlZCBhbmQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgYXNzZXQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUeXBlIHtcbiAgICBDaGVja2luZ0FjY291bnQgPSAnQ2hlY2tpbmdBY2NvdW50JyxcbiAgICBTYXZpbmdzQWNjb3VudCA9ICdTYXZpbmdzQWNjb3VudCcsXG4gICAgSW52ZXN0bWVudCA9ICdJbnZlc3RtZW50JyxcbiAgICBNb25leU1hcmtldEZ1bmQgPSAnTW9uZXlNYXJrZXRGdW5kJyxcbiAgICBPdGhlciA9ICdPdGhlcidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldD59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxBc3NldD47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBBc3NldCBSZXBvcnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGlzIHJlYWR5IHRvIGJlIGNhbGxlZC4gIElmIHlvdSBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBiZWZvcmUgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgeW91XFwnbGwgcmVjZWl2ZSBhIHJlc3BvbnNlIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgNDAwIGFuZCBhIFBsYWlkIGVycm9yIGNvZGUgb2YgYFBST0RVQ1RfTk9UX1JFQURZYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgQXNzZXQgUmVwb3J0IHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZT86IEFzc2V0UmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUGxhaWQgd2lsbCB0cmlnZ2VyIGEgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIGZvciBJdGVtcyB0aGF0IHVuZGVyZ28gYSBjaGFuZ2UgaW4gQXV0aCBkYXRhLiBUaGlzIGlzIGdlbmVyYWxseSBjYXVzZWQgYnkgZGF0YSBwYXJ0bmVycyBub3RpZnlpbmcgUGxhaWQgb2YgYSBjaGFuZ2UgaW4gdGhlaXIgYWNjb3VudCBudW1iZXJpbmcgc3lzdGVtIG9yIHRvIHRoZWlyIHJvdXRpbmcgbnVtYmVycy4gVG8gYXZvaWQgcmV0dXJuZWQgdHJhbnNhY3Rpb25zLCBjdXN0b21lcnMgdGhhdCByZWNlaXZlIGEgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHdpdGggdGhlIGBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfYXV0aGAgb2JqZWN0IHBvcHVsYXRlZCBzaG91bGQgaW1tZWRpYXRlbHkgZGlzY29udGludWUgYWxsIHVzYWdlcyBvZiBleGlzdGluZyBBdXRoIGRhdGEgZm9yIHRob3NlIGFjY291bnRzIGFuZCBjYWxsIGAvYXV0aC9nZXRgIG9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCB0byBvYnRhaW4gdXBkYXRlZCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgXFwncyBmb3IgYWNjb3VudHMgdGhhdCBjb250YWluIG5ldyBhdXRoLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX25ld19hdXRoOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBhdXRoIGF0dHJpYnV0ZXMgdGhhdCBjaGFuZ2VkLiBgQUNDT1VOVF9OVU1CRVJgIGFuZCBgUk9VVElOR19OVU1CRVJgIGFyZSB0aGUgdHdvIHBvdGVudGlhbCB2YWx1ZXMgdGhhdCBjYW4gYmUgZmxhZ2dlZCBhcyB1cGRhdGVkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcIkFDQ09VTlRfTlVNQkVSXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8QXV0aFVwZGF0ZVR5cGVzPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2F1dGg6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8QXV0aFVwZGF0ZVR5cGVzPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudHNgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCYWNzKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSBhbnkgYGFjY291bnRzYCBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRoZSBhcnJheSBmb3IgdGhhdCB0eXBlIHdpbGwgYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEFDSCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNIPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEFycmF5PE51bWJlcnNBQ0g+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEVGVCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzRUZUPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnQ6IEFycmF5PE51bWJlcnNFRlQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIElCQU4gbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw6IEFycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBCYWNzIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNCQUNTPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzOiBBcnJheTxOdW1iZXJzQkFDUz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudHNgIGZvciB3aGljaCBudW1iZXJzIGFyZSBiZWluZyByZXRyaWV2ZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEF1dGhHZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHRoYXQgY2FwdHVyZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF1dGggZmVhdHVyZXMgb2YgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhTdXBwb3J0ZWRNZXRob2RzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0ZWRfbWV0aG9kczogQXV0aFN1cHBvcnRlZE1ldGhvZHMgfCBudWxsO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB3aGljaCBhdXRoIG1ldGhvZHMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN1cHBvcnRlZE1ldGhvZHMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IGF1dGggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfYXV0aDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBtYXRjaCBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgaW5zdGFudF9tYXRjaDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IG1pY3JvLWRlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgaW5zdGFudF9taWNyb19kZXBvc2l0czogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGF1dGggZGF0YSB0aGF0IG1heSBoYXZlIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBdXRoVXBkYXRlVHlwZXMge1xuICAgIEFjY291bnROdW1iZXIgPSAnQUNDT1VOVF9OVU1CRVInLFxuICAgIFJvdXRpbmdOdW1iZXIgPSAnUk9VVElOR19OVU1CRVInXG59XG5cbi8qKlxuICogQUNIIG51bWJlcnMgZm9yIHZlcmlmaWNhdGlvbiB2aWEgRGF0YWJhc2UgQXV0aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoVmVyaWZ5TnVtYmVyc0FDSFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhWZXJpZnlOdW1iZXJzQUNIIHtcbiAgICAvKipcbiAgICAgKiBBY2NvdW50XFwncyBhY2NvdW50IG51bWJlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhWZXJpZnlOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjY291bnRcXCdzIHJvdXRpbmcgbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFZlcmlmeU51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIEF1dGhWZXJpZnlSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvdmVyaWZ5YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoVmVyaWZ5UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhWZXJpZnlSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IG93bmVyXFwncyBsZWdhbCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFZlcmlmeVJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aFZlcmlmeVJlcXVlc3ROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVxdWVzdFxuICAgICAqL1xuICAgIG51bWJlcnM6IEF1dGhWZXJpZnlSZXF1ZXN0TnVtYmVycztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaWRlbnRpZnlpbmcgYWNjb3VudCBudW1iZXJzIGZvciB2ZXJpZmljYXRpb24gdmlhIERhdGFiYXNlIEF1dGhcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aFZlcmlmeVJlcXVlc3ROdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFZlcmlmeVJlcXVlc3ROdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aFZlcmlmeU51bWJlcnNBQ0h9XG4gICAgICogQG1lbWJlcm9mIEF1dGhWZXJpZnlSZXF1ZXN0TnVtYmVyc1xuICAgICAqL1xuICAgIGFjaDogQXV0aFZlcmlmeU51bWJlcnNBQ0g7XG59XG4vKipcbiAqIEF1dGhWZXJpZnlSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXV0aC92ZXJpZnlgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhWZXJpZnlSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhWZXJpZnlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhWZXJpZnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIHZhbHVlIG9mIHRoZSBJdGVtIGNyZWF0ZWQgZm9yIHZlcmlmaWNhdGlvbi4gSWYgbnVtYmVycyBkYXRhIHByb3ZpZGVkIGlzIGludmFsaWQsIGFuIEl0ZW0gbWF5IG5vdCBiZSBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhWZXJpZnlSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgSXRlbVxcJ3MgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc2lnbmFsIGZvciBiZWluZyBpbnZhbGlkIGFuZC9vciBoYXZlIG5vIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIFR5cGljYWxseSB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSByb3V0aW5nIG51bWJlciBpcyBpbnZhbGlkLCB0aGUgYWNjb3VudCBudW1iZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIGZvcm1hdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRpbmcgbnVtYmVyLCBvciB0aGUgYWNjb3VudCBoYXMgYmVlbiByZXBvcnRlZCBhcyBjbG9zZWQgb3IgZnJvemVuLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc2A6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgbWF0Y2ggYSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBvZiBhbiBhY2NvdW50IHJlY29nbml6ZWQgb24gdGhlIFBsYWlkIG5ldHdvcmssIGFuZCB0aGUgYWNjb3VudCBpcyBub3Qga25vd24gYnkgUGxhaWQgdG8gYmUgZnJvemVuIG9yIGNsb3NlZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBBdXRoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc29tZSBzaWduYWwgZm9yIGJlaW5nIHZhbGlkOiB0aGUgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXIgd2VyZSBub3QgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYnV0IHRoZSByb3V0aW5nIG51bWJlciBpcyB2YWxpZCBhbmQgdGhlIGFjY291bnQgbnVtYmVyIGlzIGEgcG90ZW50aWFsIHZhbGlkIGFjY291bnQgbnVtYmVyIGZvciB0aGF0IHJvdXRpbmcgbnVtYmVyLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhWZXJpZnlSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoVmVyaWZ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM6IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbn1cbi8qKlxuICogQWRhcHRpdmUgZ3VhcmFudGVlIGRldGFpbHMgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiwgaW5jbHVkaW5nIHRoZSBndWFyYW50ZWUgb3V0Y29tZSBhbmQgc2V0dGxlbWVudCBzY2hlZHVsZS4gT21pdHRlZCB3aGVuIG5vIGd1YXJhbnRlZSB3YXMgYXR0ZW1wdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRob3JpemF0aW9uR3VhcmFudGVlRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25HdWFyYW50ZWVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJHdWFyYW50ZWVPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBBdXRob3JpemF0aW9uR3VhcmFudGVlRGV0YWlsc1xuICAgICAqL1xuICAgIG91dGNvbWU6IFRyYW5zZmVyR3VhcmFudGVlT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWRhcHRpdmUgZ3VhcmFudGVlIHNldHRsZW1lbnQgc2NoZWR1bGUgZm9yIHRoaXMgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXV0aG9yaXphdGlvbkd1YXJhbnRlZVNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIEF1dGhvcml6YXRpb25HdWFyYW50ZWVEZXRhaWxzXG4gICAgICovXG4gICAgc2NoZWR1bGU6IEFycmF5PEF1dGhvcml6YXRpb25HdWFyYW50ZWVTY2hlZHVsZUl0ZW0+O1xufVxuLyoqXG4gKiBBIHNpbmdsZSBlbnRyeSBpbiBhbiBhdXRob3JpemF0aW9uXFwncyBhZGFwdGl2ZSBndWFyYW50ZWUgc2V0dGxlbWVudCBzY2hlZHVsZSwgZGVzY3JpYmluZyBvbmUgdHJhbmNoZSBvZiBndWFyYW50ZWVkIGZ1bmRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRob3JpemF0aW9uR3VhcmFudGVlU2NoZWR1bGVJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkd1YXJhbnRlZVNjaGVkdWxlSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGd1YXJhbnRlZWQgYW1vdW50IGZvciB0aGlzIHNjaGVkdWxlIGVudHJ5IChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aG9yaXphdGlvbkd1YXJhbnRlZVNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYnVzaW5lc3MgZGF5cyBpbiB0aGUgb2JzZXJ2YXRpb24gd2luZG93IGZvciB0aGlzIHRyYW5jaGUuIGAwYCB3aGVuIHRoZSB0cmFuY2hlIGlzIG5vdCBzdWJqZWN0IHRvIGFuIG9ic2VydmF0aW9uIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBdXRob3JpemF0aW9uR3VhcmFudGVlU2NoZWR1bGVJdGVtXG4gICAgICovXG4gICAgb2JzZXJ2YXRpb25fd2luZG93X2J1c2luZXNzX2RheXM6IG51bWJlcjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtIGlzIHZlcmlmaWVkIHZpYSBhdXRvbWF0ZWQgbWljcm8tZGVwb3NpdHMuIFdlIHJlY29tbWVuZCBjb21tdW5pY2F0aW5nIHRvIHlvdXIgdXNlcnMgd2hlbiB0aGlzIGV2ZW50IGlzIHJlY2VpdmVkIHRvIG5vdGlmeSB0aGVtIHRoYXQgdGhlaXIgYWNjb3VudCBpcyB2ZXJpZmllZCBhbmQgcmVhZHkgZm9yIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQVVUT01BVElDQUxMWV9WRVJJRklFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2tcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGdlbmVyYXRpb24gIGBTVUNDRVNTYDogVGhlIGJhbmsgaW5jb21lIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC4gIGBGQUlMVVJFYDogVGhlIGJhbmsgaW5jb21lIHJlcG9ydCBmYWlsZWQgdG8gYmUgZ2VuZXJhdGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBiYW5rIGluY29tZSByZXBvcnQgaGFzIGZpbmlzaGVkIGdlbmVyYXRpbmcgb3IgZmFpbGVkIHRvIGdlbmVyYXRlLCB0cmlnZ2VyZWQgYnkgY2FsbGluZyBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIGluIENSQSBlbmFibGVkIGNsaWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZUNvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlZnJlc2ggcmVwb3J0IGdlbmVyYXRpb24gIGBTVUNDRVNTYDogVGhlIHJlZnJlc2hlZCByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSByZWZyZXNoZWQgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSByZWZyZXNoZWQgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZS4gVG8gb2J0YWluIHJlZnJlc2hlZCBCYW5rIEluY29tZSBkYXRhLCBzZW5kIHRoZSB1c2VyIHRocm91Z2ggTGlua1xcJ3MgdXBkYXRlIG1vZGUsIG9yIG1pZ3JhdGUgdG8gQ1JBIEluY29tZSBJbnNpZ2h0cyBhbmQgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBmb3IgYSBiYWNrZW5kIHJlZnJlc2guIFRvIGdldCB0aGlzIHdlYmhvb2ssIHN1YnNjcmliZSB2aWEgdGhlIFtEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9kZXZlbG9wZXJzL3dlYmhvb2tzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9SRUZSRVNIX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIGNoYW5nZSB0byB0aGUgdXNlclxcJ3MgaW5jb21lIGlzIGRldGVjdGVkLiBUbyBvYnRhaW4gcmVmcmVzaGVkIEJhbmsgSW5jb21lIGRhdGEsIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZSBzbyB0aGV5IGNhbiBjb25maXJtIHRoZWlyIGluY29tZSBzb3VyY2VzLCBvciBtaWdyYXRlIHRvIENSQSBJbmNvbWUgSW5zaWdodHMgYW5kIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgZm9yIGEgYmFja2VuZCByZWZyZXNoLiBUbyByZWNlaXZlIHRoaXMgd2ViaG9vaywgc3Vic2NyaWJlIGluIHRoZSBbRGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vZGV2ZWxvcGVycy93ZWJob29rcykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbnMgYSByaXNrIHNjb3JlIGFuZCBhIHJpc2sgdGllciB0aGF0IGV2YWx1YXRlIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBiZWNhdXNlIGFuIGFjY291bnQgaXMgb3ZlcmRyYXduIG9yIGJlY2F1c2UgYW4gaW5lbGlnaWJsZSBhY2NvdW50IGlzIHVzZWQuIENvbW1vbiByZXR1cm4gY29kZXMgaW4gdGhpcyBjYXRlZ29yeSBpbmNsdWRlOiBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luaXRpYXRlZFJldHVyblJpc2sge1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlza1xuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRC4gVXNlIFNpZ25hbCBSdWxlcyBpbnN0ZWFkIHRvIHRyYW5zZm9ybSB0aGUgYHNjb3JlYCBpbnRvIGEgdXNlZnVsIGFjdGlvbi4gIEluIHRoZSBgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGVpZ2h0IHJpc2sgdGllcnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2NvcmVzOiAgIDE6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAlIC0gMC41JSAgIDI6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjUlIC0gMS41JSAgIDM6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxLjUlIC0gMyUgICA0OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMyUgLSA1JSAgIDU6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiA1JSAtIDEwJSAgIDY6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxMCUgLSAxNSUgICA3OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTUlIGFuZCA1MCUgICA4OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGdyZWF0ZXIgdGhhbiA1MCUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJpc2tfdGllcjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGJhbmsgcGVuYWx0aWVzIGFuZCBmZWVzLCBpbmNsdWRpbmcgb3ZlcmRyYWZ0IGZlZXMsIE5TRiBmZWVzLCBhbmQgb3RoZXIgYmFuay1pbXBvc2VkIGNoYXJnZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1BlbmFsdGllc0luZGljYXRvcnMge1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB2YWx1ZSBvZiBvdXRmbG93IHRyYW5zYWN0aW9ucyBjYXRlZ29yaXplZCBhcyBgQkFOS19QRU5BTFRJRVNgLCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0IHdpdGhpbiB0aGUgcmVxdWVzdGVkIHRpbWUgd2luZG93LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9udGhseUF2ZXJhZ2V9XG4gICAgICogQG1lbWJlcm9mIEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgbW9udGhseV9hdmVyYWdlPzogTW9udGhseUF2ZXJhZ2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERldGFpbGVkIGNhdGVnb3JpZXMgdmlldyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEJBTktfUEVOQUxUSUVTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz59XG4gICAgICogQG1lbWJlcm9mIEJhbmtQZW5hbHRpZXNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgY2F0ZWdvcnlfZGV0YWlscz86IEFycmF5PENhdGVnb3J5RXhwZW5zZXM+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgQkFOS19QRU5BTFRJRVNgIGNyZWRpdCBjYXRlZ29yeSwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rUGVuYWx0aWVzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgc3VtbWFyaWVzIG9mIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBCQU5LX1BFTkFMVElFU2AgY3JlZGl0IGNhdGVnb3J5IHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PE1vbnRobHlTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBtb250aGx5X3N1bW1hcmllcz86IEFycmF5PE1vbnRobHlTdW1tYXJ5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdGhhdCBmYWxscyBpbnRvIHRoZSBgQkFOS19QRU5BTFRJRVNgIGNyZWRpdCBjYXRlZ29yeSwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rUGVuYWx0aWVzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfbGFzdF9vY2N1cnJlbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdXNlclxcJ3MgbW9udGhseSBpbmZsb3dzIHRoYXQgd2FzIHNwZW50IG9uIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEJBTktfUEVOQUxUSUVTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAwIHJlcHJlc2VudHMgdGhhdCAxMDAlIG9mIHRoZSBpbmZsb3dzIHdlcmUgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgQkFOS19QRU5BTFRJRVNgIGNyZWRpdCBjYXRlZ29yeS4gSWYgdGhlcmVcXCdzIG5vIGF2YWlsYWJsZSBpbmNvbWUgZm9yIHRoZSBnaXZlbiB0aW1lIHBlcmlvZCwgdGhpcyBmaWVsZCB2YWx1ZSB3aWxsIGJlIGAtMWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1BlbmFsdGllc0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlX29mX2luY29tZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYW5rIHRyYW5zZmVyIHdpdGhpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBiYW5rIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJhbmtUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSB0YWcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgY3JlYXRlIHJlcXVlc3QuIFdpbGwgYmUgbnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIGEgYmFuayB0cmFuc2ZlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGF2YWlsYWJsZSBiYWxhbmNlIC0gdGhlIHN1bSBvZiBhbGwgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2ZlciBhbW91bnRzIG1pbnVzIGFsbCBjcmVkaXQgdHJhbnNmZXIgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgdHJhbnNhY3RhYmxlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIG11bHRpcGxlIG9yaWdpbmF0aW9uIGFjY291bnRzIGFyZSBhdmFpbGFibGUsIGBvcmlnaW5hdGlvbl9hY2NvdW50X2lkYCBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBmb3Igd2hpY2ggYmFsYW5jZSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBCYW5rVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQgLSBzaG91bGQgYmUgc2V0IHRvIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHN0b3JhZ2Ugd2l0aCB0aGUgYmFuayB0cmFuc2Zlci4gTWF5IGJlIHVwIHRvIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXI6IGBvdXRib3VuZGAgZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzLCBvciBgaW5ib3VuZGAgZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB7XG4gICAgT3V0Ym91bmQgPSAnb3V0Ym91bmQnLFxuICAgIEluYm91bmQgPSAnaW5ib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgaW4gdGhlIEJhbmsgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV2ZW50LiBJRHMgYXJlIHNlcXVlbnRpYWwgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogQmFua1RyYW5zZmVyRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl90eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBiYW5rIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogQmFua1RyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2VpdmVyRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICByZWNlaXZlcl9kZXRhaWxzOiBSZWNlaXZlckRldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYW5rIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyOiBgb3V0Ym91bmRgOiBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMgYGluYm91bmRgOiBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9uIHtcbiAgICBJbmJvdW5kID0gJ2luYm91bmQnLFxuICAgIE91dGJvdW5kID0gJ291dGJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU/OiBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGJhbmsgdHJhbnNmZXIgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2V2ZW50czogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgKGxhcmdlc3QpIGBldmVudF9pZGAgZmV0Y2hlZCB2aWEgdGhlIHN5bmMgZW5kcG9pbnQsIG9yIDAgaW5pdGlhbGx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBhZnRlcl9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2V2ZW50czogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCB0aGlzIGJhbmsgdHJhbnNmZXIgcmVwcmVzZW50cy4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuICBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHJldmVyc2VkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldmVyc2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRXZlbnRUeXBlIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFJldmVyc2VkID0gJ3JldmVyc2VkJ1xufVxuXG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgdHlwZSBvZiB0aGlzIHRyYW5zZmVyIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXZlcnNlZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRmFpbHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHN0YXR1cyBpcyBgcmV2ZXJzZWRgLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtCYW5rIFRyYW5zZmVycyBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2JhbmstdHJhbnNmZXJzLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHRyYW5zZmVycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgYmFuayB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSBvcmlnaW5hdGVkIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyczogQXJyYXk8QmFua1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGlzIHRoZSBBQkEgbnVtYmVyOyBmb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBBQ0ggbnVtYmVyIHVzZWQgaW4gYHJvdXRpbmdfbnVtYmVyYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBiYW5rIGFjY291bnQgKGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci4gVmFsaWQgb3B0aW9ucyBhcmUgYGFjaGAsIGBzYW1lLWRheS1hY2hgLCBvciBgd2lyZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgV2lyZSA9ICd3aXJlJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFJldmVyc2VkID0gJ3JldmVyc2VkJ1xufVxuXG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwIGRlc2NyaWJlcyBhIHN3ZWVwIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBCYW5rVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHRoYXQgdGhlIHN3ZWVwcyBiZWxvbmcgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2VlcHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXBzOiBBcnJheTxCYW5rVHJhbnNmZXJTd2VlcD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYW5rIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB0aGUgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZnVsbCBsZWdhbCBuYW1lLiBJZiB0aGUgdHJhbnNmZXIgYGFjaF9jbGFzc2AgaXMgYGNjZGAsIHRoaXMgc2hvdWxkIGJlIHRoZSBidXNpbmVzcyBuYW1lIG9mIHRoZSBhY2NvdW50IGhvbGRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZW1haWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlclxcJ3Mgcm91dGluZyBudW1iZXIuIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGluIHJlc3BvbnNlIGRhdGEuIERvIG5vdCBwcm92aWRlIHRoaXMgZmllbGQgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBiYW5rIHRyYW5zZmVyIGV2ZW50cyBhcmUgYXZhaWxhYmxlLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgQUNIIGV2ZW50cyBhcmUgYXZhaWxhYmxlLiBUbyBiZWdpbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCB5b3UgbXVzdCBmaXJzdCByZWdpc3RlciB5b3VyIHdlYmhvb2sgbGlzdGVuZXIgZW5kcG9pbnQgdmlhIHRoZSBbd2ViaG9va3MgcGFnZSBpbiB0aGUgRGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS93ZWJob29rcykuIFRoZSBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWAgd2ViaG9vayBjYW4gYmUgdXNlZCB0byB0cmFjayB0aGUgcHJvZ3Jlc3Mgb2YgQUNIIHRyYW5zZmVycyB1c2VkIGluIFttaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC4gTm90ZSB0aGF0IFtUcmFuc2Zlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgY3VzdG9tZXJzIHNob3VsZCB1c2UgVHJhbnNmZXIgd2ViaG9va3MgaW5zdGVhZCBvZiB1c2luZyBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWA7IHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKSBmb3IgbW9yZSBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGgge1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgQmFzZSBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGEgQmFzZSBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBCYXNlIFJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEJhc2UgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SXRlbT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8QmFzZVJlcG9ydEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzO1xufVxuLyoqXG4gKiBCYXNlIFJlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYmFsYW5jZXM6IEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXM7XG4gICAgLyoqXG4gICAgICogVGhlIGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzbHkgc3VibWl0dGVkIHZhbGlkIGRpc3B1dGUgc3RhdGVtZW50cyBieSB0aGUgY29uc3VtZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29uc3VtZXJEaXNwdXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBjb25zdW1lcl9kaXNwdXRlczogQXJyYXk8Q29uc3VtZXJEaXNwdXRlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSB3aXRoaW4gdGhpcyByZXBvcnQgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuIFRyYW5zYWN0aW9uIGhpc3RvcnkgcmV0dXJuZWQgYnkgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHRvcC1sZXZlbCBgdHJhbnNhY3Rpb25zYCBmaWVsZCBpbnN0ZWFkLiBTb21lIHRyYW5zYWN0aW9ucyBtYXkgaGF2ZSB0aGVpciBkZXRhaWxzIG1hc2tlZCBpbiBhY2NvcmRhbmNlIHRvIHRoZSBGQ1JBLiBUaGVzZSB3aWxsIGFwcGVhciB3aXRoIGEgYGNyZWRpdF9jYXRlZ29yeWAgb2YgYE1BU0tFRF9UUkFOU0FDVElPTl9DQVRFR09SWWAuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxCYXNlUmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIFRoaXMgYXJyYXkgY2FuIGFsc28gYmUgZW1wdHkgaWYgbm8gb3duZXJzIGFyZSBmb3VuZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPd25lcnNoaXBUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlOiBPd25lcnNoaXBUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIEN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IGBicm9rZXJhZ2VgIG9yIGBpbnZlc3RtZW50YCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzPzogQXJyYXk8QmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFjY291bnRfaW5zaWdodHM/OiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogQmFzZVJlcG9ydEF0dHJpYnV0ZXM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsLXRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBhbmQgZXhwZWN0ZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgYW5kIHRoZSBJdGVtIGNvbnRhaW5zIG9uZSBvciBtb3JlIGFjY291bnRzIHdpdGggYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IHR5cGUsIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBDYXBpdGFsIE9uZSBkZXBvc2l0b3J5IGFjY291bnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGFjY291bnQgdHlwZXMgb24gYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBTZWUgW2FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgYWNjb3VudCB0eXBlcy4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCBmb3IgSXRlbXMgd2l0aCB0aGlzIGZpZWxkIHJlcXVpcmVkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZvciB0aGUgZW50aXJlIHJlcG9ydFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBvZiBlYWNoIGNhbGVuZGFyIG1vbnRoXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfbW9udGhseV9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90aGlydHlfZGF5X2F2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENhbGN1bGF0ZWQgaW5zaWdodHMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuIFRoaXMgZmllbGQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBbQmFzZSBSZXBvcnQgYXR0cmlidXRlcyBhZ2dyZWdhdGVkIGFjcm9zcyBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvY2hlY2svI2NyYS1jaGVja19yZXBvcnQtYmFzZV9yZXBvcnQtZ2V0LXJlc3BvbnNlLXJlcG9ydC1hdHRyaWJ1dGVzKSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIGF2YWlsYWJsZSBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2RheXNfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTG9uZ2VzdCBnYXAgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBpbiBhIHRpbWUgcGVyaW9kLiBUaGlzIGFycmF5IGNhbiBpbmNsdWRlIG11bHRpcGxlIHRpbWUgcGVyaW9kcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBsb25nZXN0X2dhcHNfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlYml0cyBpbnRvIHRoZSBhY2NvdW50LiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9pbmZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gYSB0aW1lIHBlcmlvZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfaW5mbG93X2Ftb3VudHM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBvdXRmbG93cyBmcm9tIHRoZSBhY2NvdW50LiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9vdXRmbG93cz86IEFycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgYW1vdW50IG9mIHRyYW5zYWN0aW9ucyBvdXQgb2YgdGhlIGFjY291bnQgaW4gYSB0aW1lIHBlcmlvZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2Vfb3V0Zmxvd19hbW91bnRzPzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHdpdGggbm8gdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9kYXlzX25vX3RyYW5zYWN0aW9ucz86IG51bWJlcjtcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBwcm92aWRlZCBkYXRhIGZvciB0aGUgYWNjb3VudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gcHJvdmlkZWQgZGF0YSBmb3IgdGhlIGFjY291bnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENhbGN1bGF0ZWQgYXR0cmlidXRlcyBkZXJpdmVkIGZyb20gdHJhbnNhY3Rpb24tbGV2ZWwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogUHJlZGljdGlvbiBpbmRpY2F0b3Igb2Ygd2hldGhlciB0aGUgYWNjb3VudCBpcyBhIHByaW1hcnkgYWNjb3VudC4gT25seSBvbmUgYWNjb3VudCBwZXIgYWNjb3VudCB0eXBlIGFjcm9zcyB0aGUgaXRlbXMgY29ubmVjdGVkIHdpbGwgaGF2ZSBhIHZhbHVlIG9mIHRydWUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfcHJpbWFyeV9hY2NvdW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsdWUgcmFuZ2luZyBmcm9tIDAtMS4gVGhlIGhpZ2hlciB0aGUgc2NvcmUsIHRoZSBtb3JlIGNvbmZpZGVudCB3ZSBhcmUgb2YgdGhlIGFjY291bnQgYmVpbmcgdGhlIHByaW1hcnkgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHByaW1hcnlfYWNjb3VudF9zY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXQgTlNGIGZlZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gYWNjb3VudCB3aXRoaW4gdGhlIHJlcG9ydCB0aW1lIHJhbmdlIChub3QgY291bnRpbmcgYW55IGZlZXMgdGhhdCB3ZXJlIHJldmVyc2VkIHdpdGhpbiB0aGUgdGltZSByYW5nZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldCBOU0YgZmVlIHRyYW5zYWN0aW9ucyB3aXRoaW4gdGhlIGxhc3QgMzAgZGF5cyBmb3IgYSBnaXZlbiBhY2NvdW50IChub3QgY291bnRpbmcgYW55IGZlZXMgdGhhdCB3ZXJlIHJldmVyc2VkIHdpdGhpbiB0aGUgdGltZSByYW5nZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXQgTlNGIGZlZSB0cmFuc2FjdGlvbnMgd2l0aGluIHRoZSBsYXN0IDYwIGRheXMgZm9yIGEgZ2l2ZW4gYWNjb3VudCAobm90IGNvdW50aW5nIGFueSBmZWVzIHRoYXQgd2VyZSByZXZlcnNlZCB3aXRoaW4gdGhlIHRpbWUgcmFuZ2UpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV0IE5TRiBmZWUgdHJhbnNhY3Rpb25zIHdpdGhpbiB0aGUgbGFzdCA5MCBkYXlzIGZvciBhIGdpdmVuIGFjY291bnQgKG5vdCBjb3VudGluZyBhbnkgZmVlcyB0aGF0IHdlcmUgcmV2ZXJzZWQgd2l0aGluIHRoZSB0aW1lIHJhbmdlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudD86IFRvdGFsSW5mbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnQzMGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudF8zMGQ/OiBUb3RhbEluZmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsSW5mbG93QW1vdW50NjBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnRfNjBkPzogVG90YWxJbmZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbEluZmxvd0Ftb3VudDkwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50XzkwZD86IFRvdGFsSW5mbG93QW1vdW50OTBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50PzogVG90YWxPdXRmbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50MzBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50XzMwZD86IFRvdGFsT3V0Zmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsT3V0Zmxvd0Ftb3VudDYwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudF82MGQ/OiBUb3RhbE91dGZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbE91dGZsb3dBbW91bnQ5MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnRfOTBkPzogVG90YWxPdXRmbG93QW1vdW50OTBkIHwgbnVsbDtcbn1cbi8qKlxuICogQXZlcmFnZSBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBvciBkZWJpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEF2ZXJhZ2UgYmFsYW5jZSBpbiBkb2xsYXIgYW1vdW50IHBlciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U6IENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeTtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGNhbGN1bGF0ZWQgaGlzdG9yaWNhbCBiYWxhbmNlLCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGhvbGRpbmcsIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB0b3RhbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gVGhpcyBmaWVsZCBpcyBjYWxjdWxhdGVkIGJ5IFBsYWlkIGFzIHRoZSBzdW0gb2YgdGhlIHB1cmNoYXNlIHByaWNlIG9mIGFsbCBvZiB0aGUgc2hhcmVzIGluIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGNvc3RfYmFzaXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHRoZSBhc3NldCBoZWxkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgc2VjdXJpdHkgaXMgYW4gb3B0aW9uLCBgcXVhbnRpdHlgIHdpbGwgcmVmbGVjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG9wdGlvbnMgKHR5cGljYWxseSB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cyBtdWx0aXBsaWVkIGJ5IDEwMCksIG5vdCB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHkge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNpbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgY3VzaXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBnaXZlbiB0byB0aGUgc2VjdXJpdHkgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWRgIGlzIHByZXNlbnQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBQbGFpZCBgaW5zdGl0dXRpb25faWRgIG9mIHRoZSBpbnN0aXR1dGlvbiB0byB3aG9tIHRoZSBpZGVudGlmaWVyIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eVxcJ3MgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB3aXRoaW4gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBJbnZlc3RtZW50IHRyYW5zYWN0aW9uLCB1bmlxdWUgYWNyb3NzIGFsbCBQbGFpZCB0cmFuc2FjdGlvbnMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhZ2FpbnN0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gcG9zdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBzZWN1cml0eV9pZGAgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBpcyByZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIGZvciBidXkgdHJhbnNhY3Rpb25zOyBuZWdhdGl2ZSBmb3Igc2VsbCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBsZXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBkZWJpdGVkLCBlLmcuIHB1cmNoYXNlcyBvZiBzdG9jazsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBjcmVkaXRlZCwgZS5nLiBzYWxlcyBvZiBzdG9jay4gVHJlYXRtZW50IHJlbWFpbnMgdGhlIHNhbWUgZm9yIGNhc2gtb25seSBtb3ZlbWVudHMgdW5hc3NvY2lhdGVkIHdpdGggc2VjdXJpdGllcy4gRm9yIHRyYW5zYWN0aW9ucyByZXByZXNlbnRpbmcgYSBzaW11bHRhbmVvdXMgY2FzaCBjb250cmlidXRpb24gYW5kIHB1cmNoYXNlIG9mIGEgc2VjdXJpdHksIHRoZSBwb3J0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiByZXByZXNlbnRpbmcgdGhlIHB1cmNoYXNlIHRha2VzIHByZWNlZGVuY2UsIGFuZCB0aGUgYGFtb3VudGAgaXMgcmVwcmVzZW50ZWQgYXMgcG9zaXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzZXQgb2YgZmllbGRzIGRlc2NyaWJpbmcgdGhlIGludmVzdG1lbnRzIGRhdGEgb24gYW4gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEludmVzdG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBRdWFudGl0aWVzIGFuZCB2YWx1ZXMgb2Ygc2VjdXJpdGllcyBoZWxkIGluIHRoZSBpbnZlc3RtZW50IGFjY291bnQuIE1hcCB0byB0aGUgYHNlY3VyaXRpZXNgIGFycmF5IGZvciBzZWN1cml0eSBkZXRhaWxzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SW52ZXN0bWVudEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8QmFzZVJlcG9ydEludmVzdG1lbnRIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9mIHNwZWNpZmljIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgaW52ZXN0bWVudCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8QmFzZVJlcG9ydEludmVzdG1lbnRTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBvbiB0aGUgaW52ZXN0bWVudCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SW52ZXN0bWVudFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEJhc2VSZXBvcnRJbnZlc3RtZW50VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGEgQmFzZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGRhdGVfbGFzdF91cGRhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgZWFjaCBvZiB0aGUgYWNjb3VudHMgb3BlbiBvbiB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxCYXNlUmVwb3J0QWNjb3VudD47XG59XG4vKipcbiAqIExhcmdlc3QgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBwZXIgY2FsZW5kYXIgbW9udGhcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMYXJnZXN0IG51bWJlciBvZiBkYXlzIGJldHdlZW4gc2VxdWVudGlhbCB0cmFuc2FjdGlvbnMgZm9yIHRoaXMgdGltZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXM/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIGNyZWRpdHMgb3IgZGViaXRzIG91dCBvZiB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgaW5jbHVkZWQgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY3JlZGl0cyBvciBkZWJpdHMgb3V0IG9mIHRoZSBhY2NvdW50IGZvciB0aGlzIHRpbWUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBjb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIG9uIHRoZSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIE5vdGU6IFRoaXMgaXMgYSBsZWdhY3kgZmllbGQgdGhhdCBpcyBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZC4gVXNlIGBtZXJjaGFudF9uYW1lYCBpbnN0ZWFkIGZvciB0aGUgbWVyY2hhbnQgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgdHJhbnNhY3Rpb24gdG9vayBwbGFjZSwgaW4gSVNPIDg2MDEgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogQmFzZVJlcG9ydFRyYW5zYWN0aW9uVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5O1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhc2VSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZWQgYXR0cmlidXRlcyBkZXJpdmVkIGZyb20gdHJhbnNhY3Rpb24tbGV2ZWwgZGF0YSwgYWdncmVnYXRlZCBhY3Jvc3MgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXQgTlNGIGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIHRpbWUgcmFuZ2UgZm9yIHRoZSByZXBvcnQgKG5vdCBjb3VudGluZyBhbnkgZmVlcyB0aGF0IHdlcmUgcmV2ZXJzZWQgd2l0aGluIHRoYXQgdGltZSByYW5nZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXQgTlNGIGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cyBpbiB0aGUgcmVwb3J0IChub3QgY291bnRpbmcgYW55IGZlZXMgdGhhdCB3ZXJlIHJldmVyc2VkIHdpdGhpbiB0aGF0IHRpbWUgcmFuZ2UpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldCBOU0YgZmVlIHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCA2MCBkYXlzIGluIHRoZSByZXBvcnQgKG5vdCBjb3VudGluZyBhbnkgZmVlcyB0aGF0IHdlcmUgcmV2ZXJzZWQgd2l0aGluIHRoYXQgdGltZSByYW5nZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV0IE5TRiBmZWUgdHJhbnNhY3Rpb25zIGluIHRoZSBsYXN0IDkwIGRheXMgaW4gdGhlIHJlcG9ydCAobm90IGNvdW50aW5nIGFueSBmZWVzIHRoYXQgd2VyZSByZXZlcnNlZCB3aXRoaW4gdGhhdCB0aW1lIHJhbmdlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsUmVwb3J0SW5mbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50PzogVG90YWxSZXBvcnRJbmZsb3dBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDMwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudF8zMGQ/OiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsUmVwb3J0SW5mbG93QW1vdW50NjBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50XzYwZD86IFRvdGFsUmVwb3J0SW5mbG93QW1vdW50NjBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxSZXBvcnRJbmZsb3dBbW91bnQ5MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnRfOTBkPzogVG90YWxSZXBvcnRJbmZsb3dBbW91bnQ5MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbFJlcG9ydE91dGZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50PzogVG90YWxSZXBvcnRPdXRmbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxSZXBvcnRPdXRmbG93QW1vdW50MzBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VXNlckF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudF8zMGQ/OiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQzMGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ2MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRVc2VyQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50XzYwZD86IFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDYwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDkwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFVzZXJBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnRfOTBkPzogVG90YWxSZXBvcnRPdXRmbG93QW1vdW50OTBkIHwgbnVsbDtcbn1cbi8qKlxuICogSXQgaXMgcG9zc2libGUgZm9yIGEgQmFzZSBSZXBvcnQgdG8gYmUgcmV0dXJuZWQgd2l0aCBtaXNzaW5nIGFjY291bnQgb3duZXIgaW5mb3JtYXRpb24uIEluIHN1Y2ggY2FzZXMsIHRoZSBCYXNlIFJlcG9ydCB3aWxsIGNvbnRhaW4gd2FybmluZyBkYXRhIGluIHRoZSByZXNwb25zZSwgaW5kaWNhdGluZyB3aHkgb2J0YWluaW5nIHRoZSBvd25lciBpbmZvcm1hdGlvbiBmYWlsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIHR5cGUsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQVNFX1JFUE9SVF9XQVJOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU6IEJhc2VSZXBvcnRXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F1c2V9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENhdXNlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBBY2NvdW50LW93bmVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuIGBVU0VSX0ZSQVVEX0FMRVJUYDogVGhlIFVzZXIgaGFzIHBsYWNlZCBhIGZyYXVkIGFsZXJ0IG9uIHRoZWlyIFBsYWlkIENoZWNrIGNvbnN1bWVyIHJlcG9ydCBkdWUgdG8gc3VzcGVjdGVkIGZyYXVkLiBOb3RlOiB3aGVuIGEgZnJhdWQgYWxlcnQgaXMgaW4gcGxhY2UsIHRoZSByZWNpcGllbnQgb2YgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgYW4gb2JsaWdhdGlvbiB0byB2ZXJpZnkgdGhlIGNvbnN1bWVyXFwncyBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhc2VSZXBvcnRXYXJuaW5nQ29kZSB7XG4gICAgSWRlbnRpdHlVbmF2YWlsYWJsZSA9ICdJREVOVElUWV9VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJyxcbiAgICBVc2VyRnJhdWRBbGVydCA9ICdVU0VSX0ZSQVVEX0FMRVJUJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gQmFzZSBSZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBUaGUgcmVzdWx0aW5nIGBlcnJvcmAgd2lsbCBoYXZlIGFuIGBlcnJvcl90eXBlYCBvZiBgQkFTRV9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkFTRV9SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvYmplY3QgY29udGFpbnMgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyBhY2NvdW50IHJpc2suIEV4YW1wbGVzIG9mIGRhdGEgaW5jbHVkZTogYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IHNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB0aGUgY29uc3VtZXIsIG9yIGlzIGF0IHJpc2sgb2YgYmVpbmcgY2xvc2VkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBhdmFpbGFibGUgdG8gUGxhaWQgZm9yIHRoaXMgYWNjb3VudC4gVGhpcyBtZWFzdXJlLCBjb21iaW5lZCB3aXRoIFBsYWlkIGNvbm5lY3Rpb24gaGlzdG9yeSwgY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIGFnZSBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3Rfb2JzZXJ2ZWRfdHJhbnNhY3Rpb246IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGFjY291bnQgaW4gdGhlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgcmVzcG9uc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlcztcbn1cbi8qKlxuICogVGhlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgYWNjb3VudCByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6IGBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb25gOiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWQgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5cyBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgYHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50YDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBzYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIG9yIHRoZSBjb25zdW1lciwgb3IgaXMgYXQgcmlzayBvZiBiZWluZyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9jbG9zZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgaXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXZhaWxhYmxlIHRvIFBsYWlkIGZvciB0aGlzIGFjY291bnQuIFRoaXMgbWVhc3VyZSwgY29tYmluZWQgd2l0aCBQbGFpZCBjb25uZWN0aW9uIGhpc3RvcnksIGNhbiBiZSB1c2VkIHRvIGluZmVyIHRoZSBhZ2Ugb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X29ic2VydmVkX3RyYW5zYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB5b3Ugd2FudCB0byBldmFsdWF0ZSByaXNrLiBgT05CT0FSRElOR2A6IHVzZXIgbGlua3MgYSBmaXJzdCBiYW5rIGFjY291bnQgYXMgcGFydCBvZiB0aGUgb25ib2FyZGluZyBmbG93IG9mIHlvdXIgcGxhdGZvcm0uIGBORVdfQUNDT1VOVGA6IHVzZXIgbGlua3MgYW5vdGhlciBiYW5rIGFjY291bnQgb3IgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBsaW5rZWQgYmFuayBhY2NvdW50IG9uIHlvdXIgcGxhdGZvcm0uIGBJTkZPUk1BVElPTl9DSEFOR0VgOiB1c2VyIGNoYW5nZXMgdGhlaXIgaW5mb3JtYXRpb24gb24geW91ciBwbGF0Zm9ybSwgZS5nLiwgdXBkYXRpbmcgdGhlaXIgcGhvbmUgbnVtYmVyLiBgRE9STUFOVF9VU0VSYDogIHlvdSBkZWNpZGUgdG8gcmUtZXZhbHVhdGUgYSB1c2VyIHRoYXQgYmVjb21lcyBhY3RpdmUgYWZ0ZXIgYSBwZXJpb2Qgb2YgaW5hY3Rpdml0eS4gYE9USEVSYDogYW55IG90aGVyIHJlYXNvbnMgbm90IGxpc3RlZCBoZXJlIFBvc3NpYmxlIHZhbHVlczogIGBPTkJPQVJESU5HYCwgYE5FV19BQ0NPVU5UYCwgYElORk9STUFUSU9OX0NIQU5HRWAsIGBET1JNQU5UX1VTRVJgLCBgT1RIRVJgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUV2YWx1YXRpb25SZWFzb24ge1xuICAgIE9uYm9hcmRpbmcgPSAnT05CT0FSRElORycsXG4gICAgTmV3QWNjb3VudCA9ICdORVdfQUNDT1VOVCcsXG4gICAgSW5mb3JtYXRpb25DaGFuZ2UgPSAnSU5GT1JNQVRJT05fQ0hBTkdFJyxcbiAgICBEb3JtYW50VXNlciA9ICdET1JNQU5UX1VTRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBpcyB1c2VkIHRvIGNvcnJlbGF0ZSByZXF1ZXN0cyBieSBhIHVzZXIgd2l0aCBtdWx0aXBsZSBldmFsdWF0aW9ucyBhbmQvb3IgbXVsdGlwbGUgbGlua2VkIGFjY291bnRzLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgb2Ygd2hhdCB5b3UgYXJlIGxvb2tpbmcgdG8gZXZhbHVhdGUgKGFjY291bnQgYWRkLCBpbmZvcm1hdGlvbiBjaGFuZ2UsIGV0Yy4pIHRvIGFsbG93IHVzIHRvIHRpZSB0aGUgYWN0aXZpdHkgdG8gdGhlIGRlY2lzaW9ucyBhbmQgcG9zc2libGUgZnJhdWQgb3V0Y29tZSBzZW50IHZpYSBvdXIgZmVlZGJhY2sgZW5kcG9pbnRzLiBZb3UgY2FuIHVzZSB5b3VyIGludGVybmFsIHJlcXVlc3QgSUQgb3Igc2ltaWxhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9ldmFsdWF0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlRXZhbHVhdGlvblJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmFsdWF0aW9uX3JlYXNvbj86IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVFdmFsdWF0aW9uUmVhc29uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBmb3IgZXZhbHVhdGlvbiBoYXMgb2NjdXJyZWQuIFBvcHVsYXRlIHRoaXMgZmllbGQgZm9yIGJhY2tmaWxsaW5nIGRhdGEuIElmIHlvdSBkb25cXCd0IHBvcHVsYXRlIHRoaXMgZmllbGQsIHdlXFwnbGwgdXNlIHRoZSB0aW1lc3RhbXAgYXQgdGhlIHRpbWUgb2YgcmVjZWlwdC4gVXNlIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZhbHVhdGVfdGltZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgIHJlc3VsdHMgdG8gYSBzdWJzZXQgb2YgdGhlIGFjY291bnRzIG9uIHRoZSBsaW5rZWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIGZvciB0aGUgc3BlY2lmaWMgYWNjb3VudHMgdG8gZXZhbHVhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBhIHJpc2sgZXZhbHVhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50Pjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkF1ZGl0VHJhaWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgc291cmNlOiBCZWFjb25BdWRpdFRyYWlsU291cmNlO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgdHlwZSBpbmRpY2F0aW5nIHdoYXQgY2F1c2VkIGEgcmVzb3VyY2UgdG8gYmUgY2hhbmdlZCBvciB1cGRhdGVkLiAgIGBkYXNoYm9hcmRgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYnkgYSBtZW1iZXIgb2YgeW91ciB0ZWFtIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiAgYGFwaWAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCB2aWEgdGhlIFBsYWlkIEFQSS4gIGBzeXN0ZW1gIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYXV0b21hdGljYWxseSBieSBhIHBhcnQgb2YgdGhlIFBsYWlkIEJlYWNvbiBzeXN0ZW0uIEZvciBleGFtcGxlLCBpZiBhbm90aGVyIGJ1c2luZXNzIHVzaW5nIFBsYWlkIEJlYWNvbiBjcmVhdGVkIGEgZnJhdWQgcmVwb3J0IHRoYXQgbWF0Y2hlZCBvbmUgb2YgeW91ciB1c2VycywgeW91ciBtYXRjaGluZyB1c2VyXFwncyBzdGF0dXMgd291bGQgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIGFuZCB0aGUgYXVkaXQgdHJhaWwgc291cmNlIHdvdWxkIGJlIGBzeXN0ZW1gLiAgYGJ1bGtfaW1wb3J0YCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGFzIHBhcnQgb2YgYSBidWxrIGltcG9ydCBwcm9jZXNzLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBjb21wYW55IHByb3ZpZGVkIGEgQ1NWIG9mIHVzZXIgZGF0YSBhcyBwYXJ0IG9mIHlvdXIgaW5pdGlhbCBvbmJvYXJkaW5nLCB0aGUgYXVkaXQgdHJhaWwgc291cmNlIHdvdWxkIGJlIGBidWxrX2ltcG9ydGAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25BdWRpdFRyYWlsU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBBcGkgPSAnYXBpJyxcbiAgICBTeXN0ZW0gPSAnc3lzdGVtJyxcbiAgICBCdWxrSW1wb3J0ID0gJ2J1bGtfaW1wb3J0J1xufVxuXG4vKipcbiAqIEJhbmsgQWNjb3VudCBJbnNpZ2h0cyBlbmNhcHN1bGF0ZSB0aGUgcmlzayBpbnNpZ2h0cyBmb3IgYSBzaW5nbGUgQmFuayBBY2NvdW50IGxpbmtlZCB0byBhbiBJdGVtIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXM6IEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlcztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIEJhbmsgQWNjb3VudHMgbGlua2VkIHRvIGFuIEl0ZW0gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQmFua0FjY291bnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQmFua0FjY291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRCB0aGUgQmFuayBBY2NvdW50cyBiZWxvbmcgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRzXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRzXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHM+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQmVhY29uIFVzZXIgY3JlYXRlZCB3aXRoaW4geW91ciBvcmdhbml6YXRpb24gbWF0Y2hlcyBvbmUgb2YgeW91ciBleGlzdGluZyB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBEVVBMSUNBVEVfREVURUNURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX2R1cGxpY2F0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gRHVwbGljYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fZHVwbGljYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2YgbWF0Y2hpbmcgQmVhY29uIFVzZXJzIGFuZCBhbiBhbmFseXNpcyBvZiB0aGUgZmllbGRzIHRoZXkgbWF0Y2hlZCBvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIER1cGxpY2F0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXZpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcjE6IEJlYWNvblVzZXJSZXZpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJldmlzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyMjogQmVhY29uVXNlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbmFseXNpczogQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIG9uZSBCZWFjb24gVXNlciBhbmQgYW5vdGhlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB0aGUgbWF0Y2ggdHlwZSBiZXR3ZWVuIHR3byBCZWFjb24gVXNlcnMuICAgYG1hdGNoYCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YSB3YXMgYSBzdHJvbmcgbWF0Y2ggYWdhaW5zdCB0aGUgb3RoZXIgQmVhY29uIFVzZXIuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCB0aGUgb3RoZXIgQmVhY29uIFVzZXIuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIGNvbXBhcmUgdGhpcyBmaWVsZCBhZ2FpbnN0IHRoZSBvdGhlciBCZWFjb24gVXNlciBhbmQgaXQgZGlkIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgdW5hYmxlIHRvIGNvbXBhcmUgdGhpcyBmaWVsZCBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBCZWFjb24gVXNlciBiZWNhdXNlIHRoZSBmaWVsZCB3YXMgbm90IHByZXNlbnQgaW4gb25lIG9mIHRoZSBCZWFjb24gVXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25NYXRjaFN1bW1hcnlDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgZnJhdWQgY29tbWl0dGVkIGJ5IGEgdXNlciBhcyB3ZWxsIGFzIHRoZSBkYXRlIHRoZSBmcmF1ZCB3YXMgY29tbWl0dGVkIGFuZCB0aGUgdG90YWwgYW1vdW50IG9mIG1vbmV5IGxvc3QgZHVlIHRvIHRoZSBmcmF1ZCBpbmNpZGVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBibG9jayBzaW1pbGFyIGZyYXVkIGF0dGVtcHRzIG9uIHlvdXIgcGxhdGZvcm0gYXMgd2VsbCBhcyBhbGVydCBvdGhlciBjb21wYW5pZXMgd2hvIHNjcmVlbiBhIHVzZXIgd2l0aCBtYXRjaGluZyBpZGVudGl0eSBpbmZvcm1hdGlvbi4gT3RoZXIgY29tcGFuaWVzIHdpbGwgbm90IHJlY2VpdmUgYW55IG5ldyBpZGVudGl0eSBpbmZvcm1hdGlvbiwganVzdCB3aGF0IG1hdGNoZWQsIHBsdXMgaW5mb3JtYXRpb24gc3VjaCBhcyBpbmR1c3RyeSwgdHlwZSBvZiBmcmF1ZCwgYW5kIGRhdGUgb2YgZnJhdWQuICBZb3UgY2FuIG1hbmFnZSB5b3VyIGZyYXVkIHJlcG9ydHMgYnkgYWRkaW5nLCBkZWxldGluZywgb3IgZWRpdGluZyByZXBvcnRzIGFzIHlvdSBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBmcmF1ZHVsZW50IHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGV2ZW50X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudDogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSBCZWFjb24gUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0Q3JlYXRlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydENyZWF0ZVR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50PzogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV2ZW50X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBCZWFjb24gUmVwb3J0LiAgYGZpcnN0X3BhcnR5YDogSWYgdGhpcyBpcyB0aGUgc2FtZSBpbmRpdmlkdWFsIGFzIHRoZSBvbmUgd2hvIHN1Ym1pdHRlZCB0aGUgS1lDLiAgYHN0b2xlbmA6IElmIHRoaXMgaXMgYSBkaWZmZXJlbnQgaW5kaXZpZHVhbCBmcm9tIHRoZSBvbmUgd2hvIHN1Ym1pdHRlZCB0aGUgS1lDLiAgYHN5bnRoZXRpY2A6IElmIHRoaXMgaXMgYW4gaW5kaXZpZHVhbCB1c2luZyBmYWJyaWNhdGVkIGluZm9ybWF0aW9uLiAgYGFjY291bnRfdGFrZW92ZXJgOiBJZiB0aGlzIGluZGl2aWR1YWxcXCdzIGFjY291bnQgd2FzIGNvbXByb21pc2VkLiAgYHVua25vd25gOiBJZiB5b3UgYXJlblxcJ3Qgc3VyZSB3aG8gY29tbWl0dGVkIHRoZSBmcmF1ZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvblJlcG9ydENyZWF0ZVR5cGUge1xuICAgIEZpcnN0UGFydHkgPSAnZmlyc3RfcGFydHknLFxuICAgIFN0b2xlbiA9ICdzdG9sZW4nLFxuICAgIFN5bnRoZXRpYyA9ICdzeW50aGV0aWMnLFxuICAgIEFjY291bnRUYWtlb3ZlciA9ICdhY2NvdW50X3Rha2VvdmVyJyxcbiAgICBEYXRhQnJlYWNoID0gJ2RhdGFfYnJlYWNoJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBvbmUgb2YgeW91ciBCZWFjb24gVXNlcnMgaXMgZmlyc3QgcmVwb3J0ZWQgdG8gdGhlIEJlYWNvbiBuZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFUE9SVF9DUkVBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGV2ZW50X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIEJlYWNvbiBSZXBvcnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9yZXBvcnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydHM6IEFycmF5PEJlYWNvblJlcG9ydD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICByZXBvcnQ6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXM7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgQmVhY29uIFVzZXIgYW5kIHRoZSBCZWFjb24gVXNlciB0aGF0IHRoZSByZXBvcnQgd2FzIHN5bmRpY2F0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWU6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnlfYWNjb3VudHM6IEFycmF5PEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXM+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVwb3J0IGNyZWF0ZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIG1hdGNoZXMgd2l0aCBvbmUgb2YgeW91ciBCZWFjb24gVXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX1NZTkRJQ0FUSU9OX0NSRUFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X3N5bmRpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X3N5bmRpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIHJlcHJlc2VudHMgYSBCZWFjb24gUmVwb3J0IGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdXIgb3JnYW5pemF0aW9uIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIEJlYWNvbiBVc2VyIHlvdVxcJ3ZlIGNyZWF0ZWQuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgQmVhY29uIFVzZXIgYW5kIHRoZSBCZWFjb24gVXNlciB0aGF0IHRoZSByZXBvcnQgd2FzIHN5bmRpY2F0ZWQgdG8uICBUaGUgYHJlcG9ydGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbmFseXNpczogQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbnM6IEFycmF5PEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gYSBCZWFjb24gUmVwb3J0IHRoYXQgaGFzIGJlZW4gc3luZGljYXRlZCB0byBhIG1hdGNoaW5nIEJlYWNvbiBVc2VyIGluIHlvdXIgcHJvZ3JhbS4gIFRoZSBgaWRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpcyB0aGUgSUQgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydCB0aGF0IHdhcyBzeW5kaWNhdGVkLiBJZiB0aGUgb3JpZ2luYWwgcmVwb3J0IHdhcyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uLCB0aGUgZmllbGQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgSUQgb2YgdGhlIHJlcG9ydC4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgd2lsbCBiZSBgbnVsbGAgaW5kaWNhdGluZyB0aGF0IHRoZSBvcmlnaW5hbCByZXBvcnQgd2FzIGNyZWF0ZWQgYnkgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBCZWFjb24gUmVwb3J0LiAgYGZpcnN0X3BhcnR5YDogSWYgdGhpcyBpcyB0aGUgc2FtZSBpbmRpdmlkdWFsIGFzIHRoZSBvbmUgd2hvIHN1Ym1pdHRlZCB0aGUgS1lDLiAgYHN0b2xlbmA6IElmIHRoaXMgaXMgYSBkaWZmZXJlbnQgaW5kaXZpZHVhbCBmcm9tIHRoZSBvbmUgd2hvIHN1Ym1pdHRlZCB0aGUgS1lDLiAgYHN5bnRoZXRpY2A6IElmIHRoaXMgaXMgYW4gaW5kaXZpZHVhbCB1c2luZyBmYWJyaWNhdGVkIGluZm9ybWF0aW9uLiAgYGFjY291bnRfdGFrZW92ZXJgOiBJZiB0aGlzIGluZGl2aWR1YWxcXCdzIGFjY291bnQgd2FzIGNvbXByb21pc2VkLiAgYGRhdGFfYnJlYWNoYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBkYXRhIHdhcyBjb21wcm9taXNlZCBpbiBhIGJyZWFjaC4gIGB1bmtub3duYDogSWYgeW91IGFyZW5cXCd0IHN1cmUgd2hvIGNvbW1pdHRlZCB0aGUgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25SZXBvcnRUeXBlIHtcbiAgICBGaXJzdFBhcnR5ID0gJ2ZpcnN0X3BhcnR5JyxcbiAgICBTdG9sZW4gPSAnc3RvbGVuJyxcbiAgICBTeW50aGV0aWMgPSAnc3ludGhldGljJyxcbiAgICBBY2NvdW50VGFrZW92ZXIgPSAnYWNjb3VudF90YWtlb3ZlcicsXG4gICAgRGF0YUJyZWFjaCA9ICdkYXRhX2JyZWFjaCcsXG4gICAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gb25lIG9mIHlvdXIgZXhpc3RpbmcgQmVhY29uIFJlcG9ydHMgaGFzIGJlZW4gbW9kaWZpZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW5hbHlzaXMgb2Ygd2hldGhlciB0aGlzIGFjY291bnQgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHN5bmRpY2F0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIHRoaXMgYWNjb3VudFxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpc1xuICAgICAqL1xuICAgIGFjY291bnRfbWFzazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByb3V0aW5nIG51bWJlciBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpc1xuICAgICAqL1xuICAgIG1hdGNoX3N0YXR1czogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciByZXByZXNlbnRzIGFuIGVuZCB1c2VyIHRoYXQgaGFzIGJlZW4gc2Nhbm5lZCBhZ2FpbnN0IHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGl0ZW1faWRzOiBTZXQ8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgZWFjaCB0aW1lIHRoZSB1c2VyIGlzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBsYXN0IHRpbWUgdGhlIHJlc291cmNlIHdhcyBtb2RpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgdGhlIHJpc2sgaW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcXCdzIEJhbmsgQWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2FjY291bnRfaW5zaWdodHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBsYXN0IHRpbWUgdGhlIHJlc291cmNlIHdhcyBtb2RpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkJhbmtBY2NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19hY2NvdW50X2luc2lnaHRzOiBCZWFjb25CYW5rQWNjb3VudHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIGEgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN1YmRpdmlzaW9uIGNvZGUuIFxcXCJTdWJkaXZpc2lvblxcXCIgaXMgYSBnZW5lcmljIHRlcm0gZm9yIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBldGMuIEZvciB0aGUgbGlzdCBvZiB2YWxpZCBjb2Rlcywgc2VlIFtjb3VudHJ5IHN1YmRpdmlzaW9uIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY291bnRyeV9zdWJkaXZpc2lvbl9jb2Rlcy5qc29uKS4gQ291bnRyeSBwcmVmaXhlcyBhcmUgb21pdHRlZCwgc2luY2UgdGhleSBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYGNvdW50cnlgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFVzZXIuICBUaGUgcHJpbWFyeSB1c2UgZm9yIHRoaXMgZW5kcG9pbnQgaXMgdG8gYWRkIGEgbmV3IGVuZCB1c2VyIHRvIEJlYWNvbiBmb3IgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy4gIFNvbWUgZmllbGRzIGFyZSBvcHRpb25hbCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSB0byBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdERhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlclJlcXVlc3REYXRhO1xuICAgIC8qKlxuICAgICAqIFNlbmQgdGhpcyBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIHRvIGxpbmsgYWNjb3VudHMgdG8gdGhlIEJlYWNvbiBVc2VyIGFuZCBoYXZlIHRoZW0gZXZhbHVhdGVkIGZvciBBY2NvdW50IEluc2lnaHRzLiBBIG1heGltdW0gb2YgNTAgYWNjb3VudHMgdG90YWwgY2FuIGJlIGFkZGVkIHRvIGEgc2luZ2xlIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciByZXByZXNlbnRzIGFuIGVuZCB1c2VyIHRoYXQgaGFzIGJlZW4gc2Nhbm5lZCBhZ2FpbnN0IHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCBJdGVtIElEcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWRzOiBTZXQ8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdmVyc2lvbmAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyBlYWNoIHRpbWUgdGhlIHVzZXIgaXMgdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBsYXN0IHRpbWUgdGhlIHJlc291cmNlIHdhcyBtb2RpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyXFwncyBkYXRhIGFuZCByZXN1bHRpbmcgYW5hbHlzaXMgd2hlbiBjaGVja2VkIGFnYWluc3QgZHVwbGljYXRlIHJlY29yZHMgYW5kIHRoZSBCZWFjb24gRnJhdWQgTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyRGF0YSB7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25Vc2VyTmFtZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogQmVhY29uVXNlckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJUHY0IG9yIElQdjYgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgZGVwb3NpdG9yeV9hY2NvdW50czogQXJyYXk8QmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50Pjtcbn1cbi8qKlxuICogRGVwb3NpdG9yeSBhY2NvdW50IGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyRGVwb3NpdG9yeUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyRGVwb3NpdG9yeUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBudW1lcmljIGNoYXJhY3RlcnMgb2YgdGhpcyBhY2NvdW50XFwncyBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGVwb3NpdG9yeUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X21hc2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gICAgICovXG4gICAgYWRkZWRfYXQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBCZWFjb24gVXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgSXRlbSBJRHMgY29ycmVzcG9uZGluZyB0byB0aGUgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgZWFjaCB0aW1lIHRoZSB1c2VyIGlzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyB0aGUgaGlzdG9yeSBvZiBhIEJlYWNvbiBVc2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2hpc3RvcnkvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyczogQXJyYXk8QmVhY29uVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgSUQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIHRoZSBpZGVudGl0eSBkb2N1bWVudCB0eXBlZCBpbiBieSB0aGUgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLiBGb3Igc3BlY2lmaWMgZm9ybWF0IHJlcXVpcmVtZW50cyBieSBJRCB0eXBlLCBzZWUgW0lucHV0IFZhbGlkYXRpb24gUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpZC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZS4gXFxcIlN1YmRpdmlzaW9uXFxcIiBpcyBhIGdlbmVyaWMgdGVybSBmb3IgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIGV0Yy4gRm9yIHRoZSBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN1YmRpdmlzaW9uIGNvZGUuIFxcXCJTdWJkaXZpc2lvblxcXCIgaXMgYSBnZW5lcmljIHRlcm0gZm9yIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBldGMuIEZvciB0aGUgbGlzdCBvZiB2YWxpZCBjb2Rlcywgc2VlIFtjb3VudHJ5IHN1YmRpdmlzaW9uIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY291bnRyeV9zdWJkaXZpc2lvbl9jb2Rlcy5qc29uKS4gQ291bnRyeSBwcmVmaXhlcyBhcmUgb21pdHRlZCwgc2luY2UgdGhleSBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYGNvdW50cnlgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGFnYWluc3QgZHVwbGljYXRlIHJlY29yZHMgYW5kIHRoZSBCZWFjb24gRnJhdWQgTmV0d29yay4gIEluIG9yZGVyIHRvIGNyZWF0ZSBhIEJlYWNvbiBVc2VyLCBpbiBhZGRpdGlvbiB0byB0aGUgYG5hbWVgLCBfZWl0aGVyXyB0aGUgYGRhdGVfb2ZfYmlydGhgIF9vcl8gdGhlIGBkZXBvc2l0b3J5X2FjY291bnRzYCBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVB2NiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgYSBsaXN0IG9mIGJhbmsgYWNjb3VudHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuIFRoZXNlIGFjY291bnRzIHdpbGwgYmUgc2Nhbm5lZCBhY3Jvc3MgdGhlIEJlYWNvbiBOZXR3b3JrIGFuZCB1c2VkIHRvIGZpbmQgZHVwbGljYXRlIHJlY29yZHMuICBOb3RlOiBUaGVzZSBhY2NvdW50cyB3aWxsIG5vdCBoYXZlIEJhbmsgQWNjb3VudCBJbnNpZ2h0cy4gVG8gcmVjZWl2ZSBCYW5rIEFjY291bnQgSW5zaWdodHMgcGxlYXNlIHN1cHBseSBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBVUyBCYW5rIEFjY291bnQgTnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnRcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciBSZXZpc2lvbiBpZGVudGlmaWVzIGEgQmVhY29uIFVzZXIgYXQgc29tZSBwb2ludCBpbiBpdHMgcmV2aXNpb24gaGlzdG9yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdmVyc2lvbmAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCByZXZpc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBgcmVqZWN0ZWRgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gcmVqZWN0ZWQgZm9yIGZyYXVkLiBVc2VycyBjYW4gYmUgYXV0b21hdGljYWxseSBvciBtYW51YWxseSByZWplY3RlZC4gIGBwZW5kaW5nX3Jldmlld2A6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBtYXJrZWQgZm9yIHJldmlldy4gIGBjbGVhcmVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIGNsZWFyZWQgb2YgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25Vc2VyU3RhdHVzIHtcbiAgICBSZWplY3RlZCA9ICdyZWplY3RlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgQ2xlYXJlZCA9ICdjbGVhcmVkJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciB3aGVuIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHVwZGF0aW5nIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlbmQgdGhpcyBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIHRvIGFkZCBhY2NvdW50cyB0byB0aGlzIHVzZXIgZm9yIGV2YWx1YXRpb24uIFRoaXMgd2lsbCBhZGQgYWNjb3VudHMgdG8gdGhpcyBCZWFjb24gVXNlci4gSWYgbGVmdCBudWxsIG9ubHkgZXhpc3RpbmcgYWNjb3VudHMgd2lsbCBiZSByZXR1cm5lZCBpbiByZXNwb25zZS4gQSBtYXhpbXVtIG9mIDUwIGFjY291bnRzIHRvdGFsIGNhbiBiZSBhZGRlZCB0byBhIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgYSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhdGNoIHRoZSBleGlzdGluZyBpZGVudGl0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLiBBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZC4gSWYgbGVmdCB1bnNldCBvciBudWxsLCB1c2VyIGRhdGEgd2lsbCBub3QgYmUgcGF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWVOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZT86IEJlYWNvblVzZXJOYW1lTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcj86IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgSXRlbSBJRHMgY29ycmVzcG9uZGluZyB0byB0aGUgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgZWFjaCB0aW1lIHRoZSB1c2VyIGlzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL2V3YV9yZXBvcnQvdjEvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEJldGFFd2FSZXBvcnRWMUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL2V3YV9yZXBvcnQvdjEvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFFd2FSZXBvcnRWMUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YUV3YVJlcG9ydFYxR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZ2VuZXJhdGVkIEVXQSBzY29yZSBncm91cC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGV3YV9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiBgZXdhX3Njb3Jlc2Agd2FzIGdlbmVyYXRlZCwgaW4gSVNPIDg2MDEgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFFd2FSZXBvcnRWMUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZ2VuZXJhdGlvbl90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlYXJuZWQgd2FnZSBhY2Nlc3MgKEVXQSkgc2NvcmluZyBlbnRyaWVzIHRoYXQgbWFwIHBvdGVudGlhbCBhZHZhbmNlIGFtb3VudHMgdG8gcmVwYXltZW50IGxpa2VsaWhvb2Qgc2NvcmVzLiBUaGUgcHJlZGVmaW5lZCBhZHZhbmNlIGFtb3VudCByYW5nZXMgYXJlIGBbMCwgMjUpYCwgYFsyNSwgNTApYCwgYFs1MCwgMTAwKWAsIGBbMTAwLCAyMDApYCwgYFsyMDAsIDMwMClgLCBgWzMwMCwgNDAwKWAsIGFuZCBgWzQwMCwgNTAwKWAuXG4gICAgICogQHR5cGUge0FycmF5PEV3YVNjb3JlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YUV3YVJlcG9ydFYxR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBld2Ffc2NvcmVzPzogQXJyYXk8RXdhU2NvcmU+O1xuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIGF0dHJpYnV0ZXMgcHJvdmlkaW5nIGNvbnRleHQgYWJvdXQgdGhlIGZhY3RvcnMgdGhhdCBjb250cmlidXRlZCB0byB0aGUgRVdBIHNjb3Jlcy4gRWFjaCBrZXkgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCB0aGUgdmFsdWUgaXMgaXRzIG51bWVyaWMgc2NvcmUsIG9yIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBjb3VsZCBub3QgYmUgY29tcHV0ZWQuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogbnVtYmVyOyB9fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGV3YV9hdHRyaWJ1dGVzPzogeyBba2V5OiBzdHJpbmddOiBudW1iZXI7IH0gfCBudWxsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIgYmVpbmcgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgZW5kIGN1c3RvbWVyIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIEl0IHdpbGwgbm90IGJlIHNob3duIHRvIGVuZCB1c2Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFydG5lciBoYXMgY29tcGxldGVkIGF0dGVzdGF0aW9uIG9mIGRpbGlnZW5jZSBmb3IgdGhlIGVuZCBjdXN0b21lciB0byBiZSBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfZGlsaWdlbmNlX2F0dGVzdGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gYmUgZW5hYmxlZCBmb3IgdGhlIGVuZCBjdXN0b21lci4gSWYgZW1wdHkgb3IgYG51bGxgLCB0aGlzIGZpZWxkIHdpbGwgZGVmYXVsdCB0byB0aGUgcHJvZHVjdHMgZW5hYmxlZCBmb3IgdGhlIHJlc2VsbGVyIGF0IHRoZSB0aW1lIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGRlZmF1bHQgTGluayBjdXN0b21pemF0aW9uIHdpbGwgYmUgc2V0IHRvIG1hdGNoIHRoZSBwYXJ0bmVyXFwncy4gWW91IGNhbiBhbHdheXMgY2hhbmdlIHRoZSBlbmQgY3VzdG9tZXJcXCdzIExpbmsgY3VzdG9taXphdGlvbiBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBTZWUgdGhlIFtMaW5rIEN1c3RvbWl6YXRpb24gZG9jc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gSWYgeW91IHJlcXVpcmUgdGhlIGFiaWxpdHkgdG8gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgZW5kIGN1c3RvbWVycyB1c2luZyBtdWx0aXBsZSBkaWZmZXJlbnQgTGluayBjdXN0b21pemF0aW9uIHByb2ZpbGVzLCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyIGZvciBhc3Npc3RhbmNlLiAgSW1wb3J0YW50OiBEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmcgKERUTSkgdXNlIGNhc2VzIHdpbGwgbm90IGJlIGNvcGllZCB0byB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gdW5sZXNzIHRoZSAqKlB1Ymxpc2ggY2hhbmdlcyoqIGJ1dHRvbiBpcyBjbGlja2VkIGFmdGVyIHRoZSB1c2UgY2FzZXMgYXJlIGFwcGxpZWQuIExpbmsgd2lsbCBub3Qgd29yayBpbiBQcm9kdWN0aW9uIHVubGVzcyB0aGUgZW5kIGN1c3RvbWVyXFwncyBEVE0gdXNlIGNhc2VzIGFyZSBjb25maWd1cmVkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyZWF0ZV9saW5rX2N1c3RvbWl6YXRpb24/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEJhc2U2NC1lbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGxvZ28uIE11c3QgYmUgYSBQTkcgb2Ygc2l6ZSAxMDI0eDEwMjQgdW5kZXIgNE1CLiBUaGUgbG9nbyB3aWxsIGJlIHNoYXJlZCB3aXRoIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIHNob3duIHRvIHRoZSBlbmQgdXNlciBkdXJpbmcgTGluayBmbG93cy4gQSBsb2dvIGlzIHJlcXVpcmVkIGlmIGBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uYCBpcyBgdHJ1ZWAuIElmIGBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uYCBpcyBgZmFsc2VgIGFuZCB0aGUgbG9nbyBpcyBvbWl0dGVkLCB0aGUgcGFydG5lclxcJ3MgbG9nbyB3aWxsIGJlIHVzZWQgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIGEgc3RvY2sgbG9nbyB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxvZ28/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3MgbGVnYWwgbmFtZS4gVGhpcyB3aWxsIGJlIHNoYXJlZCB3aXRoIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYXMgcGFydCBvZiB0aGUgT0F1dGggcmVnaXN0cmF0aW9uIHByb2Nlc3MuIEl0IHdpbGwgbm90IGJlIHNob3duIHRvIGVuZCB1c2Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfZW50aXR5X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuIFRoZSBhcHBsaWNhdGlvbiBuYW1lIG11c3QgYmUgdW5pcXVlIGFuZCBjYW5ub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYW5vdGhlciBhcHBsaWNhdGlvbiBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVjaG5pY2FsX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJpbGxpbmdfY29udGFjdD86IFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tZXJfc3VwcG9ydF9pbmZvOiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzczogUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgVVJJcyBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbihzKSB3aGVyZSBhIHVzZXIgY2FuIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24sIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIG1vZGlmeSByZWRpcmVjdCBVUklzIGZvciBhbiBlbmQgY3VzdG9tZXIgYWZ0ZXIgY3JlYXRpbmcgdGhlbSwgZ28gdG8gdGhlIGVuZCBjdXN0b21lclxcJ3MgW0FQSSBwYWdlXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQmFua0FkZGVuZHVtQWNjZXB0YW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfYWRkZW5kdW1fYWNjZXB0YW5jZT86IFBhcnRuZXJFbmRDdXN0b21lckJhbmtBZGRlbmR1bUFjY2VwdGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVzfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlc3Rpb25uYWlyZXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlcztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmV0YVBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvZW5hYmxlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGVSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogTWFwcGluZyBvZiBwcm9kdWN0IG5hbWVzIHRvIHRoZWlyIGN1cnJlbnQgc3RhdHVzLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0X3N0YXR1c2VzPzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uX3NlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZXRhUGFydG5lckVuZEN1c3RvbWVyfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfZW50aXR5X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQmFua0FkZGVuZHVtQWNjZXB0YW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfYWRkZW5kdW1fYWNjZXB0YW5jZT86IFBhcnRuZXJFbmRDdXN0b21lckJhbmtBZGRlbmR1bUFjY2VwdGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVzfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlc3Rpb25uYWlyZXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlcztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmV0YVBhcnRuZXJFbmRDdXN0b21lcn1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBCZXRhUGFydG5lckVuZEN1c3RvbWVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciBhbiBlbmQgY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZXRhUGFydG5lckVuZEN1c3RvbWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9pZGAgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIE1hcHBpbmcgb2YgcHJvZHVjdCBuYW1lcyB0byB0aGVpciBjdXJyZW50IHN0YXR1cy5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBwcm9kdWN0X3N0YXR1c2VzPzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH07XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0aGF0IGFyZSBzdGlsbCByZXF1aXJlZCB0byBiZSBzdWJtaXR0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lclJlcXVpcmVtZW50RHVlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIHJlcXVpcmVtZW50c19kdWU/OiBBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJSZXF1aXJlbWVudER1ZT47XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbmQgY3VzdG9tZXIsIGluY2x1ZGluZyBzZWNyZXRzIGZvciBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJldGFQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBNYXBwaW5nIG9mIHByb2R1Y3QgbmFtZXMgdG8gdGhlaXIgY3VycmVudCBzdGF0dXMuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBCZXRhUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBwcm9kdWN0X3N0YXR1c2VzPzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH07XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0aGF0IGFyZSBzdGlsbCByZXF1aXJlZCB0byBiZSBzdWJtaXR0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lclJlcXVpcmVtZW50RHVlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRzX2R1ZT86IEFycmF5PFBhcnRuZXJFbmRDdXN0b21lclJlcXVpcmVtZW50RHVlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgQmV0YVBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgc2VjcmV0cz86IFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHM7XG59XG4vKipcbiAqIEJ1c2luZXNzIGlkZW50aXR5IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgV2hlbiB1c2luZyBhIENSQSBlbmRwb2ludCAoYW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgaS5lLiBhbnkgZW5kcG9pbnQgYmVnaW5uaW5nIHdpdGggYC9jcmEvYCksIHRoZSBgYWNjb3VudF9pZGAgcmV0dXJuZWQgd2lsbCBub3QgbWF0Y2ggdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCBieSBhIG5vbi1DUkEgZW5kcG9pbnQuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQnVzaW5lc3NBY2NvdW50VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlLCBQTkMsIGFuZCBVUyBCYW5rKS4gQmVjYXVzZSB0aGVzZSBhY2NvdW50cyBoYXZlIGEgZGlmZmVyZW50IGFjY291bnQgbnVtYmVyIGVhY2ggdGltZSB0aGV5IGFyZSBsaW5rZWQsIHRoaXMgZmllbGQgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWNjb3VudCBudW1iZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gYWNjb3VudCBhY3Jvc3MgbXVsdGlwbGUgSXRlbXMgZm9yIHBheW1lbnRzIHVzZSBjYXNlcywgaGVscGluZyB0byByZWR1Y2UgZHVwbGljYXRlIEl0ZW1zIG9yIGF0dGVtcHRlZCBmcmF1ZC4gSW4gU2FuZGJveCwgdGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgZm9yIFRBTi1iYXNlZCBpbnN0aXR1dGlvbnMgKGBpbnNfNTZgLCBgaW5zXzEzYCwgYGluc18xMjc5OTBgKSBhcyB3ZWxsIGFzIHRoZSBPQXV0aCBTYW5kYm94IGluc3RpdHV0aW9uIChgaW5zXzEyNzI4N2ApOyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRIb2xkZXJDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50XG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIG93bmVyIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM/OiBBcnJheTxPd25lcj47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQnVzaW5lc3NBY2NvdW50VmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgVW5zZW50ID0gJ3Vuc2VudCcsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc0FjY291bnRBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzQWNjb3VudEFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRBbGxPZlxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0FjY291bnRBbGxPZlxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzQWNjb3VudEFsbE9mXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBvd25lciBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnM/OiBBcnJheTxPd25lcj47XG59XG4vKipcbiAqIFRyaS1zdGF0ZSBib29sZWFuIHN0YXR1cywgd2hlcmUgYG5vX2RhdGFgIGluZGljYXRlcyB0aGUgY2hlY2sgY291bGQgbm90IGRldGVybWluZSBhIHZhbHVlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQnVzaW5lc3NDaGVja0Jvb2xlYW5TdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSZXN1bHRzIGZyb20gdGhlIGRpZ2l0YWwgcHJlc2VuY2UgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNXZWJQcmVzZW5jZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrXG4gICAgICovXG4gICAgc3RhdHVzOiBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c1dlYlByZXNlbmNlQ2hlY2s7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgZGlnaXRhbCBwcmVzZW5jZSBjb25maWRlbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrXG4gICAgICovXG4gICAgYWRkcmVzczogQnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVja1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVja1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IEJ1c2luZXNzRmllbGRNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmllbGRNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2tcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1dlYnNpdGVBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVja1xuICAgICAqL1xuICAgIHdlYnNpdGVfYW5hbHlzaXM6IEJ1c2luZXNzV2Vic2l0ZUFuYWx5c2lzIHwgbnVsbDtcbn1cbi8qKlxuICogRW1haWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggYSBidXNpbmVzc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc0VtYWlsQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzRW1haWxBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBFbWFpbCBhZGRyZXNzIG9mIHRoZSBidXNpbmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRW1haWxBZGRyZXNzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIHN0cnVjdHVyZSBvciB0eXBlIG9mIGJ1c2luZXNzIGVudGl0eVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQnVzaW5lc3NFbnRpdHlUeXBlIHtcbiAgICBTb2xlUHJvcHJpZXRvcnNoaXAgPSAnc29sZV9wcm9wcmlldG9yc2hpcCcsXG4gICAgR2VuZXJhbFBhcnRuZXJzaGlwID0gJ2dlbmVyYWxfcGFydG5lcnNoaXAnLFxuICAgIExsYyA9ICdsbGMnLFxuICAgIExscCA9ICdsbHAnLFxuICAgIExsbHAgPSAnbGxscCcsXG4gICAgTHAgPSAnbHAnLFxuICAgIENDb3Jwb3JhdGlvbiA9ICdjX2NvcnBvcmF0aW9uJyxcbiAgICBTQ29ycG9yYXRpb24gPSAnc19jb3Jwb3JhdGlvbicsXG4gICAgQkNvcnBvcmF0aW9uID0gJ2JfY29ycG9yYXRpb24nLFxuICAgIE5vbnByb2ZpdCA9ICdub25wcm9maXQnLFxuICAgIENvb3BlcmF0aXZlID0gJ2Nvb3BlcmF0aXZlJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgUHJvZmVzc2lvbmFsQXNzb2NpYXRpb24gPSAncHJvZmVzc2lvbmFsX2Fzc29jaWF0aW9uJyxcbiAgICBQcm9mZXNzaW9uYWxDb3Jwb3JhdGlvbiA9ICdwcm9mZXNzaW9uYWxfY29ycG9yYXRpb24nLFxuICAgIFRyYWRlTmFtZSA9ICd0cmFkZV9uYW1lJyxcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIENyZWRpdFVuaW9uID0gJ2NyZWRpdF91bmlvbicsXG4gICAgSW5zdXJhbmNlID0gJ2luc3VyYW5jZScsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBTdW1tYXJ5IG9mIGhvdyBhIHNwZWNpZmljIGJ1c2luZXNzIGZpZWxkIG1hdGNoZWQgYWdhaW5zdCBkYXRhIHByb3ZpZGVyIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzRmllbGRNYXRjaFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gTW9zdCByZWxldmFudCBmb3IgYnVzaW5lc3MgZmluYW5jZSB1c2UgY2FzZXMsIGJ1dCBub3QgbGltaXRlZCB0byBzdWNoIHVzZSBjYXNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NGaW5hbmNlQ2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0ZpbmFuY2VDYXRlZ29yeSB7XG4gICAgLyoqXG4gICAgICogQSBoaWdoIGxldmVsIGNhdGVnb3J5IHRoYXQgY29tbXVuaWNhdGVzIHRoZSBicm9hZCBjYXRlZ29yeSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBncmFudWxhciBjYXRlZ29yeSBjb252ZXlpbmcgdGhlIHRyYW5zYWN0aW9uXFwncyBpbnRlbnQuIFRoaXMgZmllbGQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBkZXRhaWxlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgaG93IGNvbmZpZGVudCB3ZSBhcmUgdGhhdCB0aGUgcHJvdmlkZWQgY2F0ZWdvcmllcyBhY2N1cmF0ZWx5IGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbiBpbnRlbnQuICBgVkVSWV9ISUdIYDogV2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSBhcmUgbW9yZSB0aGFuIDkwJSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgTUVESVVNYDogV2UgYXJlIG1vZGVyYXRlbHkgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYExPV2A6IFRoaXMgY2F0ZWdvcnkgbWF5IHJlZmxlY3QgdGhlIGludGVudCwgYnV0IHRoZXJlIG1heSBiZSBvdGhlciBjYXRlZ29yaWVzIHRoYXQgYXJlIG1vcmUgYWNjdXJhdGUuIGBVTktOT1dOYDogV2UgZG9uXFwndCBrbm93IHRoZSBjb25maWRlbmNlIGxldmVsIGZvciB0aGlzIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwcmVkaWN0ZWQgaW5kdXN0cnkgY2xhc3NpZmljYXRpb24gZm9yIHRoZSBidXNpbmVzcywgYmFzZWQgb24gZGlnaXRhbCBwcmVzZW5jZSBhc3Nlc3NtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0luZHVzdHJ5UHJlZGljdGlvbiB7XG4gICAgLyoqXG4gICAgICogTkFJQ1MgY29kZSBmb3IgdGhlIHByZWRpY3RlZCBidXNpbmVzcyBpbmR1c3RyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0luZHVzdHJ5UHJlZGljdGlvblxuICAgICAqL1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYnVzaW5lc3MgaW5kdXN0cnkgY2xhc3NpZmljYXRpb24gb2YgdGhlIHByZWRpY3RlZCBOQUlDUyBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzSW5kdXN0cnlQcmVkaWN0aW9uXG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcbn1cbi8qKlxuICogTnVsbGFibGUgaW5kdXN0cnkgcHJlZGljdGlvbiBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc0luZHVzdHJ5UHJlZGljdGlvbk51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb25OdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogTkFJQ1MgY29kZSBmb3IgdGhlIHByZWRpY3RlZCBidXNpbmVzcyBpbmR1c3RyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0luZHVzdHJ5UHJlZGljdGlvbk51bGxhYmxlXG4gICAgICovXG4gICAgY29kZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBidXNpbmVzcyBpbmR1c3RyeSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgcHJlZGljdGVkIE5BSUNTIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb25OdWxsYWJsZVxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdHMgZnJvbSB0aGUgS1lCIChLbm93IFlvdXIgQnVzaW5lc3MpIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBjaGVja1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc0tZQkNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NLWUJDaGVjayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzS1lCQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCQ2hlY2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJ1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzS1lCQ2hlY2s7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGNvbmZpZGVuY2UgaW4gS1lCIChLbm93IFlvdXIgQnVzaW5lc3MpIGlkZW50aXR5IGFzc2Vzc21lbnQgZm9yIHRoZSBidXNpbmVzc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCQ2hlY2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQkNoZWNrXG4gICAgICovXG4gICAgbmFtZTogQnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NGaWVsZE1hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJDaGVja1xuICAgICAqL1xuICAgIGFkZHJlc3M6IEJ1c2luZXNzRmllbGRNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmllbGRNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCQ2hlY2tcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBCdXNpbmVzc0ZpZWxkTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0tZQk1hdGNoRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJDaGVja1xuICAgICAqL1xuICAgIG1hdGNoX2RldGFpbHM6IEJ1c2luZXNzS1lCTWF0Y2hEZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJ1c2luZXNzIGZyb20gZGF0YSBwcm92aWRlciByZXN1bHRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzS1lCTWF0Y2hEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NLWUJNYXRjaERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIE5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge0FycmF5PFByb3ZpZGVyQnVzaW5lc3NOYW1lPn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJNYXRjaERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lczogQXJyYXk8UHJvdmlkZXJCdXNpbmVzc05hbWU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0VudGl0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCTWF0Y2hEZXRhaWxzXG4gICAgICovXG4gICAgZW50aXR5X3R5cGU6IEJ1c2luZXNzRW50aXR5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvdmlkZXJCdXNpbmVzc0FkZHJlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQk1hdGNoRGV0YWlsc1xuICAgICAqL1xuICAgIGFkZHJlc3NlczogQXJyYXk8UHJvdmlkZXJCdXNpbmVzc0FkZHJlc3M+O1xuICAgIC8qKlxuICAgICAqIFBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXNpbmVzc1xuICAgICAqIEB0eXBlIHtBcnJheTxCdXNpbmVzc1Bob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NLWUJNYXRjaERldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxCdXNpbmVzc1Bob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBFbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXNpbmVzc1xuICAgICAqIEB0eXBlIHtBcnJheTxCdXNpbmVzc0VtYWlsQWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzS1lCTWF0Y2hEZXRhaWxzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc2VzOiBBcnJheTxCdXNpbmVzc0VtYWlsQWRkcmVzcz47XG4gICAgLyoqXG4gICAgICogV2Vic2l0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXNpbmVzc1xuICAgICAqIEB0eXBlIHtBcnJheTxCdXNpbmVzc1dlYnNpdGU+fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQk1hdGNoRGV0YWlsc1xuICAgICAqL1xuICAgIHdlYnNpdGVzOiBBcnJheTxCdXNpbmVzc1dlYnNpdGU+O1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc0tZQk1hdGNoRGV0YWlsc1xuICAgICAqL1xuICAgIGZvcm1hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIGEgYnVzaW5lc3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NQaG9uZU51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzUGhvbmVOdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1Bob25lTnVtYmVyXG4gICAgICovXG4gICAgbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXN1bHRzIGZyb20gdGhlIGJ1c2luZXNzIHJpc2sgYXNzZXNzbWVudCBjaGVja1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc1Jpc2tDaGVja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzUmlza0NoZWNrIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNSaXNrQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzUmlza0NoZWNrXG4gICAgICovXG4gICAgc3RhdHVzOiBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c1Jpc2tDaGVjaztcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgcmlzayBhc3Nlc3NtZW50IGZvciB0aGUgYnVzaW5lc3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1Jpc2tDaGVja1xuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzSW5kdXN0cnlQcmVkaWN0aW9uTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzUmlza0NoZWNrXG4gICAgICovXG4gICAgaW5kdXN0cnlfcHJlZGljdGlvbjogQnVzaW5lc3NJbmR1c3RyeVByZWRpY3Rpb25OdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBidXNpbmVzcyBpbmZvcm1hdGlvbiB0aGF0IHdhcyB1c2VkIHRvIHBlcmZvcm0gdGhlIHZlcmlmaWNhdGlvbiBzZWFyY2hcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzU2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcy4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYW5kIGEgbWF4aW11bSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWx0ZXJuYXRpdmUgYnVzaW5lc3MgbmFtZXMgdGhhdCB3ZXJlIHN1Ym1pdHRlZCBhcyBzZWFyY2ggaW5wdXRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgYWx0ZXJuYXRpdmVfbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jlc3BvbnNlQnVzaW5lc3NBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgYWRkcmVzczogUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3M7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIGJ1c2luZXNzIHZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdEJ1c2luZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBidXNpbmVzcz86IEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdEJ1c2luZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBCdXNpbmVzcyBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgdmVyaWZpY2F0aW9uIHJlcXVlc3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0QnVzaW5lc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhbmQgYSBtYXhpbXVtIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzc1xuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhbmQgYSBtYXhpbXVtIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzc1xuICAgICAqL1xuICAgIGFsdGVybmF0aXZlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXF1ZXN0QnVzaW5lc3NBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzc1xuICAgICAqL1xuICAgIGFkZHJlc3M/OiBSZXF1ZXN0QnVzaW5lc3NBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RCdXNpbmVzc1xuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdEJ1c2luZXNzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdEJ1c2luZXNzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbn1cbi8qKlxuICogQSBidXNpbmVzcyB2ZXJpZmljYXRpb24gcmVwcmVzZW50cyBhIGNoZWNrIG9mIGEgYnVzaW5lc3NcXCdzIGlkZW50aXR5IGFuZCByaXNrIHByb2ZpbGUsIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgYWJvdXQgdGhlIGJ1c2luZXNzIGFuZCByZXN1bHRzIGZyb20gdGhpcmQtcGFydHkgZGF0YSBwcm92aWRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBidXNpbmVzcyB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNPdmVyYWxsfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c092ZXJhbGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEJ1c2luZXNzU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzS1lCQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWJfY2hlY2s6IEJ1c2luZXNzS1lCQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1Jpc2tDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IEJ1c2luZXNzUmlza0NoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRpZ2l0YWxfcHJlc2VuY2VfY2hlY2s6IEJ1c2luZXNzRGlnaXRhbFByZXNlbmNlQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhIGJ1c2luZXNzIHZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGJ1c2luZXNzIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBidXNpbmVzc192ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGJ1c2luZXNzIHZlcmlmaWNhdGlvbiByZXByZXNlbnRzIGEgY2hlY2sgb2YgYSBidXNpbmVzc1xcJ3MgaWRlbnRpdHkgYW5kIHJpc2sgcHJvZmlsZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBhYm91dCB0aGUgYnVzaW5lc3MgYW5kIHJlc3VsdHMgZnJvbSB0aGlyZC1wYXJ0eSBkYXRhIHByb3ZpZGVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGJ1c2luZXNzIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c092ZXJhbGx9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJ1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzT3ZlcmFsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogQnVzaW5lc3NTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NLWUJDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Yl9jaGVjazogQnVzaW5lc3NLWUJDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzUmlza0NoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogQnVzaW5lc3NSaXNrQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0RpZ2l0YWxQcmVzZW5jZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGlnaXRhbF9wcmVzZW5jZV9jaGVjazogQnVzaW5lc3NEaWdpdGFsUHJlc2VuY2VDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzaGFyZWFibGUgVVJMIHRoYXQgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIHVzZXIgdG8gY29tcGxldGUgdmVyaWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNoYXJlYWJsZV91cmw6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgS1lCIChLbm93IFlvdXIgQnVzaW5lc3MpIGlkZW50aXR5IGFzc2Vzc21lbnQgY2hlY2tcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJ1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzS1lCQ2hlY2sge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIG92ZXJhbGwgYnVzaW5lc3MgdmVyaWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCdXNpbmVzc1ZlcmlmaWNhdGlvblN0YXR1c092ZXJhbGwge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGJ1c2luZXNzIHJpc2sgYXNzZXNzbWVudCBjaGVja1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQnVzaW5lc3NWZXJpZmljYXRpb25TdGF0dXNSaXNrQ2hlY2sge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGRpZ2l0YWwgcHJlc2VuY2UgY2hlY2tcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJ1c2luZXNzVmVyaWZpY2F0aW9uU3RhdHVzV2ViUHJlc2VuY2VDaGVjayB7XG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBOb3RBcHBsaWNhYmxlID0gJ25vdF9hcHBsaWNhYmxlJ1xufVxuXG4vKipcbiAqIFdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIGEgYnVzaW5lc3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQnVzaW5lc3NXZWJzaXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NXZWJzaXRlIHtcbiAgICAvKipcbiAgICAgKiBVUkwgb2YgdGhlIGJ1c2luZXNzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1dlYnNpdGVcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFdlYnNpdGUgYW5hbHlzaXMgZGV0YWlscyBpZiBhIHdlYnNpdGUgaXMgZm91bmQgZm9yIHRoZSBwcm92aWRlZCB3ZWJzaXRlIGluIHRoZSBzZWFyY2ggdGVybXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJ1c2luZXNzV2Vic2l0ZUFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NXZWJzaXRlQW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0NoZWNrQm9vbGVhblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXZWJzaXRlQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpc19wYXJrZWQ6IEJ1c2luZXNzQ2hlY2tCb29sZWFuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0NoZWNrQm9vbGVhblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXZWJzaXRlQW5hbHlzaXNcbiAgICAgKi9cbiAgICBlbWFpbF9pc19kZWxpdmVyYWJsZTogQnVzaW5lc3NDaGVja0Jvb2xlYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzV2Vic2l0ZUJ1aWxkU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1dlYnNpdGVBbmFseXNpc1xuICAgICAqL1xuICAgIHdlYnNpdGVfYnVpbGRfc3RhdHVzOiBCdXNpbmVzc1dlYnNpdGVCdWlsZFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NXaG9pc1JlY29yZH1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXZWJzaXRlQW5hbHlzaXNcbiAgICAgKi9cbiAgICB3aG9pc19yZWNvcmQ6IEJ1c2luZXNzV2hvaXNSZWNvcmQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzV2Vic2l0ZVNTTH1cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXZWJzaXRlQW5hbHlzaXNcbiAgICAgKi9cbiAgICBzc2w6IEJ1c2luZXNzV2Vic2l0ZVNTTDtcbn1cbi8qKlxuICogQnVpbGQgc3RhdHVzIG9mIHRoZSBidXNpbmVzcyB3ZWJzaXRlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQnVzaW5lc3NXZWJzaXRlQnVpbGRTdGF0dXMge1xuICAgIENvbWluZ1Nvb24gPSAnY29taW5nX3Nvb24nLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIEluYWN0aXZlID0gJ2luYWN0aXZlJ1xufVxuXG4vKipcbiAqIFNTTCBzdGF0dXMgZm9yIHRoZSBidXNpbmVzcyB3ZWJzaXRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc1dlYnNpdGVTU0xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc1dlYnNpdGVTU0wge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0NoZWNrQm9vbGVhblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXZWJzaXRlU1NMXG4gICAgICovXG4gICAgaXNfdmFsaWQ6IEJ1c2luZXNzQ2hlY2tCb29sZWFuU3RhdHVzO1xufVxuLyoqXG4gKiBXSE9JUyBtZXRhZGF0YSBmb3IgdGhlIGJ1c2luZXNzIHdlYnNpdGUgZG9tYWluLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCdXNpbmVzc1dob2lzUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NXaG9pc1JlY29yZCB7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJ1c2luZXNzV2hvaXNSZWNvcmRcbiAgICAgKi9cbiAgICBkb21haW5fY3JlYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQnVzaW5lc3NXaG9pc1JlY29yZFxuICAgICAqL1xuICAgIGRvbWFpbl91cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1dob2lzUmVjb3JkXG4gICAgICovXG4gICAgZG9tYWluX2V4cGlyZXNfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRG9tYWluIHJlZ2lzdHJhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCdXNpbmVzc1dob2lzUmVjb3JkXG4gICAgICovXG4gICAgcmVnaXN0cmFyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvcmVnaXN0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBsb2FucyB0byByZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblJlZ2lzdGVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2FuczogQXJyYXk8Q3JhTG9hblJlZ2lzdGVyPjtcbn1cbi8qKlxuICogQW4gaW5zaWdodCB0aGF0IGNhbiBiZSBkZXRlY3RlZCBieSB0aGUgQ2FzaCBGbG93IFVwZGF0ZXMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ2FzaEZsb3dJbnNpZ2h0IHtcbiAgICBMYXJnZURlcG9zaXREZXRlY3RlZCA9ICdMQVJHRV9ERVBPU0lUX0RFVEVDVEVEJyxcbiAgICBMb3dCYWxhbmNlRGV0ZWN0ZWQgPSAnTE9XX0JBTEFOQ0VfREVURUNURUQnLFxuICAgIE5ld0xvYW5QYXltZW50RGV0ZWN0ZWQgPSAnTkVXX0xPQU5fUEFZTUVOVF9ERVRFQ1RFRCcsXG4gICAgTnNmT3ZlcmRyYWZ0RGV0ZWN0ZWQgPSAnTlNGX09WRVJEUkFGVF9ERVRFQ1RFRCdcbn1cblxuLyoqXG4gKiBXZWJob29rIGNvZGUgZm9yIGEgQ2FzaCBGbG93IFVwZGF0ZXMgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDYXNoRmxvd1VwZGF0ZXNFdmVudFdlYmhvb2tDb2RlcyB7XG4gICAgTGFyZ2VEZXBvc2l0RGV0ZWN0ZWQgPSAnTEFSR0VfREVQT1NJVF9ERVRFQ1RFRCcsXG4gICAgTG93QmFsYW5jZURldGVjdGVkID0gJ0xPV19CQUxBTkNFX0RFVEVDVEVEJyxcbiAgICBOZXdMb2FuUGF5bWVudERldGVjdGVkID0gJ05FV19MT0FOX1BBWU1FTlRfREVURUNURUQnLFxuICAgIE5zZk92ZXJkcmFmdERldGVjdGVkID0gJ05TRl9PVkVSRFJBRlRfREVURUNURUQnXG59XG5cbi8qKlxuICogRm9yIGVhY2ggdXNlclxcJ3MgSXRlbSBlbmFibGVkIGZvciBDYXNoIEZsb3cgVXBkYXRlcywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFuIHVwZGF0ZSBkZXRlY3RzIHRoYXQgYW4gZXhwZWN0ZWQgZGVwb3NpdCB3YXMgbWlzc2VkLiBVcG9uIHJlY2VpdmluZyB0aGUgd2ViaG9vaywgY2FsbCBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGAgdG8gcmV0cmlldmUgdGhlIHVwZGF0ZWQgaW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc0V4cGVjdGVkRGVwb3NpdE1pc3NlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNFeHBlY3RlZERlcG9zaXRNaXNzZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ0FTSF9GTE9XX1VQREFURVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzRXhwZWN0ZWREZXBvc2l0TWlzc2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFWFBFQ1RFRF9ERVBPU0lUX01JU1NFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNFeHBlY3RlZERlcG9zaXRNaXNzZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzRXhwZWN0ZWREZXBvc2l0TWlzc2VkV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgdGhhdCB0aGUgcmVwb3J0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0V4cGVjdGVkRGVwb3NpdE1pc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzRXhwZWN0ZWREZXBvc2l0TWlzc2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZvciBlYWNoIGl0ZW0gb24gYW4gZW5hYmxlZCB1c2VyLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHVwIHRvIGZvdXIgdGltZXMgYSBkYXkgd2l0aCBzdGF0dXMgaW5mb3JtYXRpb24uIFRoaXMgd2ViaG9vayB3aWxsIG5vdCBmaXJlIGltbWVkaWF0ZWx5IHVwb24gZW5yb2xsbWVudCBpbiBDYXNoIEZsb3cgVXBkYXRlcy4gVGhlIHBheWxvYWQgbWF5IGNvbnRhaW4gYW4gYGluc2lnaHRzYCBhcnJheSB3aXRoIGluc2lnaHRzIHRoYXQgaGF2ZSBiZWVuIGRldGVjdGVkLCBpZiBhbnkgKGUuZy4gYExPV19CQUxBTkNFX0RFVEVDVEVEYCwgYExBUkdFX0RFUE9TSVRfREVURUNURURgKS4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNJbnNpZ2h0c1YyV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc0luc2lnaHRzVjJXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ0FTSF9GTE9XX1VQREFURVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNWMldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ0FTSF9GTE9XX0lOU0lHSFRTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNWMldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNJbnNpZ2h0c1YyV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHdob3NlIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGlzIHJlY2VpdmVkIGJ5IGNhbGxpbmcgYC91c2VyL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNWMldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXJyYXkgY29udGFpbmluZyB0aGUgaW5zaWdodHMgZGV0ZWN0ZWQgd2l0aGluIHRoZSBnZW5lcmF0ZWQgcmVwb3J0LCBpZiBhbnkuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAgIGBMQVJHRV9ERVBPU0lUX0RFVEVDVEVEYDogc2lnbmFsaW5nIGEgZGVwb3NpdCBvdmVyICQ1LDAwMCAgIGBMT1dfQkFMQU5DRV9ERVRFQ1RFRGA6IHNpZ25hbGluZyBhIGJhbGFuY2UgYmVsb3cgJDEwMCAgIGBORVdfTE9BTl9QQVlNRU5UX0RFVEVDVEVEYDogc2lnbmFsaW5nIGEgbmV3IGxvYW4gcGF5bWVudCAgIGBOU0ZfT1ZFUkRSQUZUX0RFVEVDVEVEYDogc2lnbmFsaW5nIGFuIE5TRiBvdmVyZHJhZnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2FzaEZsb3dJbnNpZ2h0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNWMldlYmhvb2tcbiAgICAgKi9cbiAgICBpbnNpZ2h0czogQXJyYXk8Q2FzaEZsb3dJbnNpZ2h0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNJbnNpZ2h0c1YyV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZvciBlYWNoIHVzZXJcXCdzIEl0ZW0gZW5hYmxlZCBmb3IgQ2FzaCBGbG93IFVwZGF0ZXMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgYSBkYXkgd2l0aCBpbmZvcm1hdGlvbiBvbiB0aGUgc3RhdHVzIG9mIHRoZSB1cGRhdGUuIFRoaXMgd2ViaG9vayB3aWxsIG5vdCBmaXJlIGltbWVkaWF0ZWx5IHVwb24gZW5yb2xsbWVudCBpbiBDYXNoIEZsb3cgVXBkYXRlcy4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLiBBdCBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGBJTlNJR0hUU19VUERBVEVEYCB3ZWJob29rLCBhbnkgZXZlbnQtZHJpdmVuIGBDQVNIX0ZMT1dfVVBEQVRFU2Agd2ViaG9va3MgKGUuZy4gYExPV19CQUxBTkNFX0RFVEVDVEVEYCwgYExBUkdFX0RFUE9TSVRfREVURUNURURgKSB0aGF0IHdlcmUgdHJpZ2dlcmVkIGJ5IHRoZSB1cGRhdGUgd2lsbCBhbHNvIGZpcmUuIFRoaXMgd2ViaG9vayBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgYENBU0hfRkxPV19JTlNJR0hUU19VUERBVEVEYCB3ZWJob29rIGZvciBhbGwgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyBQbGFpZCBDaGVjayBvbiBvciBhZnRlciBEZWNlbWJlciAxMCwgMjAyNS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ0FTSF9GTE9XX1VQREFURVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOU0lHSFRTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBNb25pdG9yaW5nSW5zaWdodHNTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCB0aGF0IHRoZSByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZvciBlYWNoIHVzZXJcXCdzIEl0ZW0gZW5hYmxlZCBmb3IgQ2FzaCBGbG93IFVwZGF0ZXMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbiB1cGRhdGUgZGV0ZWN0cyBhIGRlcG9zaXQgb3ZlciAkNSwwMDAuIFVwb24gcmVjZWl2aW5nIHRoZSB3ZWJob29rLCBjYWxsIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvZ2V0YCB0byByZXRyaWV2ZSB0aGUgdXBkYXRlZCBpbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzTGFyZ2VEZXBvc2l0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc0xhcmdlRGVwb3NpdFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDQVNIX0ZMT1dfVVBEQVRFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMYXJnZURlcG9zaXRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExBUkdFX0RFUE9TSVRfREVURUNURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTGFyZ2VEZXBvc2l0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5zaWdodHNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0xhcmdlRGVwb3NpdFdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIHRoYXQgdGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMYXJnZURlcG9zaXRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0xhcmdlRGVwb3NpdFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyXFwncyBJdGVtIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYW4gdXBkYXRlIGRldGVjdHMgYSBiYWxhbmNlIGJlbG93ICQxMDAuIFVwb24gcmVjZWl2aW5nIHRoZSB3ZWJob29rLCBjYWxsIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvZ2V0YCB0byByZXRyaWV2ZSB0aGUgdXBkYXRlZCBpbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzTG93QmFsYW5jZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNMb3dCYWxhbmNlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19VUERBVEVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0xvd0JhbGFuY2VXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExPV19CQUxBTkNFX0RFVEVDVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc0xvd0JhbGFuY2VXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTG93QmFsYW5jZVdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIHRoYXQgdGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMb3dCYWxhbmNlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNMb3dCYWxhbmNlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZvciBlYWNoIHVzZXJcXCdzIEl0ZW0gZW5hYmxlZCBmb3IgQ2FzaCBGbG93IFVwZGF0ZXMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbiB1cGRhdGUgaW5jbHVkZXMgYW4gTlNGIG92ZXJkcmFmdCB0cmFuc2FjdGlvbi4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNOU0ZXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzTlNGV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19VUERBVEVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05TRldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTlNGX09WRVJEUkFGVF9ERVRFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOU0ZXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTlNGV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgdGhhdCB0aGUgcmVwb3J0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05TRldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTlNGV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZvciBlYWNoIHVzZXJcXCdzIEl0ZW0gZW5hYmxlZCBmb3IgQ2FzaCBGbG93IFVwZGF0ZXMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbiB1cGRhdGUgaW5jbHVkZXMgYSBuZXcgaW5jb21lIHN0cmVhbS4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoRmxvd1VwZGF0ZXNOZXdJbmNvbWVTdHJlYW1XZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaEZsb3dVcGRhdGVzTmV3SW5jb21lU3RyZWFtV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19VUERBVEVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0luY29tZVN0cmVhbVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTkVXX0lOQ09NRV9TVFJFQU1fREVURUNURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaEZsb3dVcGRhdGVzTmV3SW5jb21lU3RyZWFtV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5zaWdodHNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0luY29tZVN0cmVhbVdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIHRoYXQgdGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdJbmNvbWVTdHJlYW1XZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0luY29tZVN0cmVhbVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyXFwncyBJdGVtIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYW4gdXBkYXRlIGRldGVjdHMgYSBuZXcgbG9hbiBwYXltZW50LiBVcG9uIHJlY2VpdmluZyB0aGUgd2ViaG9vaywgY2FsbCBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGAgdG8gcmV0cmlldmUgdGhlIHVwZGF0ZWQgaW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc05ld0xvYW5QYXltZW50V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hGbG93VXBkYXRlc05ld0xvYW5QYXltZW50V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENBU0hfRkxPV19VUERBVEVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0xvYW5QYXltZW50V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBORVdfTE9BTl9QQVlNRU5UX0RFVEVDVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0xvYW5QYXltZW50V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5zaWdodHNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0xvYW5QYXltZW50V2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgdGhhdCB0aGUgcmVwb3J0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hGbG93VXBkYXRlc05ld0xvYW5QYXltZW50V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoRmxvd1VwZGF0ZXNOZXdMb2FuUGF5bWVudFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBjYXNoZmxvdyBhdHRyaWJ1dGVzLiBSZXF1aXJlZCBpZiB1c2luZyBDYXNoIEZsb3cgSW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDYXNoZmxvd0F0dHJpYnV0ZXNWZXJzaW9uIHtcbiAgICBWMTAgPSAndjEuMCcsXG4gICAgVjIwID0gJ3YyLjAnLFxuICAgIENmaTEgPSAnQ0ZJMSdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBvbiB0aGUgYWNjb3VudCBsZXZlbC4gVGhlc2UgYXJlIG9ubHkgcmV0dXJuZWQgZm9yIENyZWRpdCBhbmQgRGVwb3NpdG9yeSB0eXBlIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEFjY291bnRJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0QWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuICBBdmFpbGFibGUgZm9yIGBjcmVkaXRgIGFuZCBgZGVwb3NpdG9yeWAgdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8Q2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZT47XG4gICAgLyoqXG4gICAgICogTW9udGhseSBzdW1tYXJ5IHN0YXRpc3RpY3MgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1vbnRobHlfc3VtbWFyaWVzOiBBcnJheTxDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5Pjtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgdG8gcmV0cmlldmUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yICgxIHRvIDczMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2ggcGVyIGNhbGxcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY3Vyc29yIHZhbHVlIHJlcHJlc2VudHMgdGhlIGxhc3QgdXBkYXRlIHJlcXVlc3RlZC4gUGFzcyBpbiB0aGUgZW1wdHkgc3RyaW5nIFxcXCJcXFwiIGluIHRoZSBmaXJzdCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbSAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jYXNoZmxvd19yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgYGFjY291bnRzYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIHRyYW5zYWN0aW9ucyBhcmUgYmVpbmcgcmV0dXJuZWQuIEVhY2ggdHJhbnNhY3Rpb24gY2FuIGJlIG1hcHBlZCB0byBpdHMgY29ycmVzcG9uZGluZyBhY2NvdW50IHZpYSB0aGUgYGFjY291bnRfaWRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtBcnJheTxCdXNpbmVzc0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEJ1c2luZXNzQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdXNpbmcgdGhlIGBjdXJzb3JgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBhbnkgZnV0dXJlIHVwZGF0ZXMgYWZ0ZXIgdGhlIGxhdGVzdCB1cGRhdGUgcHJvdmlkZWQgaW4gdGhpcyByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGlmIG1vcmUgdGhhbiByZXF1ZXN0ZWQgY291bnQgb2YgdHJhbnNhY3Rpb25zIGV4aXN0cyB0byBiZSBmZXRjaGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBzdWNjZXNzZnVsIHVwZGF0ZSB0aW1lIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0SGlzdG9yaWNhbEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY2FzaGZsb3dfcmVwb3J0L2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2FzaGZsb3dfcmVwb3J0L2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEJ1c2luZXNzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxCdXNpbmVzc0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydEFjY291bnRJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9pbnNpZ2h0czogQ2FzaGZsb3dSZXBvcnRBY2NvdW50SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogRGF0ZXRpbWUgb2YgbGFzdCBDYXNoZmxvdyBSZXBvcnQgZ2VuZXJhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgIClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X2dlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTW9udGhseSBzdW1tYXJ5IHN0YXRpc3RpY3MgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuICBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGJlZ2luIHdpdGggdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGguICBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguICBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydGluZ19iYWxhbmNlOiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5U3RhcnRpbmdCYWxhbmNlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUVuZGluZ0JhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRpbmdfYmFsYW5jZTogQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUVuZGluZ0JhbGFuY2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGFpbHlfZW5kaW5nX2JhbGFuY2U6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlFbmRpbmdCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5SW5mbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgYXZlcmFnZV9kYWlseV9pbmZsb3dfYW1vdW50OiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5SW5mbG93QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGFpbHlfb3V0Zmxvd19hbW91bnQ6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlPdXRmbG93QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5TmV0Q2FzaGZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBhdmVyYWdlX2RhaWx5X25ldF9jYXNoZmxvd19hbW91bnQ6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlOZXRDYXNoZmxvd0Ftb3VudDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGRhaWx5IGluZmxvdyB0cmFuc2FjdGlvbnMuIFJvdW5kZWQgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgYXZlcmFnZV9kYWlseV9pbmZsb3dfdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGRhaWx5IG91dGZsb3cgdHJhbnNhY3Rpb25zLiBSb3VuZGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGFpbHlfb3V0Zmxvd190cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfcmV2ZW51ZTogQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUmV2ZW51ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnR9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9sb2FuX3BheW1lbnQ6IENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbExvYW5QYXltZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxWYXJpYWJsZUV4cGVuc2V9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF92YXJpYWJsZV9leHBlbnNlOiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxWYXJpYWJsZUV4cGVuc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFBheXJvbGx9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9wYXlyb2xsOiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxQYXlyb2xsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgYWxsIE5TRiB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIG5zZl90cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgYWxsIG92ZXJkcmFmdCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVxuICAgICAqL1xuICAgIG92ZXJkcmFmdF90cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB3aXRoIGEgbmVnYXRpdmUgZGFpbHkgYXZlcmFnZSBlbmRpbmcgYmFsYW5jZS4gVGhlIGRhaWx5IGF2ZXJhZ2UgaXMgY2FsY3VsYXRlZCBhY3Jvc3MgYWxsIHZhbGlkIGFjY291bnRzLiBWYWx1ZXMgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsIDMxXS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5XG4gICAgICovXG4gICAgbmVnYXRpdmVfZW5kaW5nX2JhbGFuY2VfZGF5X2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIENhbGVuZGFyLWRheSBhdmVyYWdlIG9mIHRoZSBlbmRpbmcgYmFsYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseUVuZGluZ0JhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlFbmRpbmdCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5RW5kaW5nQmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGF2ZXJhZ2UgZGFpbHkgc3VtIG9mIGluZmxvdyB0cmFuc2FjdGlvbnMsIGNhbGN1bGF0ZWQgb3ZlciB0aGUgbW9udGguIEFsd2F5cyByZXByZXNlbnRlZCBhcyBhIHBvc2l0aXZlIG1vbmV0YXJ5IGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseUluZmxvd0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseUluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhdmVyYWdlIGRhaWx5IG5ldCBjYXNoIGZsb3cgYW1vdW50LCBjYWxjdWxhdGVkIGFzIHRvdGFsIGRhaWx5IGluZmxvd3MgbGVzcyB0b3RhbCBkYWlseSBvdXRmbG93cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU5ldENhc2hmbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU5ldENhc2hmbG93QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlOZXRDYXNoZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlOZXRDYXNoZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU5ldENhc2hmbG93QW1vdW50XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYXZlcmFnZSBkYWlseSBzdW0gb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbnMsIGNhbGN1bGF0ZWQgb3ZlciB0aGUgbW9udGguIEFsd2F5cyByZXByZXNlbnRlZCBhcyBhIHBvc2l0aXZlIG1vbmV0YXJ5IGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUF2ZXJhZ2VEYWlseU91dGZsb3dBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlBdmVyYWdlRGFpbHlPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5QXZlcmFnZURhaWx5T3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBtb250aC4gVGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBzdGFydGluZyBiYWxhbmNlIG9mIHRoZSBuZXh0IG1vbnRoLiBUaGlzIGZpZWxkIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBmb3IgdGhlIGxhc3QgbW9udGhseSBzdW1tYXJ5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5RW5kaW5nQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlFbmRpbmdCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlFbmRpbmdCYWxhbmNlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeUVuZGluZ0JhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlFbmRpbmdCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgbW9udGguIFRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgZW5kaW5nIGJhbGFuY2Ugb2YgdGhlIHByZXZpb3VzIG1vbnRoLiBUaGlzIGZpZWxkIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBmb3IgdGhlIGZpcnN0IG1vbnRobHkgc3VtbWFyeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVN0YXJ0aW5nQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVN0YXJ0aW5nQmFsYW5jZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlTdGFydGluZ0JhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0b3RhbCBhbW91bnQgb2YgYWxsIGxvYW4gcGF5bWVudCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbExvYW5QYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxMb2FuUGF5bWVudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsTG9hblBheW1lbnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0b3RhbCBhbW91bnQgb2YgYWxsIHBheXJvbGwgdHJhbnNhY3Rpb25zIGR1cmluZyB0aGlzIG1vbnRoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxQYXlyb2xsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUGF5cm9sbCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxQYXlyb2xsXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUGF5cm9sbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsUGF5cm9sbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCBvZiBhbGwgcmV2ZW51ZSB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoaXMgbW9udGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFJldmVudWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFJldmVudWVcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydE1vbnRobHlTdW1tYXJ5VG90YWxSZXZlbnVlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdG90YWwgYW1vdW50IG9mIGFsbCB2YXJpYWJsZSBleHBlbnNlIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhpcyBtb250aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsVmFyaWFibGVFeHBlbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsVmFyaWFibGVFeHBlbnNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFZhcmlhYmxlRXhwZW5zZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0TW9udGhseVN1bW1hcnlUb3RhbFZhcmlhYmxlRXhwZW5zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRNb250aGx5U3VtbWFyeVRvdGFsVmFyaWFibGVFeHBlbnNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBpbnRlci1iYW5rIHRyYW5zZmVycy4gSWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBub3QgYW4gaW50ZXItYmFuayB0cmFuc2ZlciwgYWxsIGZpZWxkcyB3aWxsIGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0UGF5bWVudE1ldGEge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiByZWZlcmVuY2UgbnVtYmVyIHN1cHBsaWVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBQUEQgSUQgZm9yIHRoZSBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcHBkX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHJlY2VpdmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0eSBpbml0aWF0aW5nIGEgd2lyZSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBhIHdpcmUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIGJ5X29yZGVyX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHBheWluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLCBlLmcuIFxcJ0FDSFxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0UGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGF5bWVudCBwcm9jZXNzb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9jZXNzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgdG8gcmV0cmlldmUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yICgxIHRvIDczMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFuc2FjdGlvbiByZXR1cm5lZCBmcm9tIENhc2hmbG93IFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBGb3IgYWxsIHByb2R1Y3RzIGV4Y2VwdCBJbmNvbWU6IFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS4gRm9yIEluY29tZSBlbmRwb2ludHMsIHZhbHVlcyBhcmUgcG9zaXRpdmUgd2hlbiByZXByZXNlbnRpbmcgaW5jb21lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgTm90ZTogVGhpcyBpcyBhIGxlZ2FjeSBmaWVsZCB0aGF0IGlzIG5vdCBhY3RpdmVseSBtYWludGFpbmVkLiBVc2UgYG1lcmNoYW50X25hbWVgIGluc3RlYWQgZm9yIHRoZSBtZXJjaGFudCBuYW1lLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBpZiB0aGUgY2xpZW50IGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE6IENhc2hmbG93UmVwb3J0UGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS4gTm90IGFsbCBpbnN0aXR1dGlvbnMgcHJvdmlkZSBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy4gQSBzdWItYWNjb3VudCBtb3N0IGNvbW1vbmx5IGV4aXN0cyBpbiBjYXNlcyB3aGVyZSBhIHNpbmdsZSBhY2NvdW50IGlzIGxpbmtlZCB0byBtdWx0aXBsZSBjYXJkcywgZWFjaCB3aXRoIGl0cyBvd24gY2FyZCBudW1iZXIgYW5kIGNhcmQgaG9sZGVyIG5hbWU7IGVhY2ggY2FyZCB3aWxsIGJlIGNvbnNpZGVyZWQgYSBzdWItYWNjb3VudC4gSWYgdGhlIGFjY291bnQgZG9lcyBoYXZlIHN1Yi1hY2NvdW50cywgdGhpcyBmaWVsZCB3aWxsIHR5cGljYWxseSBiZSBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWItYWNjb3VudCBvd25lclxcJ3MgbmFtZSBhbmQvb3IgdGhlIHN1Yi1hY2NvdW50IG1hc2suIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWVsZCBpcyBub3Qgc3RhbmRhcmRpemVkIGFuZCB3aWxsIHZhcnkgYmFzZWQgb24gaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSBhIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgd2Vic2l0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHJhdGhlciB0aGFuIHBvc3RlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAgZmllbGQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDaGFubmVsfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCdXNpbmVzc0ZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGJ1c2luZXNzX2ZpbmFuY2VfY2F0ZWdvcnk/OiBCdXNpbmVzc0ZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY3JlZGl0X2NhdGVnb3J5PzogQ3JlZGl0Q2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgYSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LiBJbiB0aGUgY2FzZSBvZiBhIG1lcmNoYW50IHdpdGggbXVsdGlwbGUgcmV0YWlsIGxvY2F0aW9ucywgdGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYnJvYWRlciBtZXJjaGFudCwgbm90IGEgc3BlY2lmaWMgbG9jYXRpb24gb3Igc3RvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoIHBlciBjYWxsXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnNvciB2YWx1ZSByZXByZXNlbnRzIHRoZSBsYXN0IHVwZGF0ZSByZXF1ZXN0ZWQuIFBhc3MgaW4gdGhlIGVtcHR5IHN0cmluZyBcXFwiXFxcIiBpbiB0aGUgZmlyc3QgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEJ1c2luZXNzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QnVzaW5lc3NBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB1c2luZyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGFueSBmdXR1cmUgdXBkYXRlcyBhZnRlciB0aGUgbGF0ZXN0IHVwZGF0ZSBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbnMgZXhpc3RzIHRvIGJlIGZldGNoZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDYXRlZ29yaWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NhdGVnb3JpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgdHJhbnNhY3Rpb24gY2F0ZWdvcmllcyB1c2VkIGJ5IFBsYWlkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeT59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3JpZXM6IEFycmF5PENhdGVnb3J5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIGEgdHJhbnNhY3Rpb24gY2F0ZWdvcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZnlpbmcgbnVtYmVyIGZvciB0aGUgY2F0ZWdvcnkuIGBjYXRlZ29yeV9pZGAgaXMgYSBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lcmNoYW50IGNhdGVnb3J5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgcGxhY2VgIGZvciBwaHlzaWNhbCB0cmFuc2FjdGlvbnMgb3IgYHNwZWNpYWxgIGZvciBvdGhlciB0cmFuc2FjdGlvbnMgc3VjaCBhcyBiYW5rIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBncm91cDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgYGNhdGVnb3J5X2lkYCBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGhpZXJhcmNoeTogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRGV0YWlsZWQgZXhwZW5zZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBjcmVkaXQgY2F0ZWdvcnksIGluY2x1ZGluZyB0cmFuc2FjdGlvbiBjb3VudCBhbmQgdG90YWwgYW1vdW50IHNwZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUV4cGVuc2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlFeHBlbnNlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjcmVkaXQgY2F0ZWdvcnkuICBTZWUgdGhlIFtjYXRlZ29yeSB0YXhvbm9teV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NyZWRpdC1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBjYXRlZ29yeSBJRHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlFeHBlbnNlc1xuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoaXMgY3JlZGl0IGNhdGVnb3J5IHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlFeHBlbnNlc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHZhbHVlIGZvciBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGlzIGNhdGVnb3J5IHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlFeHBlbnNlc1xuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5RXhwZW5zZXNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5RXhwZW5zZXNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb250aGx5QXZlcmFnZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlFeHBlbnNlc1xuICAgICAqL1xuICAgIG1vbnRobHlfYXZlcmFnZT86IE1vbnRobHlBdmVyYWdlIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQ2F0ZWdvcnkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIGNvdW50ZXJwYXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5IHNvcnRlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG9wX2NvdW50ZXJwYXJ0aWVzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5zaWdodHMgb24gYSB1c2VyXFwncyB0b3AgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgcmFua2VkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHRzXG4gICAgICovXG4gICAgcHJpbWFyeV9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5zaWdodHMgb2YgdG9wIGRldGFpbGVkIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBkZXRhaWxlZF9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xufVxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIHJlYXNvbiBmb3IgdGhlIGVycm9yIGNvZGUuIEN1cnJlbnRseSwgcmVhc29ucyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIE9BdXRoLWJhc2VkIGl0ZW0gZXJyb3JzOyBgbnVsbGAgd2lsbCBiZSByZXR1cm5lZCBvdGhlcndpc2UuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuICBQb3NzaWJsZSB2YWx1ZXM6IGBPQVVUSF9JTlZBTElEX1RPS0VOYDogVGhlIHVzZXJcXCdzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgYmVlbiBpbnZhbGlkYXRlZC4gIGBPQVVUSF9DT05TRU5UX0VYUElSRURgOiBUaGUgdXNlclxcJ3MgYWNjZXNzIGNvbnNlbnQgZm9yIHRoaXMgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGhhcyBleHBpcmVkLiAgYE9BVVRIX1VTRVJfUkVWT0tFRGA6IFRoZSB1c2VyXFwncyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaXMgaW52YWxpZCBiZWNhdXNlIHRoZSB1c2VyIHJldm9rZWQgdGhlaXIgY29ubmVjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGVfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3QsIHRvIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZyBwdXJwb3Nlcy4gVGhpcyBmaWVsZCB3aWxsIGJlIG9taXR0ZWQgaW4gZXJyb3JzIHByb3ZpZGVkIGJ5IHdlYmhvb2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGlzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAgb3IgYENIRUNLX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIGFjY291bnQgc3VidHlwZXMgdGhhdCB3ZXJlIHJlcXVlc3RlZCB2aWEgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gQ3VycmVudGx5IG9ubHkgcG9wdWxhdGVkIGZvciBgTk9fQUNDT1VOVFNgIGVycm9ycyBmcm9tIEl0ZW1zIHdpdGggYGludmVzdG1lbnRzX2F1dGhgIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgcmVxdWlyZWRfYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBhY2NvdW50IHN1YnR5cGVzIHRoYXQgd2VyZSBleHRyYWN0ZWQgYnV0IGRpZCBub3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBzdWJ0eXBlcyB2aWEgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gQ3VycmVudGx5IG9ubHkgcG9wdWxhdGVkIGZvciBgTk9fQUNDT1VOVFNgIGVycm9ycyBmcm9tIEl0ZW1zIHdpdGggYGludmVzdG1lbnRzX2F1dGhgIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgcHJvdmlkZWRfYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F1c2VBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZUFsbE9mXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHBsdXMgdGhlIGBpdGVtX2lkYCBvZiBhbiBJdGVtIHRoYXQgdGhlIGVuZCB1c2VyIGNhbiByZXBhaXIgdmlhIExpbmsgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBUaGUgYGVycm9yX2NvZGVgIHdpbGwgYmUgaW4gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBmYW1pbHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENoZWNrUmVwb3J0UmVwYWlyYWJsZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja1JlcG9ydFJlcGFpcmFibGVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENoZWNrUmVwb3J0UmVwYWlyYWJsZUl0ZW1cbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBQbGFpZEVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENoZWNrUmVwb3J0UmVwYWlyYWJsZUl0ZW1cbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENoZWNrUmVwb3J0UmVwYWlyYWJsZUl0ZW1cbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENoZWNrUmVwb3J0UmVwYWlyYWJsZUl0ZW1cbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENoZWNrUmVwb3J0UmVwYWlyYWJsZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhIENoZWNrIFJlcG9ydCBwcm9kdWN0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBpbmZvcm1hdGlvbi4gSW4gc3VjaCBjYXNlcywgdGhlIHByb2R1Y3Qgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IHNvbWUgb2YgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiBjb3VsZCBub3QgYmUgcmV0cmlldmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDaGVja1JlcG9ydFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja1JlcG9ydFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIHR5cGUsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBDSEVDS19SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDaGVja1JlcG9ydFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2hlY2tSZXBvcnRXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2hlY2tSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBDaGVja1JlcG9ydFdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ2hlY2tSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENhdXNlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiAgQWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBDcmVkaXQgYW5kIERlcG9zaXRvcnkgYWNjb3VudHMgYXJlIHVuYXZhaWxhYmxlLiBgVVNFUl9GUkFVRF9BTEVSVGA6IFRoZSB1c2VyIGhhcyBwbGFjZWQgYSBmcmF1ZCBhbGVydCBvbiB0aGVpciBQbGFpZCBDaGVjayBjb25zdW1lciByZXBvcnQgZHVlIHRvIHN1c3BlY3RlZCBmcmF1ZC4gUGxlYXNlIG5vdGUgdGhhdCB3aGVuIGEgZnJhdWQgYWxlcnQgaXMgaW4gcGxhY2UsIHRoZSByZWNpcGllbnQgb2YgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgYW4gb2JsaWdhdGlvbiB0byB2ZXJpZnkgdGhlIGNvbnN1bWVyXFwncyBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENoZWNrUmVwb3J0V2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgVXNlckZyYXVkQWxlcnQgPSAnVVNFUl9GUkFVRF9BTEVSVCdcbn1cblxuLyoqXG4gKiBDdXN0b20gY2xpZW50IGZpZWxkc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRDdXN0b21pemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q3VzdG9taXphdGlvbiB7XG4gICAgLyoqXG4gICAgICogQ3VzdG9tIGVudGl0eSBJRCB0aGF0IG1hcHMgdG8gYSBtZXJjaGFudCBvciBjb3VudGVycGFydHkuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGBtZXJjaGFudF9lbnRpdHlfaWRgIGFzIHdlbGwgYXMgdGhlIGBlbnRpdHlfaWRgIG9uIHRoZSBjb3VudGVycGFydGllcyBvYmplY3QgdG8gbWVldCBjbGllbnQgc3BlY2lmaWMgbmVlZHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50Q3VzdG9taXphdGlvblxuICAgICAqL1xuICAgIGN1c3RvbV9lbnRpdHlfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIHRoYXQgUGxhaWQgaGFzIGVuaGFuY2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIHRvIHRpZSB0cmFuc2FjdGlvbnMgYmFjayB0byBjbGllbnRzXFwnIHN5c3RlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSBhY2NvdW50XFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5oYW5jZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBlbmhhbmNlbWVudHM6IEVuaGFuY2VtZW50cztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gdGhhdCBQbGFpZCBoYXMgZW5yaWNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIHRyYW5zYWN0aW9uIGFzIHByb3ZpZGVkIGJ5IHlvdSBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWNjb3VudCBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiBhY2NvdW50LCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF9hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2htZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5yaWNobWVudHM6IEVucmljaG1lbnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRDdXN0b21pemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfY3VzdG9taXphdGlvbj86IENsaWVudEN1c3RvbWl6YXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5oYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGlyZWN0aW9uLiAoTk9URTogdGhpcyB3aWxsIGFmZmVjdCBlbnJpY2htZW50IHJlc3VsdHMsIHNvIGRpcmVjdGlvbnMgYXJlIGltcG9ydGFudCkuICAgTmVnYXRpdmUgKC0pIGZvciBjcmVkaXRzIChlLmcuLCBpbmNvbWluZyB0cmFuc2ZlcnMsIHJlZnVuZHMpICAgUG9zaXRpdmUgKCspIGZvciBkZWJpdHMgKGUuZy4sIHB1cmNoYXNlcywgZmVlcywgb3V0Z29pbmcgdHJhbnNmZXJzKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24gZS5nLiBVU0QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIGZvciBQbGFpZCB0byBlbnJpY2guXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBmb3IgdGhlIHRyYW5zYWN0aW9uIHVzZWQgdG8gaGVscCB5b3UgdGllIGRhdGEgYmFjayB0byB5b3VyIHN5c3RlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGdlbmVyYXRlZCBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGZvciB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIGVucmljaCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB1c2VyLCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWNjb3VudCBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiBhY2NvdW50LCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF9hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLiBJZiB5b3UgaGF2ZSBsb2NhdGlvbiBkYXRhIGluIGF2YWlsYWJsZSBhbiB1bnN0cnVjdHVyZWQgZm9ybWF0LCBpdCBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMCkuIFdoZW4gdGVzdGluZyBFbnJpY2gsIG5vdGUgdGhhdCBgYW1vdW50YCBkYXRhIHNob3VsZCBiZSByZWFsaXN0aWMuIFVucmVhbGlzdGljIG9yIGluYWNjdXJhdGUgYGFtb3VudGAgZGF0YSBtYXkgcmVzdWx0IGluIHJlZHVjZWQgcXVhbGl0eSBvdXRwdXQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogRW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb247XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBjb2RlcyAoTUNDcykgYXJlIGZvdXItZGlnaXQgbnVtYmVycyB0aGF0IGRlc2NyaWJlIGEgbWVyY2hhbnRcXCdzIHByaW1hcnkgYnVzaW5lc3MgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWNjPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZS4gIFVzZSB0aGlzIGZpZWxkIHRvIHBhc3MgaW4gc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB5b3UgbWF5IGhhdmUgYWJvdXQgeW91ciB0cmFuc2FjdGlvbnMuIFByb3ZpZGluZyBsb2NhdGlvbiBkYXRhIGlzIG9wdGlvbmFsIGJ1dCBjYW4gaW5jcmVhc2UgcmVzdWx0IHF1YWxpdHkuIElmIHlvdSBoYXZlIHVuc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZCwgZm9ybWF0dGVkIGFzIGFuIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgKFxcXCJVU1xcXCIgb3IgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZCwgZm9ybWF0dGVkIGFzIHRoZSBvZmZpY2lhbCB0d28tbGV0dGVyIFVTIHN0YXRlIG9yIENhbmFkaWFuIHByb3ZpbmNlIHBvc3RhbCBjb2RlLCBlLmcuIFxcXCJDVFxcXCIgb3IgXFxcIlFDXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBhZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpZGVudGl0eSBmaWVsZHMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci4gRm9yIGEgdXNlciB0byBiZSBlbGlnaWJsZSBmb3IgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQsIGFsbCBmaWVsZHMgYXJlIHJlcXVpcmVkIGV4Y2VwdCBgaWRfbnVtYmVyYC4gUHJvdmlkaW5nIGEgcGFydGlhbCBTU04gaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQsIGFuZCBpbXByb3ZlcyB0aGUgYWNjdXJhY3kgb2YgbWF0Y2hpbmcgdXNlciByZWNvcmRzIGR1cmluZyBjb21wbGlhbmNlIHByb2Nlc3NlcyBzdWNoIGFzIGZpbGUgZGlzY2xvc3VyZSwgZGlzcHV0ZSwgb3Igc2VjdXJpdHkgZnJlZXplIHJlcXVlc3RzLiBJZiBjcmVhdGluZyBhIHJlcG9ydCB0aGF0IHdpbGwgYmUgc2hhcmVkIHdpdGggR1NFcyBzdWNoIGFzIEZhbm5pZSBvciBGcmVkZGllLCBhIGZ1bGwgU29jaWFsIFNlY3VyaXR5IE51bWJlciBtdXN0IGJlIHByb3ZpZGVkIHZpYSB0aGUgYGlkX251bWJlcmAgZmllbGQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NsaWVudFVzZXJJZGVudGl0eU5hbWV9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIG5hbWU/OiBDbGllbnRVc2VySWRlbnRpdHlOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZGF0ZSBvZiBiaXJ0aCwgdG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlscy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50VXNlcklkZW50aXR5RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBlbWFpbHM/OiBBcnJheTxDbGllbnRVc2VySWRlbnRpdHlFbWFpbD47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlcnMsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTc0NTIxMzBcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4gUGhvbmUgbnVtYmVyIGlucHV0IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHZhbGlkIG51bWJlciByYW5nZXM7IG51bWJlciBzdHJpbmdzIHRoYXQgZG8gbm90IG1hdGNoIGEgcmVhbC13b3JsZCBwaG9uZSBudW1iZXJpbmcgc2NoZW1lIG1heSBjYXVzZSB0aGUgcmVxdWVzdCB0byBmYWlsLCBldmVuIGluIHRoZSBTYW5kYm94IHRlc3QgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFVzZXJJZGVudGl0eVBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVycz86IEFycmF5PENsaWVudFVzZXJJZGVudGl0eVBob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWRkcmVzc2VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRVc2VySWRlbnRpdHlBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgYWRkcmVzc2VzPzogQXJyYXk8Q2xpZW50VXNlcklkZW50aXR5QWRkcmVzcz47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIElEIG51bWJlcnMuXG4gICAgICogQHR5cGUge0FycmF5PFVzZXJJRE51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGlkX251bWJlcnM/OiBBcnJheTxVc2VySUROdW1iZXI+O1xufVxuLyoqXG4gKiBVc2VyIGFkZHJlc3MgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRVc2VySWRlbnRpdHlBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBGaXJzdCBsaW5lIG9mIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXRfMT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kIGxpbmUgb2Ygc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldF8yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlLCBwcm92aW5jZSBvciByZWdpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUG9zdGFsIG9yIFpJUCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyB0aGUgcHJpbWFyeSBhZGRyZXNzIGZvciB0aGUgVXNlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG59XG4vKipcbiAqIFVzZXIgZW1haWwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eUVtYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50VXNlcklkZW50aXR5RW1haWwge1xuICAgIC8qKlxuICAgICAqIFVzZXJcXCdzIGVtYWlsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eUVtYWlsXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgdGhlIHByaW1hcnkgZW1haWwgZm9yIHRoZSBVc2VyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlFbWFpbFxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG59XG4vKipcbiAqIFVzZXIgbmFtZSBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50VXNlcklkZW50aXR5TmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eU5hbWUge1xuICAgIC8qKlxuICAgICAqIFVzZXJcXCdzIGdpdmVuIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50VXNlcklkZW50aXR5TmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVc2VyXFwncyBmYW1pbHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVXNlciBwaG9uZSBudW1iZXIgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFVzZXJJZGVudGl0eVBob25lTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50VXNlcklkZW50aXR5UGhvbmVOdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRVc2VySWRlbnRpdHlQaG9uZU51bWJlclxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IHBob25lIG51bWJlciBmb3IgdGhlIFVzZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENsaWVudFVzZXJJZGVudGl0eVBob25lTnVtYmVyXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBkaXNwbGF5IHB1cnBvc2VzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkaXNwbGF5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGFwcGxpY2F0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl91cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb25uZWN0ZWQgYXBwIHN0YXRpbmcgd2h5IHRoZXkgdXNlIHRoZWlyIHJlc3BlY3RpdmUgZW5hYmxlZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHJlYXNvbl9mb3JfYWNjZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGlzIGFwcGxpY2F0aW9uIHdhcyBsaW5rZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMgKGUuZy4gYFxcXCIyMDIwLTAxLTAxVDAwOjAwOjAwWlxcXCJgKS4gTm90ZSB0aGF0IG9sZGVyLCBsZWdhY3kgaW50ZWdyYXRpb25zIGluc3RlYWQgcmVjZWl2ZSB0aGlzIHZhbHVlIGFzIGEgZGF0ZSBvbmx5LCBpbiBgWVlZWS1NTS1ERGAgZm9ybWF0IChlLmcuIGBcXFwiMjAyMC0wMS0wMVxcXCJgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgc2NvcGVzPzogU2NvcGVzTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgYSBjb25zZW50IGV2ZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zZW50RXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zZW50RXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBjb25zZW50IGV2ZW50IG9jY3VycmVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZT86IENvbnNlbnRFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnNlbnRFdmVudENvZGV9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2NvZGU/OiBDb25zZW50RXZlbnRDb2RlO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnNlbnRFdmVudEluaXRpYXRvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgaW5pdGlhdG9yPzogQ29uc2VudEV2ZW50SW5pdGlhdG9yO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGZ1bGwgbGlzdCBvZiB1c2UgY2FzZXMgdGhlIGVuZCB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtLiAgU2VlIHRoZSBbZnVsbCBsaXN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jdXBkYXRpbmctbGluay1jdXN0b21pemF0aW9ucykgb2YgdXNlIGNhc2VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfdXNlX2Nhc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBmdWxsIGxpc3Qgb2YgZGF0YSBzY29wZXMgdGhlIGVuZCB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtLiBUaGVzZSBjb3JyZXNwb25kIHRvIGNvbnNlbnRlZCBwcm9kdWN0czsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jZGF0YS1zY29wZXMtYnktcHJvZHVjdCkgb2YgZGF0YSBzY29wZXMgYW5kIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfZGF0YV9zY29wZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggYXV0aG9yaXphdGlvbnMgYXJlIGdyYW50ZWQuXG4gICAgICogQHR5cGUge0FycmF5PENvbnNlbnRlZEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfYWNjb3VudHM/OiBBcnJheTxDb25zZW50ZWRBY2NvdW50Pjtcbn1cbi8qKlxuICogQ29kZXMgZGVzY3JpYmluZyB0aGUgb2JqZWN0IG9mIGEgY29uc2VudCBldmVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnNlbnRFdmVudENvZGUge1xuICAgIFVzZXJBZ3JlZW1lbnQgPSAnVVNFUl9BR1JFRU1FTlQnLFxuICAgIFVzZUNhc2VzID0gJ1VTRV9DQVNFUycsXG4gICAgRGF0YVNjb3BlcyA9ICdEQVRBX1NDT1BFUycsXG4gICAgQWNjb3VudFNjb3BlcyA9ICdBQ0NPVU5UX1NDT1BFUycsXG4gICAgUmV2b2NhdGlvbiA9ICdSRVZPQ0FUSU9OJ1xufVxuXG4vKipcbiAqIFRoZSBlbnRpdHkgdGhhdCBpbml0aWF0ZWQgY29sbGVjdGlvbiBvZiBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ29uc2VudEV2ZW50SW5pdGlhdG9yIHtcbiAgICBQbGFpZCA9ICdQTEFJRCcsXG4gICAgRGF0YVByb3ZpZGVyID0gJ0RBVEFfUFJPVklERVInLFxuICAgIEN1c3RvbWVyID0gJ0NVU1RPTUVSJyxcbiAgICBFbmRVc2VyID0gJ0VORF9VU0VSJ1xufVxuXG4vKipcbiAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRUeXBlIHtcbiAgICBHcmFudGVkID0gJ0NPTlNFTlRfR1JBTlRFRCcsXG4gICAgUmV2b2tlZCA9ICdDT05TRU5UX1JFVk9LRUQnLFxuICAgIFVwZGF0ZWQgPSAnQ09OU0VOVF9VUERBVEVEJ1xufVxuXG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc2VudEV2ZW50c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zZW50RXZlbnRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zZW50RXZlbnRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGNvbnNlbnQgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25zZW50RXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2V2ZW50czogQXJyYXk8Q29uc2VudEV2ZW50Pjtcbn1cbi8qKlxuICogQSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc2VudGVkQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRlZEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU/OiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHkgc3VibWl0dGVkIHZhbGlkIGRpc3B1dGUgc3RhdGVtZW50IGJ5IHRoZSBjb25zdW1lclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lckRpc3B1dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lckRpc3B1dGUge1xuICAgIC8qKlxuICAgICAqIChEZXByZWNhdGVkKSBBIHVuaXF1ZSBpZGVudGlmaWVyIChVVUlEKSBvZiB0aGUgY29uc3VtZXIgZGlzcHV0ZSB0aGF0IGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lckRpc3B1dGVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNvbnN1bWVyX2Rpc3B1dGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBkaXNwdXRlZCBmaWVsZCAoZS5nLiB0cmFuc2FjdGlvbiBkYXRlKSwgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyRGlzcHV0ZVxuICAgICAqL1xuICAgIGRpc3B1dGVfZmllbGRfY3JlYXRlX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJEaXNwdXRlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyRGlzcHV0ZVxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBDb25zdW1lckRpc3B1dGVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBUZXh0IGNvbnRlbnQgb2YgZGlzcHV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyRGlzcHV0ZVxuICAgICAqL1xuICAgIHN0YXRlbWVudDogc3RyaW5nO1xufVxuLyoqXG4gKiBUeXBlIG9mIGRhdGEgYmVpbmcgZGlzcHV0ZWQgYnkgdGhlIGNvbnN1bWVyXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zdW1lckRpc3B1dGVDYXRlZ29yeSB7XG4gICAgVHJhbnNhY3Rpb24gPSAnVFJBTlNBQ1RJT04nLFxuICAgIEJhbGFuY2UgPSAnQkFMQU5DRScsXG4gICAgSWRlbnRpdHkgPSAnSURFTlRJVFknLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jb25zdW1lcl9yZXBvcnQvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIHJlYXNvbiB5b3UgYXJlIGdlbmVyYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgZm9yIHRoaXMgdXNlci4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgLCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgUGxhaWQgQ2hlY2sgKENSQSkgcHJvZHVjdHM7IGludmFsaWQgaWYgbm90IHVzaW5nIFBsYWlkIENoZWNrIChDUkEpIHByb2R1Y3RzLiAgYEFDQ09VTlRfUkVWSUVXX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNvbnN1bWVyIGNyZWRpdCB0cmFuc2FjdGlvbiBmb3IgdGhlIHJldmlldyBvciBjb2xsZWN0aW9uIG9mIGFuIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gIGBBQ0NPVU5UX1JFVklFV19OT05fQ1JFRElUYDogRm9yIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBuZWVkIG9mIHRoZSBpbmZvcm1hdGlvbiB0byByZXZpZXcgYSBub24tY3JlZGl0IGFjY291bnQgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBwZXJzb25hbCwgZmFtaWx5LCBvciBob3VzZWhvbGQgcHVycG9zZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnN1bWVyIGNvbnRpbnVlcyB0byBtZWV0IHRoZSB0ZXJtcyBvZiB0aGUgYWNjb3VudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEYpKDIpLiAgYEVYVEVOU0lPTl9PRl9DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjcmVkaXQgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IGFuZCBpbnZvbHZpbmcgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkdgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgaW4gY29ubmVjdGlvbiB3aXRoIGEgYnVzaW5lc3MgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IHRoZSBjb25zdW1lciBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyBpbiBjb25uZWN0aW9uIHdpdGggYSBwcm9wZXJ0eSByZW50YWwgYXNzZXNzbWVudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEYpKGkpLiAgYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUmA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBtYWRlIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX1BSRVFVQUxJRklDQVRJT05gOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCB0byBldmFsdWF0ZSBhbiBhcHBsaWNhdGlvblxcJ3MgcHJvZmlsZSB0byBtYWtlIGFuIG9mZmVyIHRvIHRoZSBjb25zdW1lci4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSYDogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB3cml0dGVuIGluc3RydWN0aW9ucyBvZiB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgyKSwgc3VjaCBhcyB3aGVuIGFuIGluZGl2aWR1YWwgYWdyZWVzIHRvIGFjdCBhcyBhIGd1YXJhbnRvciBvciBhc3N1bWVzIHBlcnNvbmFsIGxpYWJpbGl0eSBmb3IgYSBjb25zdW1lciwgYnVzaW5lc3MsIG9yIGNvbW1lcmNpYWwgbG9hbi4gIGBFTElHSUJJTElUWV9GT1JfR09WVF9CRU5FRklUU2A6ICBJbiBjb25uZWN0aW9uIHdpdGggYW4gZWxpZ2liaWxpdHkgZGV0ZXJtaW5hdGlvbiBmb3IgYSBnb3Zlcm5tZW50IGJlbmVmaXQgd2hlcmUgdGhlIGVudGl0eSBpcyByZXF1aXJlZCB0byBjb25zaWRlciBhbiBhcHBsaWNhbnRcXCdzIGZpbmFuY2lhbCBzdGF0dXMgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShEKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlIHtcbiAgICBBY2NvdW50UmV2aWV3Q3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX0NSRURJVCcsXG4gICAgQWNjb3VudFJldmlld05vbkNyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19OT05fQ1JFRElUJyxcbiAgICBFeHRlbnNpb25PZkNyZWRpdCA9ICdFWFRFTlNJT05fT0ZfQ1JFRElUJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkVGVuYW50U2NyZWVuaW5nID0gJ0xFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9URU5BTlRfU0NSRUVOSU5HJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkT3RoZXIgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX09USEVSJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25QcmVxdWFsaWZpY2F0aW9uID0gJ1dSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTicsXG4gICAgV3JpdHRlbkluc3RydWN0aW9uT3RoZXIgPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUicsXG4gICAgRWxpZ2liaWxpdHlGb3JHb3Z0QmVuZWZpdHMgPSAnRUxJR0lCSUxJVFlfRk9SX0dPVlRfQkVORUZJVFMnXG59XG5cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYnkgaW50ZWdyYXRpb25zIGNyZWF0ZWQgYmVmb3JlIERlY2VtYmVyIDEwLCAyMDI1LiBBbGwgb3RoZXIgaW50ZWdyYXRpb25zIG11c3QgdXNlIHRoZSBgaWRlbnRpdHlgIG9iamVjdCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIFRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyIHdoZW4gdXNpbmcgYSBgdXNlcl90b2tlbmAsIHRoaXMgZmllbGQgbXVzdCBiZSBwcmVzZW50LiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdXNlciB0b2tlbiBjcmVhdGlvbiwgeW91IGNhbiBhZGQgaXQgdG8gdGhlIHVzZXIgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gT25jZSB0aGUgZmllbGQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHVzZXIsIHlvdSB3aWxsIGJlIGFibGUgdG8gY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGEgbm9uLWVtcHR5IGBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZWAgKHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQpLCBvciBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGZvciB0aGF0IHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmaXJzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgbGFzdF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciwgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9LiBGb3IgZXhhbXBsZTogXFxcIisxNDE1NzQ1MjEzMFxcXCIuIFBob25lIG51bWJlcnMgcHJvdmlkZWQgaW4gb3RoZXIgZm9ybWF0cyB3aWxsIGJlIHBhcnNlZCBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLiBQaG9uZSBudW1iZXIgaW5wdXQgaXMgdmFsaWRhdGVkIGFnYWluc3QgdmFsaWQgbnVtYmVyIHJhbmdlczsgbnVtYmVyIHN0cmluZ3MgdGhhdCBkbyBub3QgbWF0Y2ggYSByZWFsLXdvcmxkIHBob25lIG51bWJlcmluZyBzY2hlbWUgbWF5IGNhdXNlIHRoZSByZXF1ZXN0IHRvIGZhaWwsIGV2ZW4gaW4gdGhlIFNhbmRib3ggdGVzdCBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgU29jaWFsIFNlY3VyaXR5IG51bWJlci4gVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSBwcm92aWRlZCBieSBsZW5kZXJzIGludGVuZGluZyB0byBzaGFyZSB0aGUgcmVzdWx0aW5nIGNvbnN1bWVyIHJlcG9ydCB3aXRoIGEgR292ZXJubWVudC1TcG9uc29yZWQgRW50ZXJwcmlzZSAoR1NFKSwgc3VjaCBhcyBGYW5uaWUgTWFlIG9yIEZyZWRkaWUgTWFjLiAgRm9ybWF0OiBcXFwiZGRkLWRkLWRkZGRcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc25fZnVsbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHVzZXJcXCdzIFNvY2lhbCBTZWN1cml0eSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc25fbGFzdF80Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUbyBiZSBwcm92aWRlZCBpbiB0aGUgZm9ybWF0IFxcXCJ5eXl5LW1tLWRkXFxcIi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgYWxsIFBsYWlkIENoZWNrIGN1c3RvbWVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHByaW1hcnlfYWRkcmVzczogQWRkcmVzc0RhdGE7XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ291bnRlcnBhcnR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgdHlwZTogQ291bnRlcnBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIGEgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRuXFwndCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvblxcJ3Qga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSBpbiBFLjE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJzPzogQ291bnRlcnBhcnR5TnVtYmVycyB8IG51bGw7XG59XG4vKipcbiAqIEluc2lnaHRzIGFyb3VuZCBhIHVzZXJcXCdzIGNvdW50ZXJwYXJ0aWVzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIEluc2lnaHRzIHJlbGF0ZWQgdG8gYSB1c2VyXFwncyB0cmFuc2FjdGlvbnMgd2l0aCBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgZmluYW5jaWFsX2luc3RpdHV0aW9uX2luc2lnaHRzPzogQXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgYWJvdXQgYSB1c2VyXFwncyB0b3AgbWVyY2hhbnRzLCByYW5rZWQgYnkgc3BlbmQuXG4gICAgICogQHR5cGUge0FycmF5PE1lcmNoYW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1lcmNoYW50X2luc2lnaHRzPzogQXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIEFjY291bnQgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSwgd2hlbiBhdmFpbGFibGUuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IG9ubHkgZmlsbGVkIGluIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBpbiBFdXJvcGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHlOdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5TnVtYmVyc0JBQ1N9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzPzogQ291bnRlcnBhcnR5TnVtYmVyc0JBQ1MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlOdW1iZXJzSW50ZXJuYXRpb25hbH1cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBDb3VudGVycGFydHlOdW1iZXJzSW50ZXJuYXRpb25hbCB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciBhIFVLIGJhbmsgYWNjb3VudCB2aWEgQmFjcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ291bnRlcnBhcnR5TnVtYmVyc0JBQ1NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHlOdW1iZXJzQkFDUyB7XG4gICAgLyoqXG4gICAgICogVGhlIEJhY3MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eU51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEJhY3Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFjY291bnQgbnVtYmVycyB1c2luZyB0aGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIGFuZCBCSUMvU1dJRlQgY29kZSBmb3JtYXQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eU51bWJlcnNJbnRlcm5hdGlvbmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5TnVtYmVyc0ludGVybmF0aW9uYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSUJBTk51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW4/OiBOdW1iZXJzSUJBTk51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCdXNpbmVzcyBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoaXMgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eU51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYmljPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSB0eXBlLiAgYG1lcmNoYW50YDogYSBwcm92aWRlciBvZiBnb29kcyBvciBzZXJ2aWNlcyBmb3IgcHVyY2hhc2UgYGZpbmFuY2lhbF9pbnN0aXR1dGlvbmA6IGEgZmluYW5jaWFsIGVudGl0eSAoYmFuaywgY3JlZGl0IHVuaW9uLCBCTlBMLCBmaW50ZWNoKSBgcGF5bWVudF9hcHBgOiBhIHRyYW5zZmVyIG9yIFAyUCBhcHAgKGUuZy4gWmVsbGUpIGBtYXJrZXRwbGFjZWA6IGEgbWFya2V0cGxhY2UgKGUuZy4gRG9vckRhc2gsIEdvb2dsZSBQbGF5IFN0b3JlKSBgcGF5bWVudF90ZXJtaW5hbGA6IGEgcG9pbnQtb2Ytc2FsZSBwYXltZW50IHRlcm1pbmFsIChlLmcuIFNxdWFyZSwgVG9hc3QpIGBpbmNvbWVfc291cmNlYDogdGhlIHBheWVyIGluIGFuIGluY29tZSB0cmFuc2FjdGlvbiAoZS5nLiwgYW4gZW1wbG95ZXIsIGNsaWVudCwgb3IgZ292ZXJubWVudCBhZ2VuY3kpXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb3VudGVycGFydHlUeXBlIHtcbiAgICBNZXJjaGFudCA9ICdtZXJjaGFudCcsXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb24gPSAnZmluYW5jaWFsX2luc3RpdHV0aW9uJyxcbiAgICBQYXltZW50QXBwID0gJ3BheW1lbnRfYXBwJyxcbiAgICBNYXJrZXRwbGFjZSA9ICdtYXJrZXRwbGFjZScsXG4gICAgUGF5bWVudFRlcm1pbmFsID0gJ3BheW1lbnRfdGVybWluYWwnLFxuICAgIEluY29tZVNvdXJjZSA9ICdpbmNvbWVfc291cmNlJ1xufVxuXG4vKipcbiAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb3VudHJ5Q29kZSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIEdiID0gJ0dCJyxcbiAgICBFcyA9ICdFUycsXG4gICAgTmwgPSAnTkwnLFxuICAgIEZyID0gJ0ZSJyxcbiAgICBJZSA9ICdJRScsXG4gICAgQ2EgPSAnQ0EnLFxuICAgIERlID0gJ0RFJyxcbiAgICBJdCA9ICdJVCcsXG4gICAgUGwgPSAnUEwnLFxuICAgIERrID0gJ0RLJyxcbiAgICBObyA9ICdOTycsXG4gICAgU2UgPSAnU0UnLFxuICAgIEVlID0gJ0VFJyxcbiAgICBMdCA9ICdMVCcsXG4gICAgTHYgPSAnTFYnLFxuICAgIFB0ID0gJ1BUJyxcbiAgICBCZSA9ICdCRScsXG4gICAgQXQgPSAnQVQnLFxuICAgIEZpID0gJ0ZJJ1xufVxuXG4vKipcbiAqIE1vZGVsZWQgZXN0aW1hdGUgb2YgdGhlIGFubnVhbCBpbmNvbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUFubnVhbEluY29tZVZhbHVlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUFubnVhbEluY29tZVZhbHVlcyB7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgSW5jb21lIG1vZGVsZWQgZnJvbSB0cmVuZHMgb2Ygb2JzZXJ2ZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUFubnVhbEluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIGdyb3NzX2luY29tZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE5ldCBJbmNvbWUgZXN0aW1hdGVkIGZyb20gb2JzZXJ2ZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUFubnVhbEluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIG5ldF9pbmNvbWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBleHRyYWN0ZWQgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGJvbnVzIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiByZXByZXNlbnRzLCBpZiBpdCBpcyBhIGJvbnVzLiBgQk9OVVNfSU5DTFVERURgOiBCb251cyBpcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uIGFsb25nIHdpdGggdGhlIG5vcm1hbCBwYXkgYEJPTlVTX09OTFlgOiBUaGlzIHRyYW5zYWN0aW9uIGlzIGEgc3RhbmRhbG9uZSBib251c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZUJvbnVzVHlwZSB7XG4gICAgQm9udXNJbmNsdWRlZCA9ICdCT05VU19JTkNMVURFRCcsXG4gICAgQm9udXNPbmx5ID0gJ0JPTlVTX09OTFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogQ3JlZGl0QmFua0luY29tZUVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBFcnJvciBmaWVsZHMgd2lsbCBiZSBgbnVsbGAgaWYgbm8gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gbnVsbCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ/OiBDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDUkFfSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBwZXJpb2QgaW5jbHVkZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgdGhlIGluY29tZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJbmNvbWVQcm92aWRlclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5jb21lIHByb3ZpZGVyIG5hbWUgaXMgbm9ybWFsaXplZCBieSBjb21wYXJpbmcgaXQgYWdhaW5zdCBhIGNhbm9uaWNhbCBzZXQgb2Yga25vd24gcHJvdmlkZXJzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSW5jb21lUHJvdmlkZXJcbiAgICAgKi9cbiAgICBpc19ub3JtYWxpemVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgYmFuayBpbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBWMSAoSUkxKSBmaWVsZC4gRm9yIHRoZSBWMiAoSUkyKSBlcXVpdmFsZW50LCB1c2UgdGhlIGBhY2NvdW50c2AgZmllbGQuIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgYmFuayBpbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2FjY291bnRzOiBBcnJheTxDcmFCYW5rSW5jb21lQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIFYxIChJSTEpIGZpZWxkLiBGb3IgdGhlIFYyIChJSTIpIGVxdWl2YWxlbnQsIHVzZSB0aGUgcmVwb3J0LWxldmVsIGBpbmNvbWVfc3RyZWFtc2AgZmllbGQuIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzOiBBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgd2l0aCB3aGljaCB0aGlzIGluY29tZSBzb3VyY2UgaXMgYXNzb2NpYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLiBJZiB0aGUgcmVwb3J0IGlzIHJlZ2VuZXJhdGVkIGFuZCBhIG5ldyBgcmVwb3J0X2lkYCBpcyBjcmVhdGVkLCB0aGUgbmV3IHJlcG9ydCB3aWxsIGhhdmUgYSBuZXcgc2V0IG9mIGBpbmNvbWVfc291cmNlX2lkYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIG5hbWUgb3Igb3JpZ2luYWwgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGluY29tZSB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3J5PzogQ3JlZGl0QmFua0luY29tZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBpbiB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGZvciB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgZm9yIHRoZSBpbmNvbWUgc291cmNlIHdpdGhpbiB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgZGF0ZSBvZiB0aGUgZW5kIHVzZXJcXCdzIG5leHQgcGF5Y2hlY2sgZm9yIHRoZSBpbmNvbWUgc291cmNlLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHN0YXR1cz86IENyYUJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3Rpb24gaW50ZXJ2YWwocykgZm9yIHRoZSBmb3JlY2FzdGVkIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUuXG4gICAgICogQHR5cGUge0FycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBmb3JlY2FzdGVkX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWVfcHJlZGljdGlvbl9pbnRlcnZhbHM6IEFycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lSW5jb21lUHJvdmlkZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfcHJvdmlkZXI6IENyYUJhbmtJbmNvbWVJbmNvbWVQcm92aWRlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBpbmNvbWUgc291cmNlcy4gYEFDVElWRWA6IFRoZSBpbmNvbWUgc291cmNlIGlzIGFjdGl2ZS4gYElOQUNUSVZFYDogVGhlIGluY29tZSBzb3VyY2UgaXMgaW5hY3RpdmUuIGBVTktOT1dOYDogVGhlIGluY29tZSBzb3VyY2Ugc3RhdHVzIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBJbmFjdGl2ZSA9ICdJTkFDVElWRScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYSBWMSAoSUkxKSBzY2hlbWEuIEZvciB0aGUgVjIgKElJMikgZXF1aXZhbGVudCwgdXNlIGBDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5YC4gU3VtbWFyeSBmb3IgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBncm9zcyBtb250aGx5IGluY29tZSBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBuZXQgYW1vdW50IGFuZCBpbmNvbWUgY2F0ZWdvcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLiBUaGUgYXZlcmFnZSBtb250aGx5IGluY29tZSBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBsaWZldGltZSBvZiB0aGUgaW5jb21lIHN0cmVhbSwgcmF0aGVyIHRoYW4gdGhlIGVudGlyZSBoaXN0b3JpY2FsIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGUgc2NvcGUgb2YgdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9ncm9zc19pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGFtb3VudCBlc3RpbWF0ZWQgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZGF0YSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuIFRoZSBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGxpZmV0aW1lIG9mIHRoZSBpbmNvbWUgc3RyZWFtLCByYXRoZXIgdGhhbiB0aGUgZW50aXJlIGhpc3RvcmljYWwgcGVyaW9kIGluY2x1ZGVkIGluIHRoZSBzY29wZSBvZiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3RlZCBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZm9yZWNhc3RlZF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYW5udWFsIGdyb3NzIGluY29tZSBmb3IgdGhlIGluY29tZSBzb3VyY2UsIGNhbGN1bGF0ZWQgYnkgbXVsdGlwbHlpbmcgdGhlIGBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9ncm9zc19pbmNvbWVgIGJ5IDEyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYW5udWFsX2dyb3NzX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGFubnVhbCBuZXQgaW5jb21lIGZvciB0aGUgaW5jb21lIHNvdXJjZSwgY2FsY3VsYXRlZCBieSBtdWx0aXBseWluZyB0aGUgYGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZWAgYnkgMTIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hbm51YWxfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgYW5udWFsIGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYW5udWFsX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiBUaGlzIGlzIGEgbGVnYWN5IGZpZWxkIHRoYXQgaXMgbm8gbG9uZ2VyIG1haW50YWluZWQuIEZvciBtZXJjaGFudCBuYW1lLCB1c2UgdGhlIGBtZXJjaGFudF9uYW1lYCBmaWVsZDsgZm9yIGRlc2NyaXB0aW9uLCB1c2UgdGhlIGBvcmlnaW5hbF9kZXNjcmlwdGlvbmAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQm9udXNUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBib251c190eXBlPzogQ3JhQmFua0luY29tZUJvbnVzVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmFCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyYUJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYFJFUE9SVF9ERUxFVEVEYDogUmVwb3J0IGRlbGV0ZWQgZHVlIHRvIGN1c3RvbWVyIG9yIGNvbnN1bWVyIHJlcXVlc3QgYERBVEFfVU5BVkFJTEFCTEVgOiBObyByZWxldmFudCBkYXRhIHdhcyBmb3VuZCBmb3IgdGhlIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZSB7XG4gICAgSWRlbnRpdHlVbmF2YWlsYWJsZSA9ICdJREVOVElUWV9VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIENhc2hmbG93IEluc2lnaHRzIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIGNhc2ggZmxvdyBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi4gVGhlIHNwZWNpZmljIGxpc3Qgb2YgYXR0cmlidXRlcyB3aWxsIGRlcGVuZCBvbiB0aGUgY2FzaCBmbG93IGF0dHJpYnV0ZXMgdmVyc2lvbiB1c2VkLiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXR0cmlidXRlcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IG9iamVjdDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2Jhc2VfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW0gSURzIHRvIGluY2x1ZGUgaW4gdGhlIEJhc2UgUmVwb3J0LiBJZiBub3QgcHJvdmlkZWQsIGFsbCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVXNlclRpZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3RpZXI/OiBDcmFVc2VyVGllciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIENSQSByZXBvcnQgdG9rZW4gKGZvcm1hdHRlZCBgY3JhLXJlcG9ydC08ZW52Pi08dXVpZD5gKSBpZGVudGlmeWluZyBhIHNwZWNpZmljIGNvbnN1bWVyIHJlcG9ydC4gV2hlbiBwcm92aWRlZCBhbG9uZ3NpZGUgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCwgcGlucyByZXRyaWV2YWwgdG8gdGhhdCByZXBvcnQgYW5kIHN0YW1wcyBpdHMgcGVybWlzc2libGUgcHVycG9zZS4gSWYgb21pdHRlZCwgdGhlIG1vc3QgcmVjZW50bHkgZ2VuZXJhdGVkIHJlcG9ydCBmb3IgdGhlIHVzZXIgaXMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZT86IENyYUNoZWNrUmVwb3J0UGVybWlzc2libGVQdXJwb3NlO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9iYXNlX3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGFycmF5IGNvbnRhaW5zIGFueSBpbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgb3IgYWxlcnRzIHJlbGF0ZWQgdG8gdGhlIEJhc2UgUmVwb3J0IHRoYXQgZGlkIG5vdCBibG9jayBnZW5lcmF0aW9uIG9mIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwcmVjYXRlZC4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgYWNjZXB0ZWQgZm9yIG5ldyBjbGllbnRzIChjcmVhdGVkIG9uIG9yIGFmdGVyIDIwMjYtMDctMDEpLiBOZXcgY2xpZW50cyBzaG91bGQgc3BlY2lmeSByZXF1aXJlZCBwcm9kdWN0cyB3aGVuIGNyZWF0aW5nIHRoZSBDb25zdW1lciBSZXBvcnQuIEV4aXN0aW5nIGludGVncmF0aW9ucyBtYXkgY29udGludWUgdG8gcGFzcyBgb3B0aW9uc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY2FzaGZsb3dfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jYXNoZmxvd19pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBhIHN1YnNldCBvZiBkYXRhIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PENoZWNrUmVwb3J0V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+O1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBnZW5lcmF0ZSBhIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZUJhc2VSZXBvcnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBgY2xpZW50X3JlcG9ydF9pZGAgZmllbGQgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgcmVxdWVzdCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydEdTRU9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAgICAgKi9cbiAgICBnc2Vfb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0R1NFT3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHJlcG9ydCBtdXN0IGluY2x1ZGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uIElmIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoZSByZXBvcnQgd2lsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZUJhc2VSZXBvcnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWlyZV9pZGVudGl0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydEhvbWVMZW5kaW5nUmVwb3J0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9uc1xuICAgICAqL1xuICAgIGhvbWVfbGVuZGluZ19yZXBvcnRfb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgQ2FzaGZsb3cgSW5zaWdodHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVDYXNoZmxvd0luc2lnaHRzT3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlQ2FzaGZsb3dJbnNpZ2h0c09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXNoZmxvd0F0dHJpYnV0ZXNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZUNhc2hmbG93SW5zaWdodHNPcHRpb25zXG4gICAgICovXG4gICAgYXR0cmlidXRlc192ZXJzaW9uPzogQ2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRW1wbG95bWVudCBSZWZyZXNoIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZUVtcGxveW1lbnRSZWZyZXNoT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBhbiBFbXBsb3ltZW50IFJlZnJlc2ggUmVwb3J0IGlzIHJlcXVlc3RlZC4gTWF4aW11bSBpcyA3MzEuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBnZW5lcmF0ZSBJbmNvbWUgSW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlSW5jb21lSW5zaWdodHNPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVJbmNvbWVJbnNpZ2h0c09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVJbnNpZ2h0c0ZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVJbmNvbWVJbnNpZ2h0c09wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNvbWVfaW5zaWdodHNfZmlsdGVyPzogSW5jb21lSW5zaWdodHNGaWx0ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVJbnNpZ2h0c1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlSW5jb21lSW5zaWdodHNPcHRpb25zXG4gICAgICovXG4gICAgaW5jb21lX2luc2lnaHRzX3ZlcnNpb246IEluY29tZUluc2lnaHRzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIGdlbmVyYXRlIHRoZSBMZW5kU2NvcmVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVMZW5kU2NvcmVPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVMZW5kU2NvcmVPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRMZW5kU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZUxlbmRTY29yZU9wdGlvbnNcbiAgICAgKi9cbiAgICBsZW5kX3Njb3JlX3ZlcnNpb24/OiBQbGFpZExlbmRTY29yZVZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBnZW5lcmF0ZSBOZXR3b3JrIEluc2lnaHRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlTmV0d29ya0luc2lnaHRzT3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlTmV0d29ya0luc2lnaHRzT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtJbnNpZ2h0c1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlTmV0d29ya0luc2lnaHRzT3B0aW9uc1xuICAgICAqL1xuICAgIG5ldHdvcmtfaW5zaWdodHNfdmVyc2lvbj86IE5ldHdvcmtJbnNpZ2h0c1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gdG8gZ2VuZXJhdGUgUGFydG5lciBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVQYXJ0bmVySW5zaWdodHNPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVQYXJ0bmVySW5zaWdodHNPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21WZXJzaW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVQYXJ0bmVySW5zaWdodHNPcHRpb25zXG4gICAgICovXG4gICAgcHJpc21fdmVyc2lvbnM/OiBQcmlzbVZlcnNpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzRmljb0lucHV0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVBhcnRuZXJJbnNpZ2h0c09wdGlvbnNcbiAgICAgKi9cbiAgICBmaWNvPzogQ3JhUGFydG5lckluc2lnaHRzRmljb0lucHV0IHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggd2ViaG9va3Mgd2lsbCBiZSBzZW50IFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgcmVwb3J0LiBEZWZhdWx0IHZhbHVlIGlzIDM2NTsgbWF4aW11bSBpcyA3MzE7IG1pbmltdW0gaXMgMTgwLiBJZiBhIHZhbHVlIGxvd2VyIHRoYW4gMTgwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMTgwIGRheXMgb2YgaGlzdG9yeSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVpcmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYSBsaXN0IG9mIHByb2R1Y3RzIHRvIGdlbmVyYXRlIHdoZW4gY3JlYXRpbmcgdGhlIHJlcG9ydCAoaW4gYWRkaXRpb24gdG8gdGhlIEJhc2UgUmVwb3J0LCB3aGljaCBpcyBhbHdheXMgZ2VuZXJhdGVkKS4gVGhlc2UgcHJvZHVjdHMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBiZWZvcmUgYSBzdWNjZXNzIHdlYmhvb2sgaXMgc2VudC4gTm90ZSB0aGF0IHNwZWNpZnlpbmcgYGNyYV9wYXJ0bmVyX2luc2lnaHRzYCBpbiB0aGlzIGZpZWxkIHdpbGwgdHJpZ2dlciBhIGJpbGxhYmxlIGV2ZW50LiBPdGhlciBwcm9kdWN0cyBhcmUgbm90IGJpbGxlZCB1bnRpbCB0aGUgcmVzcGVjdGl2ZSByZXBvcnRzIGFyZSByZXRyaWV2ZWQgdmlhIHRoZWlyIHByb2R1Y3Qtc3BlY2lmaWMgYC9nZXRgIGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhc2VfcmVwb3J0PzogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q3JlYXRlQ2FzaGZsb3dJbnNpZ2h0c09wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhc2hmbG93X2luc2lnaHRzPzogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVDYXNoZmxvd0luc2lnaHRzT3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q3JlYXRlUGFydG5lckluc2lnaHRzT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFydG5lcl9pbnNpZ2h0cz86IENyYUNoZWNrUmVwb3J0Q3JlYXRlUGFydG5lckluc2lnaHRzT3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q3JlYXRlTGVuZFNjb3JlT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVuZF9zY29yZT86IENyYUNoZWNrUmVwb3J0Q3JlYXRlTGVuZFNjb3JlT3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q3JlYXRlTmV0d29ya0luc2lnaHRzT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29ya19pbnNpZ2h0cz86IENyYUNoZWNrUmVwb3J0Q3JlYXRlTmV0d29ya0luc2lnaHRzT3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgaW52ZXN0bWVudCBkYXRhIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgbGlua2VkIGFjY291bnQocykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW52ZXN0bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVJbmNvbWVJbnNpZ2h0c09wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluY29tZV9pbnNpZ2h0cz86IENyYUNoZWNrUmVwb3J0Q3JlYXRlSW5jb21lSW5zaWdodHNPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlOiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQ2hlY2sgUmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGUuIFRvIGdldCBtb3JlIGRldGFpbHMsIGNhbGwgYC91c2VyL2l0ZW1zL2dldGAgYW5kIGNoZWNrIGZvciBub24tbnVsbCBgZXJyb3JgIG9iamVjdHMgb24gdGhlIGFzc29jaWF0ZWQgSXRlbXMgaW4gdGhlIHJlc3BvbnNlLiBUaGVzZSBgZXJyb3JgIG9iamVjdHMgd2lsbCBjb250YWluIG1vcmUgZGV0YWlscyBvbiB3aHkgdGhlIEl0ZW0gaXMgaW4gYW4gZXJyb3Igc3RhdGUgYW5kIGhvdyB0byByZXNvbHZlIGl0LiBBZnRlciByZXNvbHZpbmcgdGhlIGVycm9ycywgeW91IGNhbiB0cnkgdG8gcmUtZ2VuZXJhdGUgdGhlIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ0hFQ0tfUkVQT1JUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRfRkFJTEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHdoeSB0aGUgQ2hlY2sgUmVwb3J0IGZhaWxlZCBhbmQgaG93IHRvIHJlc29sdmUgaXQuXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIEl0ZW1zIHRoYXQgdGhlIGVuZCB1c2VyIGNhbiByZXBhaXIgdmlhIExpbmsgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBFbXB0eSB3aGVuIG5vIEl0ZW0gaXMgdXNlci1yZXBhaXJhYmxlLiBBZnRlciByZXBhaXJpbmcgdGhlc2UgSXRlbXMsIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgdG8gcmVnZW5lcmF0ZSB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFJlcGFpcmFibGVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgcmVwYWlyYWJsZV9pdGVtcz86IEFycmF5PENoZWNrUmVwb3J0UmVwYWlyYWJsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBmYWlsZWQgdG8gZ2VuZXJhdGUgZm9yIHRoZSByZXBvcnQuIFBvcHVsYXRlZCB3aGVuIGdlbmVyYXRpb24gd2FzIGF0dGVtcHRlZCBhbmQgYWxsIHJlcXVlc3RlZCBwcm9kdWN0cyBmYWlsZWQuIEFkZGl0aW9uYWwgZGV0YWlsIG9uIHdoYXQgY2F1c2VkIHRoZSBmYWlsdXJlIGNhbiBiZSBmb3VuZCBieSBjYWxsaW5nIHRoZSBwcm9kdWN0IC9nZXQgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgZmFpbGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgaXRlbV9pZHNgIGluY2x1ZGVkIGluIHRoZSBDaGVjayBSZXBvcnQuIEFjY2VzcyB0byB0aGlzIGZpZWxkIGlzIGluIGNsb3NlZCBiZXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBDcmFDaGVja1JlcG9ydEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChWT0EpIHNjaGVtYSB2ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgU2NoZW1hVmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgQmFzZSBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBzY2hlbWEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgTE9BTlM6IENyZWRpdEZyZWRkaWVNYWNMb2FucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1BhcnRpZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFBBUlRJRVM6IENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFNFUlZJQ0VTOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXM7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBjcmVhdGluZyByZXBvcnRzIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIEdTRXMgZm9yIG1vcnRnYWdlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRHU0VPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRHU0VPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hpY2ggdHlwZXMgb2YgcmVwb3J0cyBzaG91bGQgYmUgbWFkZSBhdmFpbGFibGUgdG8gR1NFcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8R1NFUmVwb3J0VHlwZT59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0R1NFT3B0aW9uc1xuICAgICAqL1xuICAgIHJlcG9ydF90eXBlczogQXJyYXk8R1NFUmVwb3J0VHlwZT47XG59XG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIEhvbWUgTGVuZGluZyBSZXBvcnQgKFZlcmlmaWNhdGlvbiBSZXBvcnQpIGdlbmVyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRIb21lTGVuZGluZ1JlcG9ydE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCB0eXBlcyBvZiBob21lIGxlbmRpbmcgcmVwb3J0cyB0byBnZW5lcmF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXBvcnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRIb21lTGVuZGluZ1JlcG9ydE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXBvcnRzX3JlcXVlc3RlZDogQXJyYXk8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXBvcnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zXG4gICAgICovXG4gICAgZW1wbG95bWVudF9yZWZyZXNoX29wdGlvbnM/OiBDcmFDaGVja1JlcG9ydENyZWF0ZUVtcGxveW1lbnRSZWZyZXNoT3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQuIFRoaXMgZmllbGQgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkIGZvciBuZXcgY2xpZW50cyAoY3JlYXRlZCBvbiBvciBhZnRlciAyMDI2LTA3LTAxKS4gTmV3IGNsaWVudHMgc2hvdWxkIHNwZWNpZnkgcmVxdWlyZWQgcHJvZHVjdHMgd2hlbiBjcmVhdGluZyB0aGUgQ29uc3VtZXIgUmVwb3J0LiBFeGlzdGluZyBpbnRlZ3JhdGlvbnMgbWF5IGNvbnRpbnVlIHRvIHBhc3MgYG9wdGlvbnNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lSW5zaWdodHNGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRPcHRpb25zXG4gICAgICovXG4gICAgaW5jb21lX2luc2lnaHRzX2ZpbHRlcj86IEluY29tZUluc2lnaHRzRmlsdGVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lSW5zaWdodHNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY29tZV9pbnNpZ2h0c192ZXJzaW9uOiBJbmNvbWVJbnNpZ2h0c1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldE9wdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBDUkEgcmVwb3J0IHRva2VuIChmb3JtYXR0ZWQgYGNyYS1yZXBvcnQtPGVudj4tPHV1aWQ+YCkgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyBjb25zdW1lciByZXBvcnQuIFdoZW4gcHJvdmlkZWQgYWxvbmdzaWRlIGBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZWAsIHBpbnMgcmV0cmlldmFsIHRvIHRoYXQgcmVwb3J0IGFuZCBzdGFtcHMgaXRzIHBlcm1pc3NpYmxlIHB1cnBvc2UuIElmIG9taXR0ZWQsIHRoZSBtb3N0IHJlY2VudGx5IGdlbmVyYXRlZCByZXBvcnQgZm9yIHRoZSB1c2VyIGlzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZT86IENyYUNoZWNrUmVwb3J0UGVybWlzc2libGVQdXJwb3NlO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvaW5jb21lX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUluY29tZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ/OiBDcmFJbmNvbWVJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBJbmNvbWUgSW5zaWdodHMgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgYSBzdWJzZXQgb2YgZGF0YSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENoZWNrUmVwb3J0V2FybmluZz47XG59XG4vKipcbiAqIERlcHJlY2F0ZWQuIFRoaXMgZmllbGQgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkIGZvciBuZXcgY2xpZW50cyAoY3JlYXRlZCBvbiBvciBhZnRlciAyMDI2LTA3LTAxKS4gTmV3IGNsaWVudHMgc2hvdWxkIHNwZWNpZnkgcmVxdWlyZWQgcHJvZHVjdHMgd2hlbiBjcmVhdGluZyB0aGUgQ29uc3VtZXIgUmVwb3J0LiBFeGlzdGluZyBpbnRlZ3JhdGlvbnMgbWF5IGNvbnRpbnVlIHRvIHBhc3MgYG9wdGlvbnNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZExlbmRTY29yZVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGxlbmRfc2NvcmVfdmVyc2lvbj86IFBsYWlkTGVuZFNjb3JlVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2xlbmRfc2NvcmUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbGVuZF9zY29yZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxlbmRTY29yZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQ3JhTGVuZFNjb3JlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBMZW5kU2NvcmUgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgYSBzdWJzZXQgb2YgZGF0YSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+O1xufVxuLyoqXG4gKiBEZXByZWNhdGVkLiBUaGlzIGZpZWxkIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBmb3IgbmV3IGNsaWVudHMgKGNyZWF0ZWQgb24gb3IgYWZ0ZXIgMjAyNi0wNy0wMSkuIE5ldyBjbGllbnRzIHNob3VsZCBzcGVjaWZ5IHJlcXVpcmVkIHByb2R1Y3RzIHdoZW4gY3JlYXRpbmcgdGhlIENvbnN1bWVyIFJlcG9ydC4gRXhpc3RpbmcgaW50ZWdyYXRpb25zIG1heSBjb250aW51ZSB0byBwYXNzIGBvcHRpb25zYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya0luc2lnaHRzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zXG4gICAgICovXG4gICAgbmV0d29ya19pbnNpZ2h0c192ZXJzaW9uPzogTmV0d29ya0luc2lnaHRzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L25ldHdvcmtfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBOZXR3b3JrIEluc2lnaHRzIGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGEgc3Vic2V0IG9mIGRhdGEgY291bGQgbm90IGJlIHJldHJpZXZlZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPjtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIGluY2x1ZGUgb3RoZXIgcmVwb3J0cyBpbiB0aGUgUERGLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQREZBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8Q3JhUERGQWRkT25zPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQsIHNwZWNpZnkgYHBhcnRuZXJfaW5zaWdodHMucHJpc21fdmVyc2lvbnNgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnNEZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWQgfCBudWxsO1xufVxuLyoqXG4gKiBEZXByZWNhdGVkLiBUaGlzIGZpZWxkIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBmb3IgbmV3IGNsaWVudHMgKGNyZWF0ZWQgb24gb3IgYWZ0ZXIgMjAyNi0wNy0wMSkuIE5ldyBjbGllbnRzIHNob3VsZCBzcGVjaWZ5IHJlcXVpcmVkIHByb2R1Y3RzIHdoZW4gY3JlYXRpbmcgdGhlIENvbnN1bWVyIFJlcG9ydC4gRXhpc3RpbmcgaW50ZWdyYXRpb25zIG1heSBjb250aW51ZSB0byBwYXNzIGBwYXJ0bmVyX2luc2lnaHRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRQYXJ0bmVySW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFBhcnRuZXJJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc21fdmVyc2lvbnM/OiBQcmlzbVZlcnNpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzRmljb0lucHV0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGZpY28/OiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvSW5wdXQgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVXNlclRpZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdGllcj86IENyYVVzZXJUaWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRQYXJ0bmVySW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGFydG5lcl9pbnNpZ2h0cz86IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvcGFydG5lcl9pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydD86IENyYVBhcnRuZXJJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgUGFydG5lciBJbnNpZ2h0cyBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBhIHN1YnNldCBvZiBkYXRhIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PENoZWNrUmVwb3J0V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENoZWNrUmVwb3J0V2FybmluZz47XG59XG4vKipcbiAqIFRoZSBwZXJtaXNzaWJsZSBwdXJwb3NlIHVuZGVyIHRoZSBGQ1JBIGZvciByZXRyaWV2aW5nIHRoaXMgY29uc3VtZXIgcmVwb3J0LiBSZXN0cmljdGVkIHRvIHBlcm1pc3NpYmxlIHB1cnBvc2VzIHJlbGF0ZWQgdG8gbG9hbiBzZXJ2aWNpbmcgb25seS4gUmVxdWlyZWQgd2hlbiBgcmVwb3J0X2lkYCBpcyBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUNoZWNrUmVwb3J0UGVybWlzc2libGVQdXJwb3NlIHtcbiAgICBBY2NvdW50UmV2aWV3Q3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX0NSRURJVCcsXG4gICAgV3JpdHRlbkluc3RydWN0aW9uT3RoZXIgPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBDaGVjayBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIHRoZSByZXBvcnQgd2lsbCBiZSBhdmFpbGFibGUgdG8gcmV0cmlldmUgZm9yIDI0IGhvdXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ0hFQ0tfUkVQT1JUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIHN1Y2Nlc3NmdWxseSBiZWVuIGdlbmVyYXRlZCBmb3IgdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHN1Y2Nlc3NmdWxfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGZhaWxlZCB0byBnZW5lcmF0ZSBmb3IgdGhlIHJlcG9ydC4gQWRkaXRpb25hbCBkZXRhaWwgb24gd2hhdCBjYXVzZWQgdGhlIGZhaWx1cmUgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcgdGhlIHByb2R1Y3QgL2dldCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGZhaWxlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBpdGVtX2lkc2AgaW5jbHVkZWQgaW4gdGhlIENoZWNrIFJlcG9ydC4gQWNjZXNzIHRvIHRoaXMgZmllbGQgaXMgaW4gY2xvc2VkIGJldGEuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQuIFRoaXMgZmllbGQgaXMgbm8gbG9uZ2VyIGFjY2VwdGVkIGZvciBuZXcgY2xpZW50cyAoY3JlYXRlZCBvbiBvciBhZnRlciAyMDI2LTA3LTAxKS4gTmV3IGNsaWVudHMgc2hvdWxkIHNwZWNpZnkgcmVxdWlyZWQgcHJvZHVjdHMgd2hlbiBjcmVhdGluZyB0aGUgQ29uc3VtZXIgUmVwb3J0LiBFeGlzdGluZyBpbnRlZ3JhdGlvbnMgbWF5IGNvbnRpbnVlIHRvIHBhc3MgYGVtcGxveW1lbnRfcmVmcmVzaF9vcHRpb25zYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldEVtcGxveW1lbnRSZWZyZXNoT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBhbiBFbXBsb3ltZW50IFJlZnJlc2ggUmVwb3J0IGlzIHJlcXVlc3RlZC4gTWF4aW11bSBpcyA3MzEuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBUeXBlIG9mIGhvbWUgbGVuZGluZyByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcG9ydFR5cGUge1xuICAgIFZvYSA9ICdWT0EnLFxuICAgIEVtcGxveW1lbnRSZWZyZXNoID0gJ0VNUExPWU1FTlRfUkVGUkVTSCcsXG4gICAgSW5jb21lID0gJ0lOQ09NRSdcbn1cblxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIHR5cGVzIG9mIGhvbWUgbGVuZGluZyByZXBvcnRzIGFyZSBleHBlY3RlZCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXBvcnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0c19yZXF1ZXN0ZWQ6IEFycmF5PENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVwb3J0VHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0RW1wbG95bWVudFJlZnJlc2hPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfcmVmcmVzaF9vcHRpb25zPzogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRFbXBsb3ltZW50UmVmcmVzaE9wdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25SZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IENyYVZlcmlmaWNhdGlvblJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgaG9tZSBsZW5kaW5nIHJlcG9ydCBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBhIHN1YnNldCBvZiBkYXRhIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nLlxuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PENoZWNrUmVwb3J0V2FybmluZz47XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByZXBvcnRfcmVxdWVzdGVkPzogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZSZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCB0eXBlcyBvZiB2ZXJpZmljYXRpb24gcmVwb3J0cyB0byBpbmNsdWRlIGluIHRoZSByZXR1cm5lZCBQREYuIFN1cHBvcnRlZCBjb21iaW5hdGlvbnMgYXJlOiBgW3ZvYV1gLCBgW2VtcGxveW1lbnRfcmVmcmVzaF1gLCBgW2luY29tZV1gLCBvciBgW3ZvYSwgaW5jb21lXWAuIE90aGVyIGNvbWJpbmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4gXG4gICAgICogQHR5cGUge1NldDxDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZlJlcG9ydFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRzX3JlcXVlc3RlZD86IFNldDxDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZlJlcG9ydFR5cGU+O1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhlIEdTRSBpZGVudGlmaWVycyAodGhlIFJlcG9ydCBJRCBhbmQgYGdzZV9yZWZlcmVuY2VfaWRgKSBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXR1cm5lZCBIb21lIExlbmRpbmcgUmVwb3J0IFBERi4gRGVmYXVsdHMgdG8gYGZhbHNlYC4gVGhlc2UgaWRlbnRpZmllcnMgYXJlIGFsd2F5cyBwcmVzZW50IGluIHRoZSBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL2dldGAgSlNPTiByZXNwb25zZSByZWdhcmRsZXNzIG9mIHRoaXMgZmllbGQuIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBoaWRlX2dzZV9kZXRhaWxzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIHZlcmlmaWNhdGlvbiBQREYgcmVwb3J0IHRvIGZldGNoLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZSZXBvcnRUeXBlIHtcbiAgICBWb2EgPSAndm9hJyxcbiAgICBFbXBsb3ltZW50UmVmcmVzaCA9ICdlbXBsb3ltZW50X3JlZnJlc2gnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnXG59XG5cbi8qKlxuICogVGhlIGlucXVpcnkgdHlwZSBvZiBjcmVkaXQgcHJvZmlsZSByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFDcmVkaXRQcm9maWxlSW5xdWlyeVR5cGUge1xuICAgIFNvZnRJbnF1aXJ5ID0gJ1NPRlRfSU5RVUlSWScsXG4gICAgU3RhbmRhcmRJbnF1aXJ5ID0gJ1NUQU5EQVJEX0lOUVVJUlknXG59XG5cbi8qKlxuICogQW4gaW5kaXZpZHVhbCBMZW5kU2NvcmUgcmVzdWx0IHdpdGhpbiBhIGNyZWRpdCBwcm9maWxlIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ3JlZGl0UHJvZmlsZUxlbmRTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVMZW5kU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSB0aGUgTGVuZFNjb3JlIG1vZGVsLiBXaWxsIGJlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDEgdG8gOTkuIEhpZ2hlciBzY29yZXMgaW5kaWNhdGUgbG93ZXIgY3JlZGl0IHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZUxlbmRTY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgTGVuZFNjb3JlLiBGb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgcmVhc29uIGNvZGVzIGFuZCBhIG1hcHBpbmcgb2YgcmVhc29uIGNvZGVzIHRvIGh1bWFuLXJlYWRhYmxlIHJlYXNvbnMsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuIERpZmZlcmVudCBMZW5kU2NvcmUgdmVyc2lvbnMgd2lsbCB1c2UgZGlmZmVyZW50IHNldHMgb2YgcmVhc29uIGNvZGVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlTGVuZFNjb3JlXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB2YXJpYW50IGlkZW50aWZpZXIgZm9yIHRoaXMgTGVuZFNjb3JlIHJlc3VsdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlTGVuZFNjb3JlXG4gICAgICovXG4gICAgdmFyaWFudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgTGVuZFNjb3JlIGNvdWxkIG5vdCBiZSBjb21wdXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlTGVuZFNjb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIENyZWRpdCBQcm9maWxlIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIHJlcG9ydCB3YXMgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX3JldHJpZXZlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDcmVkaXRQcm9maWxlSW5xdWlyeVR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRcbiAgICAgKi9cbiAgICBpbnF1aXJ5X3R5cGU6IENyYUNyZWRpdFByb2ZpbGVJbnF1aXJ5VHlwZTtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGVuZFNjb3JlIHJlc3VsdHMgZm9yIHRoZSBjcmVkaXQgcHJvZmlsZSByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyYUNyZWRpdFByb2ZpbGVMZW5kU2NvcmU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0XG4gICAgICovXG4gICAgbGVuZF9zY29yZXM6IEFycmF5PENyYUNyZWRpdFByb2ZpbGVMZW5kU2NvcmU+O1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIGNhc2ggZmxvdyBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi4gVGhlIHNwZWNpZmljIGxpc3Qgb2YgYXR0cmlidXRlcyB3aWxsIGRlcGVuZCBvbiB0aGUgY2FzaCBmbG93IGF0dHJpYnV0ZXMgdmVyc2lvbiB1c2VkLiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXR0cmlidXRlcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRcbiAgICAgKi9cbiAgICBjYXNoZmxvd19pbnNpZ2h0c19hdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgbmV0d29yayBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi4gRm9yIGEgZnVsbCBsaXN0IG9mIGF0dHJpYnV0ZXMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0XG4gICAgICovXG4gICAgbmV0d29ya19pbnNpZ2h0c19hdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY3JlZGl0X3Byb2ZpbGUvcmVwb3J0L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZTogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDcmVkaXRQcm9maWxlUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNyZWRpdFByb2ZpbGVJbnF1aXJ5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnF1aXJ5X3R5cGU6IENyYUNyZWRpdFByb2ZpbGVJbnF1aXJ5VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdmVyc2lvbjogQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFZlcnNpb247XG59XG4vKipcbiAqIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2NyZWRpdF9wcm9maWxlL3JlcG9ydC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFDcmVkaXRQcm9maWxlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IENyYUNyZWRpdFByb2ZpbGVSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSByZXBvcnQgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgYSBzdWJzZXQgb2YgZGF0YSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8Q2hlY2tSZXBvcnRXYXJuaW5nPjtcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIENSQSBDcmVkaXQgUHJvZmlsZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBpdGVtcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGl0ZW1fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHByaW1hcnkgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcmltYXJ5X2FjY291bnRfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlcG9zaXRvcnkgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRfdHlwZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY3JlZGl0IGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydE1ldGFkYXRhXG4gICAgICovXG4gICAgY3JlZGl0X2FjY291bnRfdHlwZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb3RoZXIgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBvdGhlcl9hY2NvdW50X3R5cGVfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGFjY291bnRzIHdpdGggbXVsdGlwbGUgb3duZXJzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydE1ldGFkYXRhXG4gICAgICovXG4gICAgbXVsdGlwbGVfb3duZXJfYWNjb3VudF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNyZWRpdFByb2ZpbGVSZXBvcnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RyYW5zYWN0aW9uX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHByb2R1Y3QgdHlwZSBmb3IgdGhlIGNyZWRpdCBwcm9maWxlIHJlcG9ydCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFR5cGUge1xuICAgIFF1YWxpZnkgPSAnUVVBTElGWSdcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IHRvIHJldHJpZXZlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydFZlcnNpb24ge1xuICAgIFYxID0gJ3YxJ1xufVxuXG4vKipcbiAqIE1vZGVsZWQgZXN0aW1hdGUgb2YgY3VycmVudCBpbmNvbWUgYmFzZWQgb24gcmVjZW50bHkgb2JzZXJ2ZWQgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ3VycmVudE1vZGVsZWRJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDdXJyZW50TW9kZWxlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYU1vbnRobHlJbmNvbWVWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUN1cnJlbnRNb2RlbGVkSW5jb21lXG4gICAgICovXG4gICAgbW9udGhseTogQ3JhTW9udGhseUluY29tZVZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQW5udWFsSW5jb21lVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDdXJyZW50TW9kZWxlZEluY29tZVxuICAgICAqL1xuICAgIGFubnVhbDogQ3JhQW5udWFsSW5jb21lVmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQgd2FzIGNyZWF0ZWQsIGluIElTTyA4NjAxIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCB0aGUgRW1wbG95bWVudCBSZWZyZXNoIFJlcG9ydCBjb3ZlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0SXRlbT47XG59XG4vKipcbiAqIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBmb3IgdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuIE5vdGUgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGRpZmZlcnMgZnJvbSBhIEJhc2UgUmVwb3J0IHRyYW5zYWN0aW9uIGluIHRoYXQgaXQgd2lsbCBvbmx5IGJlIGRlcG9zaXRzLCBhbmQgdGhlIGFtb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBJdGVtIHdpdGhpbiBhbiBFbXBsb3ltZW50IFJlZnJlc2ggUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgZWFjaCBvZiB0aGUgYWNjb3VudHMgb3BlbiBvbiB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0QWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZV90aW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIEVtcGxveW1lbnQgUmVmcmVzaCBSZXBvcnQuIE5vdGUgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGRpZmZlcnMgZnJvbSBhIEJhc2UgUmVwb3J0IHRyYW5zYWN0aW9uIGluIHRoYXQgaXQgd2lsbCBvbmx5IGJlIGRlcG9zaXRzLCBhbmQgdGhlIGFtb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFFbXBsb3ltZW50UmVmcmVzaFJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkgZm9yIGEgZ2l2ZW4gc3RyZWFtLiBUaGUgc3RyZWFtcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGVzZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgaW5jb21lIGNhdGVnb3JpZXMuICBTZWUgdGhlIFtJbmNvbWUgVjIgQ2F0ZWdvcnkgVGF4b25vbXldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9pbmNvbWUtdjItY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgaW5jb21lIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lQ2F0ZWdvcnkge1xuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgc3RyZWFtXFwncyBpbnRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIENoZWNrIEluY29tZSBJbnNpZ2h0cyBSZXBvcnQgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFJbmNvbWVJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUluY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIENoZWNrIEluY29tZSBJbnNpZ2h0cyBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgQ2hlY2sgSW5jb21lIEluc2lnaHRzIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHVzZXJfc3VtbWFyeT86IENyYUluY29tZUluc2lnaHRzVXNlclN1bW1hcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGluY29tZSBzdHJlYW1zIGZvciB0aGlzIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyYUluY29tZVN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX3N0cmVhbXM6IEFycmF5PENyYUluY29tZVN0cmVhbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmFCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIG9iamVjdCB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogQWdncmVnYXRlZCBzdW1tYXJ5IG9mIGFsbCBpbmNvbWUgc3RyZWFtcyBmb3IgdGhpcyB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lSW5zaWdodHNVc2VyU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhIHVzZXJcXCdzIGFnZ3JlZ2F0ZWQgaW5jb21lIG1ldHJpY3MgZm9yIGVhY2ggY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyYUluY29tZU1ldHJpY3M+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1VzZXJTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX21ldHJpY3M6IEFycmF5PENyYUluY29tZU1ldHJpY3M+O1xufVxuLyoqXG4gKiBNb2RlbGVkIGluY29tZSBtZXRyaWNzIGZvciBhIGdpdmVuIGluY29tZSBzdHJlYW0gb3IgdXNlciBzdW1tYXJ5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFJbmNvbWVNZXRyaWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lTWV0cmljcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUN1cnJlbnRNb2RlbGVkSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVNZXRyaWNzXG4gICAgICovXG4gICAgY3VycmVudDogQ3JhQ3VycmVudE1vZGVsZWRJbmNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQcm9qZWN0ZWRNb2RlbGVkSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVNZXRyaWNzXG4gICAgICovXG4gICAgcHJvamVjdGVkOiBDcmFQcm9qZWN0ZWRNb2RlbGVkSW5jb21lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lTWV0cmljc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZU1ldHJpY3NcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE1ldGFkYXRhIG9mIHRoZSBpbmNvbWUgc3RyZWFtXFwncyBuZXh0IHBheW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZU5leHRQYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhSW5jb21lTmV4dFBheW1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCBkYXRlIG9mIHRoZSBpbmNvbWUgc3RyZWFtXFwncyBuZXh0IHBheW1lbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVOZXh0UGF5bWVudFxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gaW5jb21lIHN0cmVhbSBkZXRlY3RlZCBmb3IgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZVN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUluY29tZVN0cmVhbSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHN0cmVhbS4gSWYgdGhlIHJlcG9ydCBpcyByZWdlbmVyYXRlZCBhbmQgYSBuZXcgYHJlcG9ydF9pZGAgaXMgY3JlYXRlZCwgdGhlIG5ldyByZXBvcnQgd2lsbCBoYXZlIGEgbmV3IHNldCBvZiBgaW5jb21lX3N0cmVhbV9pZGBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIGluY29tZV9zdHJlYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzdHJlYW0gZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc3RyZWFtIGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgaW5zaWdodHM6IENyYUluY29tZVN0cmVhbUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVNZXRyaWNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBpbmNvbWVfbWV0cmljczogQ3JhSW5jb21lTWV0cmljcztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBpbmNvbWUgc3RyZWFtIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUluY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDcmFJbmNvbWVUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIE1vZGVsZWQgaW5zaWdodHMgZm9yIGEgZ2l2ZW4gaW5jb21lIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhSW5jb21lU3RyZWFtSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUluY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeTogQ3JhSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVN0cmVhbUluc2lnaHRzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9wcm92aWRlcjogQ3JhQmFua0luY29tZUluY29tZVByb3ZpZGVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lU3RyZWFtSW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyYUJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUluY29tZU5leHRQYXltZW50fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5leHRfcGF5bWVudDogQ3JhSW5jb21lTmV4dFBheW1lbnQgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYW4gaW5jb21lIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVUcmFuc2FjdGlvbk91dGxpZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3V0bGllcjogQ3JhSW5jb21lVHJhbnNhY3Rpb25PdXRsaWVyO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBvbiB3aGV0aGVyIHRoaXMgaW5jb21lIHRyYW5zYWN0aW9uIGlzIGFuIG91dGxpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUluY29tZVRyYW5zYWN0aW9uT3V0bGllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUluY29tZVRyYW5zYWN0aW9uT3V0bGllciB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gaW5jb21lIHRyYW5zYWN0aW9uIGFtb3VudCBpcyB1bnVzdWFsbHkgaGlnaCBjb21wYXJlZCB0byB0aGUgYW1vdW50cyBmb3IgdGhhdCBzdHJlYW0uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZVRyYW5zYWN0aW9uT3V0bGllclxuICAgICAqL1xuICAgIGlzX291dGxpZXI6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB0cmFuc2FjdGlvbiBkaWZmZXJzIGZyb20gdGhlIHN0cmVhbSBhdmVyYWdlIHRyYW5zYWN0aW9uIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVUcmFuc2FjdGlvbk91dGxpZXJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIExlbmRTY29yZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxlbmRTY29yZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxlbmRTY29yZVJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMZW5kU2NvcmVSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMZW5kU2NvcmVSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMZW5kU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYUxlbmRTY29yZVJlcG9ydFxuICAgICAqL1xuICAgIGxlbmRfc2NvcmU/OiBMZW5kU2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4gYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBhcHBsaWNhdGlvbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHR5cGU6IENyYUxvYW5UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuQXBwbGljYXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb246IENyYUxvYW5BcHBsaWNhdGlvbkRlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB1c2VyIGFwcGxpZWQgZm9yIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIGxvYW4gYXBwbGljYXRpb25cXCdzIGRlY2lzaW9uIHdhcyBtYWRlLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbl9kYXRlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGVjaXNpb24gb2YgdGhlIGxvYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuQXBwbGljYXRpb25EZWNpc2lvbiB7XG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIERlY2xpbmVkID0gJ0RFQ0xJTkVEJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgc3RhdHVzIGFuZCBkYXRlIGluZm9ybWF0aW9uIG9mIHRoZSBsb2FuIHdoZW4gdW5yZWdpc3RlcmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbkNsb3NlZFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5DbG9zZWRTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQ2xvc2VkU3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkNsb3NlZFN0YXR1c1xuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXR1cyBhbmQgZGF0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgbG9hbiB3aGVuIHJlZ2lzdGVyaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuT3BlbmVkU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hbk9wZW5lZFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5PcGVuZWRTdGF0dXNcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyYUxvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGVmZmVjdGl2ZSBkYXRlIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuT3BlbmVkU3RhdHVzXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyB0aGUgcGF5bWVudCBpbmZvcm1hdGlvbiBmb3IgYSBsb2FuIHBheW1lbnQgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuUGF5bWVudEhpc3Rvcnkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCB0byBpZGVudGlmeSB0aGUgbG9hblxcJ3MgcGF5bWVudCBwZXJpb2QsIHN0YXJ0aW5nIGZyb20gMS4gRm9yIGV4YW1wbGU6ICAgMSBtZWFucyB0aGUgcGVyaW9kIGJldHdlZW4gdGhlIGxvYW5cXCdzIG9wZW5pbmcgZGF0ZSBhbmQgdGhlIDFzdCBwYXltZW50IGR1ZSBkYXRlLiAgIDIgbWVhbnMgdGhlIHBlcmlvZCBiZXR3ZWVuIHRoZSBsb2FuXFwncyAxc3QgcGF5bWVudCBkdWUgZGF0ZSBhbmQgMm5kIHBheW1lbnQgZHVlIGRhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gICAgICovXG4gICAgcGVyaW9kOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgZHVlIGRhdGUgb3IgZW5kIGRhdGUgb2YgdGhlIHBheW1lbnQgcGVyaW9kLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBkdWVfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB0aGUgbG9hbiB3YXMgZGVsaW5xdWVudCBhdCB0aGUgZW5kIG9mIHRoZSBwYXkgcGVyaW9kLiBJZiBzcGVjaWZpZWQsIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBkYXlzX3Bhc3RfZHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBwYXN0IGR1ZSBvciB0aGUgY2hhcmdlLW9mZiBhbW91bnQgb2YgdGhlIGxvYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGF5bWVudCBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gICAgICovXG4gICAgYW1vdW50X3Bhc3RfZHVlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYWxhbmNlIHJlbWFpbmluZyBvbiB0aGUgbG9hbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXltZW50IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBiYWxhbmNlX3JlbWFpbmluZz86IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiBhIGxvYW5cXCdzIHBheW1lbnQgc2NoZWR1bGUuIGBCSVdFRUtMWWAgcmVwcmVzZW50cyBvbmUgcGF5bWVudCBldmVyeSB0d28gd2Vla3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuUGF5bWVudFNjaGVkdWxlIHtcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgUXVhcnRlcmx5ID0gJ1FVQVJURVJMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGxvYW4gZGF0YSB0byByZWdpc3Rlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBmb3IgdGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2FuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9hbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGxvYW5faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIHR5cGU6IENyYUxvYW5UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuUGF5bWVudFNjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3NjaGVkdWxlOiBDcmFMb2FuUGF5bWVudFNjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSBsb2FuIGFjY291bnQgd2FzIG9wZW5lZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbk9wZW5lZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX3dpdGhfc3RhdHVzOiBDcmFMb2FuT3BlbmVkU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgdGhlIGFwcHJvdmVkIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgbG9hbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbj86IENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEgdG8gcmVnaXN0ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgYXBwbGljYXRpb25faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhlIHVzZXIgYXBwbGllZCBmb3IgdGhlIGxvYW4uIFRoZSBkYXRlIHNob3VsZCBiZSBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fZGF0ZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUxvYW5TdGF0dXMge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCcsXG4gICAgQm9va2VkID0gJ0JPT0tFRCcsXG4gICAgQ3VycmVudCA9ICdDVVJSRU5UJyxcbiAgICBEZWxpbnF1ZW50ID0gJ0RFTElOUVVFTlQnLFxuICAgIERlZmF1bHQgPSAnREVGQVVMVCcsXG4gICAgQ2hhcmdlZE9mZiA9ICdDSEFSR0VEX09GRicsXG4gICAgVHJhbnNmZXJyZWQgPSAnVFJBTlNGRVJSRUQnLFxuICAgIFBhaWRPZmYgPSAnUEFJRF9PRkYnLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0dXMgYW5kIGRhdGUgb2YgYW4gdXBkYXRlIHRvIHRoZSBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5TdGF0dXNIaXN0b3J5VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyYUxvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGVmZmVjdGl2ZSBkYXRlIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgbG9hbiB0aGUgdXNlciBhcHBsaWVkIGZvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUxvYW5UeXBlIHtcbiAgICBQZXJzb25hbCA9ICdQRVJTT05BTCcsXG4gICAgQ3JlZGl0Q2FyZCA9ICdDUkVESVRfQ0FSRCcsXG4gICAgQnVzaW5lc3MgPSAnQlVTSU5FU1MnLFxuICAgIE1vcnRnYWdlID0gJ01PUlRHQUdFJyxcbiAgICBBdXRvID0gJ0FVVE8nLFxuICAgIFBheWRheSA9ICdQQVlEQVknLFxuICAgIFN0dWRlbnQgPSAnU1RVREVOVCcsXG4gICAgSG9tZUVxdWl0eSA9ICdIT01FX0VRVUlUWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgbG9hbiBkYXRhIGZvciB0aGUgbG9hbiBiZWluZyB1bnJlZ2lzdGVyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblVucmVnaXN0ZXIge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgbG9hbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBsb2FuX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5DbG9zZWRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5VbnJlZ2lzdGVyXG4gICAgICovXG4gICAgY2xvc2VkX3dpdGhfc3RhdHVzOiBDcmFMb2FuQ2xvc2VkU3RhdHVzO1xufVxuLyoqXG4gKiBDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVucmVnaXN0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgbG9hbiBkYXRhIHRvIHVwZGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VcGRhdGUge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgbG9hbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVwZGF0ZVxuICAgICAqL1xuICAgIGxvYW5faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0YXR1cyB1cGRhdGUgaGlzdG9yeSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzX2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIHVwZGF0ZXMgdG8gdGhlIHBheW1lbnQgaGlzdG9yeSBmb3IgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge0FycmF5PENyYUxvYW5QYXltZW50SGlzdG9yeT59XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5VcGRhdGVcbiAgICAgKi9cbiAgICBwYXltZW50X2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuUGF5bWVudEhpc3Rvcnk+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGxvYW4gYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q3JhTG9hbkFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy9yZWdpc3RlcmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdW5yZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblVucmVnaXN0ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VbnJlZ2lzdGVyPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdXBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuVXBkYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VcGRhdGU+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U6IE1vbml0b3JpbmdDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYSBVc2VyIE1vbml0b3JpbmcgSW5zaWdodHMgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXJfaW5zaWdodHNfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBNb25pdG9yaW5nIEluc2lnaHRzIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW0+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBzcGVjaWZpYyBpbnNpZ2h0cyB3ZXJlIGdlbmVyYXRlZCAocGVyLWl0ZW0pLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGRhdGVfZ2VuZXJhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGluc2lnaHRzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc2lnaHRzOiBNb25pdG9yaW5nSW5zaWdodHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgZWFjaCBvZiB0aGUgYWNjb3VudHMgb3BlbiBvbiB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxCYXNlUmVwb3J0QWNjb3VudD47XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvc3Vic2NyaWJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIHRvIHN1YnNjcmliZSBmb3IgQ2FzaCBGbG93IFVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBDYXNoIEZsb3cgVXBkYXRlcyB3ZWJob29rcywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdGVkIENhc2ggRmxvdyBVcGRhdGVzIHJlcG9ydCBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluY29tZSBjYXRlZ29yaWVzIHRvIGluY2x1ZGUgaW4gQ2FzaCBGbG93IFVwZGF0ZXMuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gaW5jbHVkaW5nIGFsbCBwb3NzaWJsZSBjYXRlZ29yaWVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvc3Vic2NyaWJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZVxuICAgICAqL1xuICAgIHN1YnNjcmlwdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvdW5zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3Vic2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHN1YnNjcmlwdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNb2RlbGVkIGVzdGltYXRlIG9mIHRoZSBtb250aGx5IGluY29tZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9udGhseUluY29tZVZhbHVlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbnRobHlJbmNvbWVWYWx1ZXMge1xuICAgIC8qKlxuICAgICAqIEdyb3NzIEluY29tZSBtb2RlbGVkIGZyb20gdHJlbmRzIG9mIG9ic2VydmVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb250aGx5SW5jb21lVmFsdWVzXG4gICAgICovXG4gICAgZ3Jvc3NfaW5jb21lOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTmV0IEluY29tZSBlc3RpbWF0ZWQgZnJvbSBvYnNlcnZlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9udGhseUluY29tZVZhbHVlc1xuICAgICAqL1xuICAgIG5ldF9pbmNvbWU6IG51bWJlcjtcbn1cbi8qKlxuICogQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFOZXR3b3JrSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGUgdXNlciBsaW5rZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIG5ldHdvcmsgYXR0cmlidXRlcywgd2hlcmUgdGhlIGtleSBpcyBhIHN0cmluZywgYW5kIHRoZSB2YWx1ZSBpcyBhIGZsb2F0LCBpbnQsIG9yIGJvb2xlYW4uIEZvciBhIGZ1bGwgbGlzdCBvZiBhdHRyaWJ1dGVzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIG5ldHdvcmtfYXR0cmlidXRlczogb2JqZWN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtcyB0aGUgZW5kIHVzZXIgY29ubmVjdGVkIGluIExpbmsuXG4gICAgICogQHR5cGUge0FycmF5PENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JhTmV0d29ya0luc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIEEgbGlzdCBvZiBhZGQtb25zIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBQREYuICBgY3JhX2luY29tZV9pbnNpZ2h0c2A6IEluY2x1ZGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBpbiB0aGUgUERGLiBgY3JhX3BhcnRuZXJfaW5zaWdodHNgOiBJbmNsdWRlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGluIHRoZSBQREYuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFQREZBZGRPbnMge1xuICAgIEluY29tZUluc2lnaHRzID0gJ2NyYV9pbmNvbWVfaW5zaWdodHMnLFxuICAgIFBhcnRuZXJJbnNpZ2h0cyA9ICdjcmFfcGFydG5lcl9pbnNpZ2h0cydcbn1cblxuLyoqXG4gKiBUaGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgb2YgdGhlIGJhbmsgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIFBhcnRuZXIgSW5zaWdodHMgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzRmljb1Jlc3VsdHN9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGZpY28/OiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVzdWx0cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmlzbT86IENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyB1c2VkIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGJhc2UgRklDTyBzY29yZSBhc3NvY2lhdGVkIHdpdGggYW4gVWx0cmFGSUNPwq4gc2NvcmluZyByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c0J1cmVhdX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZVxuICAgICAqL1xuICAgIGJ1cmVhdTogQ3JhUGFydG5lckluc2lnaHRzQnVyZWF1O1xuICAgIC8qKlxuICAgICAqIE51bWVyaWMgdmFsdWUgb2YgdGhlIGJhc2UgRklDTyBzY29yZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBSZWFzb24gY29kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZSwgaW4gcHJpb3JpdHkgb3JkZXIuIE1heSBjb250YWluIHVwIHRvIDQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgZmlyc3QgcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByZWFzb25fY29kZV8xPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHJlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIHNlY29uZCByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgdGhpcmQgcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByZWFzb25fY29kZV8zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHJlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIGZvdXJ0aCByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgaW5xdWlyaWVzIGFkdmVyc2VseSBhZmZlY3RlZCB0aGUgc2NvcmUgYnV0IHdlcmUgbm90IHJlcHJlc2VudGVkIGluIG9uZSBvZiB0aGUgZm91ciByZWFzb24gY29kZXMuIFNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgRkFDVEEgRmxhZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZVxuICAgICAqL1xuICAgIGRpZF9pbnF1aXJpZXNfYWR2ZXJzZWx5X2FmZmVjdF9zY29yZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZVxuICAgICAqL1xuICAgIGJhc2VfZmljb19zY29yZV92ZXJzaW9uOiBDcmFQYXJ0bmVySW5zaWdodHNCYXNlRmljb1Njb3JlVmVyc2lvbjtcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgRklDTyBzY29yZSBtb2RlbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmVWZXJzaW9uIHtcbiAgICBfOCA9ICc4JyxcbiAgICBfOSA9ICc5JyxcbiAgICBfMTAgPSAnMTAnLFxuICAgIF8xMFQgPSAnMTBUJ1xufVxuXG4vKipcbiAqIFRoZSBjcmVkaXQgYnVyZWF1IHRoYXQgcHJvdmlkZWQgdGhlIGJhc2UgRklDTyBzY29yZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBhcnRuZXJJbnNpZ2h0c0J1cmVhdSB7XG4gICAgRXF1aWZheCA9ICdFUVVJRkFYJyxcbiAgICBFeHBlcmlhbiA9ICdFWFBFUklBTicsXG4gICAgVHJhbnN1bmlvbiA9ICdUUkFOU1VOSU9OJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwYXJ0bmVyIGluc2lnaHRzIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENSQV9JTlNJR0hUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUl9JTlNJR0hUU19DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHBhcnRuZXIgaW5zaWdodHMgcmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOU0lHSFRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSX0lOU0lHSFRTX0VSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgRklDTyBwcm9kdWN0cyB1c2VkIGluIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dCB7XG4gICAgLyoqXG4gICAgICogSUQgcHJvdmlkZWQgYnkgRklDTyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGxlbmRlci4gUmVxdWlyZWQgZm9yIFVsdHJhRklDT8KuIHNjb3JlIGdlbmVyYXRpb24uIFNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBMZW5kZXIgT3JnIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dFxuICAgICAqL1xuICAgIGZpY29fbGVuZGVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRklDTyBBcHBsaWNhdGlvbiBhY3Jvc3MgRklDTyBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dFxuICAgICAqL1xuICAgIGxlbmRlcl9hcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBVbHRyYUZJQ0/CriBzY29yaW5nIHJlcXVlc3RzLiBFYWNoIHJlcXVlc3QgY29udGFpbnMgYWxsIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYW4gVWx0cmFGSUNPIHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlcXVlc3Q+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvSW5wdXRcbiAgICAgKi9cbiAgICB1bHRyYWZpY29fc2NvcmVfcmVxdWVzdHM6IEFycmF5PENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdD47XG59XG4vKipcbiAqIFJlcG9ydCBjaGFyYWN0ZXJpc3RpY3MgcmV0dXJuZWQgYnkgRklDTyBkZXNjcmliaW5nIHRoZSBiYW5raW5nIGRhdGEgdXNlZCB0byBnZW5lcmF0ZSB0aGUgVWx0cmFGSUNPwq4gc2NvcmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgYWNjb3VudHMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gTGltaXRlZCB0byBjaGVja2luZywgc2F2aW5ncywgYW5kIG1vbmV5IG1hcmtldCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgbnVtX2FjY291bnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGRhaWx5IGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAxIG1vbnRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBhdmdfZGFpbHlfYmFsYW5jZV9vdmVyXzFfbW9udGg/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgZGFpbHkgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBhdmdfZGFpbHlfYmFsYW5jZV9vdmVyXzNfbW9udGhzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGRhaWx5IGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgYXZnX2RhaWx5X2JhbGFuY2Vfb3Zlcl82X21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBkYWlseSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBhdmdfZGFpbHlfYmFsYW5jZV9vdmVyXzEyX21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZWFybGllc3RfdHg/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBtb3N0IHJlY2VudCBkYXkgd2l0aCBhIG5lZ2F0aXZlIGVuZGluZyBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX21vc3RfcmVjZW50X25lZ2F0aXZlX2VuZGluZ19iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbW9zdCByZWNlbnQgaW5zdWZmaWNpZW50IGZ1bmRzIGZlZSBkZWJpdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9tb3N0X3JlY2VudF9pbnN1ZmZpY2llbnRfZnVuZHNfZmVlX2RlYml0X3R4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgZGF5cyB3aXRoIGEgbmVnYXRpdmUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDEgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIHRvdF9udW1iZXJfZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2Vfb3Zlcl8xX21vbnRoPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgZGF5cyB3aXRoIGEgbmVnYXRpdmUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICB0b3RfbnVtYmVyX2RheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX292ZXJfM19tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBkYXlzIHdpdGggYSBuZWdhdGl2ZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIHRvdF9udW1iZXJfZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2Vfb3Zlcl82X21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGRheXMgd2l0aCBhIG5lZ2F0aXZlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc1xuICAgICAqL1xuICAgIHRvdF9udW1iZXJfZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2Vfb3Zlcl8xMl9tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9tb3N0X3JlY2VudF90eD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBhdCBsZWFzdCBvbmUgdHJhbnNhY3Rpb24gb3ZlciB0aGUgcGFzdCAxIG1vbnRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfdHhfb3Zlcl8xX21vbnRoPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyB3aXRoIGF0IGxlYXN0IG9uZSB0cmFuc2FjdGlvbiBvdmVyIHRoZSBwYXN0IDMgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfdHhfb3Zlcl8zX21vbnRocz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBhdCBsZWFzdCBvbmUgdHJhbnNhY3Rpb24gb3ZlciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgZGF5c193aXRoX3R4X292ZXJfNl9tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHdpdGggYXQgbGVhc3Qgb25lIHRyYW5zYWN0aW9uIG92ZXIgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfdHhfb3Zlcl8xMl9tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBjdXJyZW50IGJhbGFuY2VzIGFjcm9zcyBhbGwgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgdG90X2N1cnJlbnRfYmFsYW5jZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjaGVja2luZyBhY2NvdW50cyBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXBvcnRDaGFyYWN0ZXJpc3RpY3NcbiAgICAgKi9cbiAgICBudW1fY2hlY2tpbmdfYWNjb3VudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBtb25leSBtYXJrZXQgYWNjb3VudHMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgbnVtX21vbmV5X21hcmtldF9hY2NvdW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHNhdmluZ3MgYWNjb3VudHMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVwb3J0Q2hhcmFjdGVyaXN0aWNzXG4gICAgICovXG4gICAgbnVtX3NhdmluZ3NfYWNjb3VudHM/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY2FsY3VsYXRlZCBVbHRyYUZJQ0/CriBzY29yZXMgcmV0dXJuZWQgYXMgcGFydCBvZiB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXN1bHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRmljb1Jlc3VsdHMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZJQ08gQXBwbGljYXRpb24gYWNyb3NzIEZJQ08gc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNGaWNvUmVzdWx0c1xuICAgICAqL1xuICAgIGxlbmRlcl9hcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVsdHJhRklDT8KuIHNjb3JpbmcgcmVzdWx0cywgb25lIHBlciBwcm92aWRlZCBVbHRyYUZJQ08gc2NvcmluZyByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29SZXN1bHRzXG4gICAgICovXG4gICAgdWx0cmFmaWNvX3Njb3JlX3Jlc3VsdHM6IEFycmF5PENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzRmljb1Jlc3VsdHNcbiAgICAgKi9cbiAgICByZXBvcnRfY2hhcmFjdGVyaXN0aWNzPzogQ3JhUGFydG5lckluc2lnaHRzRmljb1JlcG9ydENoYXJhY3RlcmlzdGljcyB8IG51bGw7XG59XG4vKipcbiAqIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVVzZXJUaWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90aWVyPzogQ3JhVXNlclRpZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGF0IHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGluIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50Pjtcbn1cbi8qKlxuICogQWNjb3VudCBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW0gZnJvbSB3aGljaCBQYXJ0bmVyIEluc2lnaHRzIHdlcmUgZ2VuZXJhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBleHRyYWN0ZWQgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBQcmlzbSBEYXRhIGluc2lnaHRzIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgY2FzaF9zY29yZT86IFByaXNtQ2FzaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21FeHRlbmR9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgZXh0ZW5kPzogUHJpc21FeHRlbmQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUZpcnN0RGV0ZWN0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbVxuICAgICAqL1xuICAgIGZpcnN0X2RldGVjdD86IFByaXNtRmlyc3REZXRlY3QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbURldGVjdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAgICAgKi9cbiAgICBkZXRlY3Q/OiBQcmlzbURldGVjdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvbiB3aGV0aGVyIHRoZSBQcmlzbSBEYXRhIGF0dHJpYnV0ZXMgc3VjY2VlZGVkIG9yIGZhaWxlZCB0byBiZSBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNhbGN1bGF0ZWQgVWx0cmFGSUNPwq4gc2NvcmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICovXG4gICAgdWx0cmFmaWNvX3Njb3JlX3ZlcnNpb246IENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlVmVyc2lvbjtcbiAgICAvKipcbiAgICAgKiBOdW1lcmljIHZhbHVlIG9mIHRoZSBVbHRyYUZJQ0/CriBzY29yZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTmVnYXRpdmUgcmVhc29uIGNvZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUgKHJlYXNvbnMgdGhlIHNjb3JlIG1vdmVkIGRvd253YXJkKSwgaW4gcHJpb3JpdHkgb3JkZXIuIE1heSBjb250YWluIHVwIHRvIDQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICovXG4gICAgbmVnYXRpdmVfcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBQb3NpdGl2ZSByZWFzb24gY29kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZSAocmVhc29ucyB0aGUgc2NvcmUgbW92ZWQgdXB3YXJkKSwgaW4gcHJpb3JpdHkgb3JkZXIuIE1heSBjb250YWluIHVwIHRvIDQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICovXG4gICAgcG9zaXRpdmVfcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYG5lZ2F0aXZlX3JlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIGZpcnN0IHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgbmVnYXRpdmVfcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgc2Vjb25kIHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2RlXzI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgbmVnYXRpdmVfcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgdGhpcmQgcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVfMz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZC4gVXNlIGBuZWdhdGl2ZV9yZWFzb25fY29kZXNgIGluc3RlYWQuIFRoZSBmb3VydGggcmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY29yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVfND86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZC4gVXNlIGBwb3NpdGl2ZV9yZWFzb25fY29kZXNgIGluc3RlYWQuIFRoZSBmaXJzdCBwb3NpdGl2ZSByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwb3NpdGl2ZV9yZWFzb25fY29kZV8xPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHBvc2l0aXZlX3JlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIHNlY29uZCBwb3NpdGl2ZSByZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwb3NpdGl2ZV9yZWFzb25fY29kZV8yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBVc2UgYHBvc2l0aXZlX3JlYXNvbl9jb2Rlc2AgaW5zdGVhZC4gVGhlIHRoaXJkIHBvc2l0aXZlIHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBvc2l0aXZlX3JlYXNvbl9jb2RlXzM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIFVzZSBgcG9zaXRpdmVfcmVhc29uX2NvZGVzYCBpbnN0ZWFkLiBUaGUgZm91cnRoIHBvc2l0aXZlIHJlYXNvbiBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBvc2l0aXZlX3JlYXNvbl9jb2RlXzQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgaW5xdWlyaWVzIGFkdmVyc2VseSBhZmZlY3RlZCB0aGUgc2NvcmUgYnV0IHdlcmUgbm90IHJlcHJlc2VudGVkIGluIG9uZSBvZiB0aGUgZm91ciByZWFzb24gY29kZXMuIFNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgRkFDVEEgRmxhZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVcbiAgICAgKi9cbiAgICBkaWRfaW5xdWlyaWVzX2FkdmVyc2VseV9hZmZlY3Rfc2NvcmU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiByZXF1aXJlZCB0byBnZW5lcmF0ZSBhIHNpbmdsZSBVbHRyYUZJQ0/CriBzY29yZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1bHRyYWZpY29fc2NvcmVfdmVyc2lvbjogQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVWZXJzaW9uO1xuICAgIC8qKlxuICAgICAqIEZJQ08gaWRlbnRpZmllciBmb3IgYSBwYXJ0aWN1bGFyIHNjb3JpbmcgcmVxdWVzdC4gU2hvdWxkIG9ubHkgYmUgcHJvdmlkZWQgYnkgRklDTyBhcyBwYXJ0IG9mIHRoZSBGSUNPLWxlZCBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdFxuICAgICAqL1xuICAgIGZpY29fc2NvcmluZ19yZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBzY29yaW5nIHJlcXVlc3RzIHdpdGggdGhlaXIgc2NvcmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVlc3RfY29ycmVsYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c0Jhc2VGaWNvU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhc2VfZmljb19zY29yZTogQ3JhUGFydG5lckluc2lnaHRzQmFzZUZpY29TY29yZTtcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBhIHNpbmdsZSBVbHRyYUZJQ0/CriBzY29yZSBnZW5lcmF0aW9uIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBzY29yaW5nIHJlcXVlc3RzIHdpdGggdGhlaXIgc2NvcmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0XG4gICAgICovXG4gICAgcmVxdWVzdF9jb3JyZWxhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGSUNPLXByb3ZpZGVkIGlkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgc2NvcmUgZ2VuZXJhdGlvbiByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlUmVzdWx0XG4gICAgICovXG4gICAgZmljb19zY29yaW5nX3JlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlc3VsdFxuICAgICAqL1xuICAgIHVsdHJhZmljb19zY29yZT86IENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIFVsdHJhRklDT8KuIHNjb3JlIGNvdWxkIG5vdCBiZSBjb21wdXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNVbHRyYUZpY29TY29yZVJlc3VsdFxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGSUNPIGV4Y2x1c2lvbiBjb2RlIGluZGljYXRpbmcgd2h5IGFuIFVsdHJhRklDT8KuIHNjb3JlIGNvdWxkIG5vdCBiZSBjb21wdXRlZCBkdWUgdG8gY29uc3VtZXItZGF0YSBjb25kaXRpb25zIChlLmcuIGluc3VmZmljaWVudCBhY2NvdW50IGhpc3RvcnkpLiBgbnVsbGAgd2hlbiB0aGUgZXhjbHVzaW9uIGNvZGUgaXMgbm90IHNldDsgXFxcIjBcXFwiIHdoZW4gYSBzY29yZSB3YXMgcHJvZHVjZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzVWx0cmFGaWNvU2NvcmVSZXN1bHRcbiAgICAgKi9cbiAgICBleGNsdXNpb25fY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBVbHRyYUZJQ0/CriBzY29yZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBhcnRuZXJJbnNpZ2h0c1VsdHJhRmljb1Njb3JlVmVyc2lvbiB7XG4gICAgXzEwID0gJzEuMCdcbn1cblxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJlZGljdGlvbiBpbnRlcnZhbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgcHJlZGljdGVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHByb2JhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVByZWRpY3Rpb25JbnRlcnZhbFxuICAgICAqL1xuICAgIGxvd2VyX2JvdW5kPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHByZWRpY3RlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBwcm9iYWJpbGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1cHBlcl9ib3VuZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JhYmlsaXR5IG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBmYWxsaW5nIHdpdGhpbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kLiBUaGlzIGlzIGEgcGVyY2VudGFnZSByZXByZXNlbnRlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICBwcm9iYWJpbGl0eT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZvcndhcmQtbG9va2luZyBtb2RlbGVkIGVzdGltYXRlIG9mIGluY29tZSBiYXNlZCBvbiByZWNlbnQgaW5jb21lIHRyYW5zYWN0aW9ucyBhbmQgdHJlbmRzIGluIGFjdGl2ZSBzdHJlYW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQcm9qZWN0ZWRNb2RlbGVkSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUHJvamVjdGVkTW9kZWxlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYU1vbnRobHlJbmNvbWVWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYVByb2plY3RlZE1vZGVsZWRJbmNvbWVcbiAgICAgKi9cbiAgICBtb250aGx5OiBDcmFNb250aGx5SW5jb21lVmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFBbm51YWxJbmNvbWVWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYVByb2plY3RlZE1vZGVsZWRJbmNvbWVcbiAgICAgKi9cbiAgICBhbm51YWw6IENyYUFubnVhbEluY29tZVZhbHVlcztcbn1cbi8qKlxuICogVGhlIHN0YWdlIGluIHRoZSBsZW5kaW5nIGxpZmVjeWNsZSBmb3Igd2hpY2ggdGhlIHJlcG9ydCBpcyBiZWluZyByZXRyaWV2ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFSZXBvcnREZWNpc2lvblN0YWdlIHtcbiAgICBQcmVxdWFsaWZpY2F0aW9uID0gJ1BSRVFVQUxJRklDQVRJT04nLFxuICAgIERlY2lzaW9uaW5nID0gJ0RFQ0lTSU9OSU5HJyxcbiAgICBTZXJ2aWNpbmcgPSAnU0VSVklDSU5HJ1xufVxuXG4vKipcbiAqIFRoZSBDUkEgcmVwb3J0IHJldHVybmVkIGJ5IGAvY3JhL3JlcG9ydC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFSZXBvcnRHZXRSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFSZXBvcnRHZXRSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSByZXBvcnQgd2FzIHJldHJpZXZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFSZXBvcnRHZXRSZXBvcnRcbiAgICAgKi9cbiAgICByZXRyaWV2ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFSZXBvcnRTY29wZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVwb3J0XG4gICAgICovXG4gICAgc2NvcGU6IENyYVJlcG9ydFNjb3BlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFSZXBvcnREZWNpc2lvblN0YWdlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFSZXBvcnRHZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9zdGFnZTogQ3JhUmVwb3J0RGVjaXNpb25TdGFnZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlcG9ydFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlOiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbiAgICAvKipcbiAgICAgKiBQZXItcHJvZHVjdCByZXBvcnQgZGF0YS4gRWFjaCBlbnRyeSBjb3JyZXNwb25kcyB0byBvbmUgcmVxdWVzdGVkIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PENyYVJlcG9ydEdldFJlc3BvbnNlUHJvZHVjdD59XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlcG9ydFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxDcmFSZXBvcnRHZXRSZXNwb25zZVByb2R1Y3Q+O1xufVxuLyoqXG4gKiBDcmFSZXBvcnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9yZXBvcnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0ZWQgcHJvZHVjdHMgYW5kIHRoZWlyIHZlcnNpb25zLCBlLmcuIGBbe1xcXCJwcm9kdWN0XFxcIjpcXFwiY3JhX3F1YWxpZnlcXFwiLFxcXCJ2ZXJzaW9uXFxcIjpcXFwiVjFcXFwifV1gLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFSZXBvcnRHZXRSZXF1ZXN0UHJvZHVjdD59XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8Q3JhUmVwb3J0R2V0UmVxdWVzdFByb2R1Y3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFSZXBvcnRTY29wZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNjb3BlPzogQ3JhUmVwb3J0U2NvcGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVJlcG9ydERlY2lzaW9uU3RhZ2V9XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9zdGFnZTogQ3JhUmVwb3J0RGVjaXNpb25TdGFnZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZTogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG59XG4vKipcbiAqIENyYVJlcG9ydEdldFJlcXVlc3RQcm9kdWN0IHNwZWNpZmllcyBhIHByb2R1Y3QgYW5kIHZlcnNpb24gZm9yIGEgYC9jcmEvcmVwb3J0L2dldGAgY2FsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUmVwb3J0R2V0UmVxdWVzdFByb2R1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFSZXBvcnRHZXRSZXF1ZXN0UHJvZHVjdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFSZXBvcnRHZXRSZXF1ZXN0UHJvZHVjdFxuICAgICAqL1xuICAgIHByb2R1Y3Q6IFByb2R1Y3RzO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9kdWN0IHRoYXQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFSZXBvcnRHZXRSZXF1ZXN0UHJvZHVjdFxuICAgICAqL1xuICAgIHZlcnNpb246IHN0cmluZztcbn1cbi8qKlxuICogQ3JhUmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9yZXBvcnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVJlcG9ydEdldFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IENyYVJlcG9ydEdldFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVXNlciBvciByZXBvcnQtbGV2ZWwgZXJyb3JzIHRoYXQgYWZmZWN0ZWQgdGhlIG92ZXJhbGwgcmVwb3J0IGJ1dCBkbyBub3QgbWFwIHRvIGEgc3BlY2lmaWMgcHJvZHVjdCBmYWlsdXJlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxDaGVja1JlcG9ydFdhcm5pbmc+O1xufVxuLyoqXG4gKiBQZXItcHJvZHVjdCByZXBvcnQgZGF0YS4gYGF0dHJpYnV0ZXNgIGlzIGFuIG9wYXF1ZSBtYXAgb2Yga2V5LXZhbHVlIHBhaXJzOyBmb3IgYSBmdWxsIGxpc3Qgb2YgYXR0cmlidXRlcyBwZXIgcHJvZHVjdCBhbmQgdmVyc2lvbiwgc2VlIHRoZSBkYXRhIGRpY3Rpb25hcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVJlcG9ydEdldFJlc3BvbnNlUHJvZHVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVJlcG9ydEdldFJlc3BvbnNlUHJvZHVjdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFSZXBvcnRHZXRSZXNwb25zZVByb2R1Y3RcbiAgICAgKi9cbiAgICBwcm9kdWN0OiBQcm9kdWN0cztcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcHJvZHVjdCB0aGF0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVzcG9uc2VQcm9kdWN0XG4gICAgICovXG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIHByb2R1Y3QgcmVwb3J0IG1ldGFkYXRhLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nIGFuZCB0aGUgdmFsdWUgdmFyaWVzIGJ5IHByb2R1Y3QuIEZvciBhIGZ1bGwgbGlzdCBvZiBtZXRhZGF0YSBmaWVsZHMgcGVyIHByb2R1Y3QsIHNlZSB0aGUgZGF0YSBkaWN0aW9uYXJ5LiBNYXkgYmUgYG51bGxgIGlmIG1ldGFkYXRhIHdhcyBub3QgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUmVwb3J0R2V0UmVzcG9uc2VQcm9kdWN0XG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIG1hcCBvZiBwcm9kdWN0IGF0dHJpYnV0ZXMsIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcgYW5kIHRoZSB2YWx1ZSBpcyBhIGZsb2F0LCBpbnQsIG9yIGJvb2xlYW4uIFRoZSBzcGVjaWZpYyBsaXN0IG9mIGF0dHJpYnV0ZXMgZGVwZW5kcyBvbiB0aGUgcHJvZHVjdCBhbmQgdmVyc2lvbi4gRm9yIGEgZnVsbCBsaXN0LCBzZWUgdGhlIGRhdGEgZGljdGlvbmFyeS4gTWF5IGJlIGBudWxsYCBpZiBhdHRyaWJ1dGVzIHdlcmUgbm90IGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlc3BvbnNlUHJvZHVjdFxuICAgICAqL1xuICAgIGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcm9kdWN0LWxldmVsIGVycm9ycy4gTm9uLWVtcHR5IHdoZW4gdGhpcyBwcm9kdWN0IGZhaWxlZCB0byBnZW5lcmF0ZTsgZW1wdHkgb24gc3VjY2Vzcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGxhaWRFcnJvcj59XG4gICAgICogQG1lbWJlcm9mIENyYVJlcG9ydEdldFJlc3BvbnNlUHJvZHVjdFxuICAgICAqL1xuICAgIGVycm9yczogQXJyYXk8UGxhaWRFcnJvcj47XG59XG4vKipcbiAqIERldGVybWluZXMgd2hvc2UgaXRlbXMgYXJlIHVzZWQuIGBQTEFJRF9ORVRXT1JLYCAoZGVmYXVsdCkgdXNlcyB0aGUgUGxhaWQgTmV0d29yayB2aWV3IG9mIHRoZSB1c2VyXFwncyBwcm9maWxlLiBgQ0xJRU5UX1VTRVJgIHVzZXMgb25seSB0aGUgaXRlbXMgbGlua2VkIGJ5IHRoaXMgY2xpZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhUmVwb3J0U2NvcGUge1xuICAgIFBsYWlkTmV0d29yayA9ICdQTEFJRF9ORVRXT1JLJyxcbiAgICBDbGllbnRVc2VyID0gJ0NMSUVOVF9VU0VSJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBDaGVjayBSZXBvcnQgdXBncmFkZSBhdHRlbXB0IGhhcyBmYWlsZWRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFVcGdyYWRlRmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVUEdSQURFX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVVwZ3JhZGVGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgZm9yIGl0ZW1zIHRoYXQgZmFpbGVkIHRvIGJlIHVwZ3JhZGVkIGJ5IGEgQ2hlY2sgUmVwb3J0IHVwZ3JhZGUgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBDaGVjayBSZXBvcnQgaGFzIGZhaWxlZCB0byBnZW5lcmF0ZS4gVG8gZ2V0IG1vcmUgZGV0YWlscywgY2FsbCBgL3VzZXIvaXRlbXMvZ2V0YCBhbmQgY2hlY2sgZm9yIG5vbi1udWxsIGBlcnJvcmAgb2JqZWN0cyBvbiB0aGUgYXNzb2NpYXRlZCBJdGVtcyBpbiB0aGUgcmVzcG9uc2UuIFRoZXNlIGBlcnJvcmAgb2JqZWN0cyB3aWxsIGNvbnRhaW4gbW9yZSBkZXRhaWxzIG9uIHdoeSB0aGUgSXRlbSBpcyBpbiBhbiBlcnJvciBzdGF0ZSBhbmQgaG93IHRvIHJlc29sdmUgaXQuIEFmdGVyIHJlc29sdmluZyB0aGUgZXJyb3JzLCB5b3UgY2FuIHRyeSB0byByZS1nZW5lcmF0ZSB0aGUgcmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFVc2VyQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFVTRVJfQ0hFQ0tfUkVQT1JUX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgd2hvc2UgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgaXMgcmVjZWl2ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERldGFpbHMgb24gd2h5IHRoZSBDaGVjayBSZXBvcnQgZmFpbGVkIGFuZCBob3cgdG8gcmVzb2x2ZSBpdC5cbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIEl0ZW1zIHRoYXQgdGhlIGVuZCB1c2VyIGNhbiByZXBhaXIgdmlhIExpbmsgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBFbXB0eSB3aGVuIG5vIEl0ZW0gaXMgdXNlci1yZXBhaXJhYmxlLiBBZnRlciByZXBhaXJpbmcgdGhlc2UgSXRlbXMsIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgdG8gcmVnZW5lcmF0ZSB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDaGVja1JlcG9ydFJlcGFpcmFibGVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlcGFpcmFibGVfaXRlbXM/OiBBcnJheTxDaGVja1JlcG9ydFJlcGFpcmFibGVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgZmFpbGVkIHRvIGdlbmVyYXRlIGZvciB0aGUgcmVwb3J0LiBQb3B1bGF0ZWQgd2hlbiBnZW5lcmF0aW9uIHdhcyBhdHRlbXB0ZWQgYW5kIGFsbCByZXF1ZXN0ZWQgcHJvZHVjdHMgZmFpbGVkLiBBZGRpdGlvbmFsIGRldGFpbCBvbiB3aGF0IGNhdXNlZCB0aGUgZmFpbHVyZSBjYW4gYmUgZm91bmQgYnkgY2FsbGluZyB0aGUgcHJvZHVjdCAvZ2V0IGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVVzZXJDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBmYWlsZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBpdGVtX2lkc2AgaW5jbHVkZWQgaW4gdGhlIENoZWNrIFJlcG9ydC4gQWNjZXNzIHRvIHRoaXMgZmllbGQgaXMgaW4gY2xvc2VkIGJldGEuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVVzZXJDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYVVzZXJDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBDaGVjayBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIHRoZSByZXBvcnQgd2lsbCBiZSBhdmFpbGFibGUgdG8gcmV0cmlldmUgZm9yIDI0IGhvdXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFVc2VyQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFVc2VyQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVVzZXJDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHdob3NlIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGlzIHJlY2VpdmVkIGJ5IGNhbGxpbmcgYC91c2VyL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIHN1Y2Nlc3NmdWxseSBiZWVuIGdlbmVyYXRlZCBmb3IgdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBzdWNjZXNzZnVsX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGZhaWxlZCB0byBnZW5lcmF0ZSBmb3IgdGhlIHJlcG9ydC4gQWRkaXRpb25hbCBkZXRhaWwgb24gd2hhdCBjYXVzZWQgdGhlIGZhaWx1cmUgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcgdGhlIHByb2R1Y3QgL2dldCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFVc2VyQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBmYWlsZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBpdGVtX2lkc2AgaW5jbHVkZWQgaW4gdGhlIENoZWNrIFJlcG9ydC4gQWNjZXNzIHRvIHRoaXMgZmllbGQgaXMgaW4gY2xvc2VkIGJldGEuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYVVzZXJDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXNlckNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHRpZXIgb2YgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFVc2VyVGllciB7XG4gICAgRnJlZSA9ICdmcmVlJyxcbiAgICBQYWlkID0gJ3BhaWQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBY2NvdW50IGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgSG9tZSBMZW5kaW5nIEluY29tZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWV0YWRhdGE6IENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIGNhdGVnb3J5IGZvciBhIGdpdmVuIHN0cmVhbS4gVGhlIHN0cmVhbXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIHdpbGwgYmUgZmlsdGVyZWQgYmFzZWQgb24gdGhlc2UgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGluY29tZSBjYXRlZ29yaWVzLiAgU2VlIHRoZSBbSW5jb21lIFYyIENhdGVnb3J5IFRheG9ub215XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvaW5jb21lLXYyLWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIGluY29tZSBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZUNhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBncmFudWxhciBjYXRlZ29yeSBjb252ZXlpbmcgdGhlIHN0cmVhbVxcJ3MgaW50ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUNhdGVnb3J5XG4gICAgICovXG4gICAgc2Vjb25kYXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0gd2l0aGluIHRoZSBIb21lIExlbmRpbmcgSW5jb21lIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgYmFuayBpbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIE1vZGVsZWQgaW5jb21lIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gaW5jb21lIHN0cmVhbSBvciB1c2VyIHN1bW1hcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZU1ldHJpY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVNZXRyaWNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uTW9kZWxlZEluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lTWV0cmljc1xuICAgICAqL1xuICAgIGN1cnJlbnQ6IENyYVZlcmlmaWNhdGlvbk1vZGVsZWRJbmNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVNZXRyaWNzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lTWV0cmljc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgb2YgdGhlIGluY29tZSBzdHJlYW1cXCdzIG5leHQgcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lTmV4dFBheW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVOZXh0UGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgb2YgdGhlIGluY29tZSBzdHJlYW1cXCdzIG5leHQgcGF5bWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZU5leHRQYXltZW50XG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIHBheSBmcmVxdWVuY3kuIGBXRUVLTFlgOiBXZWVrbHkgcGF5IGZyZXF1ZW5jeS4gYEJJV0VFS0xZYDogQml3ZWVrbHkgcGF5IGZyZXF1ZW5jeS4gYFNFTUlfTU9OVEhMWWA6IFNlbWktbW9udGhseSBwYXkgZnJlcXVlbmN5LiBgTU9OVEhMWWA6IE1vbnRobHkgcGF5IGZyZXF1ZW5jeS4gYERBSUxZYDogRGFpbHkgcGF5IGZyZXF1ZW5jeS4gYFVOS05PV05gOiBQYXkgZnJlcXVlbmN5IGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFWZXJpZmljYXRpb25JbmNvbWVQYXlGcmVxdWVuY3kge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgRGFpbHkgPSAnREFJTFknLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgaW5jb21lIHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVQcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVByb3ZpZGVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbmNvbWUgcHJvdmlkZXIgbmFtZSBpcyBub3JtYWxpemVkIGJ5IGNvbXBhcmluZyBpdCBhZ2FpbnN0IGEgY2Fub25pY2FsIHNldCBvZiBrbm93biBwcm92aWRlcnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVByb3ZpZGVyXG4gICAgICovXG4gICAgaXNfbm9ybWFsaXplZDogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBJbmNvbWUgUmVwb3J0IHdpdGhpbiB0aGUgSG9tZSBMZW5kaW5nIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBIb21lIExlbmRpbmcgSW5jb21lIFJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBIb21lIExlbmRpbmcgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25JbmNvbWVVc2VyU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUmVwb3J0XG4gICAgICovXG4gICAgdXNlcl9zdW1tYXJ5OiBDcmFWZXJpZmljYXRpb25JbmNvbWVVc2VyU3VtbWFyeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgaW5jb21lIHN0cmVhbXMgZm9yIHRoaXMgdXNlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUmVwb3J0XG4gICAgICovXG4gICAgaW5jb21lX3N0cmVhbXM6IEFycmF5PENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgSXRlbXMgaW4gdGhlIHJlcG9ydCBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFWZXJpZmljYXRpb25JbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYVZlcmlmaWNhdGlvbkluY29tZUl0ZW0+O1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBpbmNvbWUgc291cmNlLiBgQUNUSVZFYDogVGhlIGluY29tZSBzb3VyY2UgaXMgYWN0aXZlLiBgSU5BQ1RJVkVgOiBUaGUgaW5jb21lIHNvdXJjZSBpcyBpbmFjdGl2ZS4gYFVOS05PV05gOiBUaGUgaW5jb21lIHNvdXJjZSBzdGF0dXMgaXMgdW5rbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVZlcmlmaWNhdGlvbkluY29tZVN0YXR1cyB7XG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgSW5hY3RpdmUgPSAnSU5BQ1RJVkUnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBpbmNvbWUgc3RyZWFtIGRldGVjdGVkIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc3RyZWFtLiBJZiB0aGUgcmVwb3J0IGlzIHJlZ2VuZXJhdGVkIGFuZCBhIG5ldyBgcmVwb3J0X2lkYCBpcyBjcmVhdGVkLCB0aGUgbmV3IHJlcG9ydCB3aWxsIGhhdmUgYSBuZXcgc2V0IG9mIGBpbmNvbWVfc3RyZWFtX2lkYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtXG4gICAgICovXG4gICAgaW5jb21lX3N0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHN0cmVhbSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzdHJlYW0gZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICBpbnNpZ2h0czogQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZlcmlmaWNhdGlvbkluY29tZU1ldHJpY3N9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbVxuICAgICAqL1xuICAgIGluY29tZV9tZXRyaWNzOiBDcmFWZXJpZmljYXRpb25JbmNvbWVNZXRyaWNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbnMgZGF0YSBmb3IgdGhlIGluY29tZSBzdHJlYW0gb3JkZXJlZCBieSBhc2NlbmRpbmcgZGF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogTW9kZWxlZCBpbnNpZ2h0cyBmb3IgYSBnaXZlbiBpbmNvbWUgc3RyZWFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3J5OiBDcmFWZXJpZmljYXRpb25JbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVTdHJlYW1JbnNpZ2h0c1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IENyYVZlcmlmaWNhdGlvbkluY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lUHJvdmlkZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX3Byb3ZpZGVyOiBDcmFWZXJpZmljYXRpb25JbmNvbWVQcm92aWRlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZlcmlmaWNhdGlvbkluY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lU3RyZWFtSW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyYVZlcmlmaWNhdGlvbkluY29tZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lTmV4dFBheW1lbnR9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVN0cmVhbUluc2lnaHRzXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50OiBDcmFWZXJpZmljYXRpb25JbmNvbWVOZXh0UGF5bWVudCB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0cmFuc2FjdGlvbiBkYXRhIGZvciBhbiBpbmNvbWUgc3RyZWFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3kgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBjcmVkaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50LCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uT3V0bGllcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvdXRsaWVyOiBDcmFWZXJpZmljYXRpb25JbmNvbWVUcmFuc2FjdGlvbk91dGxpZXI7XG59XG4vKipcbiAqIE1ldGFkYXRhIG9uIHdoZXRoZXIgdGhpcyBpbmNvbWUgdHJhbnNhY3Rpb24gaXMgYW4gb3V0bGllci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25PdXRsaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25PdXRsaWVyIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbiBpbmNvbWUgdHJhbnNhY3Rpb24gYW1vdW50IGlzIHVudXN1YWxseSBoaWdoIGNvbXBhcmVkIHRvIHRoZSBhbW91bnRzIGZvciB0aGF0IHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVHJhbnNhY3Rpb25PdXRsaWVyXG4gICAgICovXG4gICAgaXNfb3V0bGllcjogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHRyYW5zYWN0aW9uIGRpZmZlcnMgZnJvbSB0aGUgc3RyZWFtIGF2ZXJhZ2UgdHJhbnNhY3Rpb24gYW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbkluY29tZVRyYW5zYWN0aW9uT3V0bGllclxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFnZ3JlZ2F0ZWQgc3VtbWFyeSBvZiBhbGwgaW5jb21lIHN0cmVhbXMgZm9yIHRoaXMgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uSW5jb21lVXNlclN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVVc2VyU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhIHVzZXJcXCdzIGFnZ3JlZ2F0ZWQgaW5jb21lIG1ldHJpY3MgZm9yIGVhY2ggY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyYVZlcmlmaWNhdGlvbkluY29tZU1ldHJpY3M+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVVc2VyU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9tZXRyaWNzOiBBcnJheTxDcmFWZXJpZmljYXRpb25JbmNvbWVNZXRyaWNzPjtcbn1cbi8qKlxuICogTW9kZWxlZCBpbmNvbWUgdmFsdWVzIGZvciBhIGdpdmVuIHRpbWUgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVWYWx1ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWZXJpZmljYXRpb25JbmNvbWVWYWx1ZXMge1xuICAgIC8qKlxuICAgICAqIEdyb3NzIEluY29tZSBtb2RlbGVkIGZyb20gdHJlbmRzIG9mIG9ic2VydmVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVWYWx1ZXNcbiAgICAgKi9cbiAgICBncm9zc19pbmNvbWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOZXQgSW5jb21lIGVzdGltYXRlZCBmcm9tIG9ic2VydmVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25JbmNvbWVWYWx1ZXNcbiAgICAgKi9cbiAgICBuZXRfaW5jb21lOiBudW1iZXI7XG59XG4vKipcbiAqIE1vZGVsZWQgZXN0aW1hdGUgb2YgY3VycmVudCBpbmNvbWUgYmFzZWQgb24gcmVjZW50bHkgb2JzZXJ2ZWQgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVmVyaWZpY2F0aW9uTW9kZWxlZEluY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvbk1vZGVsZWRJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWZXJpZmljYXRpb25JbmNvbWVWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvbk1vZGVsZWRJbmNvbWVcbiAgICAgKi9cbiAgICBtb250aGx5OiBDcmFWZXJpZmljYXRpb25JbmNvbWVWYWx1ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZlcmlmaWNhdGlvbkluY29tZVZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uTW9kZWxlZEluY29tZVxuICAgICAqL1xuICAgIGFubnVhbDogQ3JhVmVyaWZpY2F0aW9uSW5jb21lVmFsdWVzO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIEhvbWUgTGVuZGluZyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvblJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZlcmlmaWNhdGlvblJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgSG9tZSBMZW5kaW5nIFJlcG9ydCBvYmplY3QuIFRoaXMgSUQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgQmFzZSBSZXBvcnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggR1NFcyBpbiBvcmRlciB0byBwcm92aWRlIHRoZW0gYWNjZXNzIHRvIHRoZSByZXBvcnQuIFRoaXMgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGR1cmluZyByZXBvcnQgZ2VuZXJhdGlvbiB3aGVuIEdTRSBvcHRpb25zIGFyZSBzcGVjaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uUmVwb3J0XG4gICAgICovXG4gICAgZ3NlX3JlZmVyZW5jZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uUmVwb3J0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZvYVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVmVyaWZpY2F0aW9uUmVwb3J0XG4gICAgICovXG4gICAgdm9hPzogQ3JhVm9hUmVwb3J0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhRW1wbG95bWVudFJlZnJlc2hSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIENyYVZlcmlmaWNhdGlvblJlcG9ydFxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfcmVmcmVzaD86IENyYUVtcGxveW1lbnRSZWZyZXNoUmVwb3J0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhVmVyaWZpY2F0aW9uSW5jb21lUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWZXJpZmljYXRpb25SZXBvcnRcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBDcmFWZXJpZmljYXRpb25JbmNvbWVSZXBvcnQgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgVk9BIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBWT0EgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0aGF0IHRoZSBWT0EgcmVwb3J0IGNvdmVycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEJhc2UgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFWb2FSZXBvcnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYVZvYVJlcG9ydEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWb2FSZXBvcnRBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzOiBDcmFWb2FSZXBvcnRBdHRyaWJ1dGVzO1xufVxuLyoqXG4gKiBWT0EgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZvYVJlcG9ydEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWb2FSZXBvcnRBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYVZvYVJlcG9ydEFjY291bnRCYWxhbmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXM7XG4gICAgLyoqXG4gICAgICogVGhlIGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzbHkgc3VibWl0dGVkIHZhbGlkIGRpc3B1dGUgc3RhdGVtZW50cyBieSB0aGUgY29uc3VtZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29uc3VtZXJEaXNwdXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGNvbnN1bWVyX2Rpc3B1dGVzOiBBcnJheTxDb25zdW1lckRpc3B1dGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIHJlcG9ydCBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFWb2FSZXBvcnRUcmFuc2FjdGlvbnNJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19pbnNpZ2h0czogQ3JhVm9hUmVwb3J0VHJhbnNhY3Rpb25zSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZTogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogQmFzZVJlcG9ydEludmVzdG1lbnRzIHwgbnVsbDtcbn1cbi8qKlxuICogVk9BIFJlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XFwncyBiYWxhbmNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBsaW1pdGAgbGVzcyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UsIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgY3VycmVudGAgYmFsYW5jZSBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdmVyZHJhZnQgbGltaXQuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWwtdGltZSB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIGBjdXJyZW50YCBpcyBgbnVsbGAgdGhpcyBmaWVsZCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuICBBdmFpbGFibGUgZm9yIGBjcmVkaXRgIGFuZCBgZGVwb3NpdG9yeWAgdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhVm9hUmVwb3J0QWNjb3VudEhpc3RvcmljYWxCYWxhbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8Q3JhVm9hUmVwb3J0QWNjb3VudEhpc3RvcmljYWxCYWxhbmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50IG92ZXIgdGhlIGxhc3QgMzAgZGF5cy4gQ2FsY3VsYXRlZCB1c2luZyB0aGUgZGVyaXZlZCBoaXN0b3JpY2FsIGJhbGFuY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZV8zMF9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQgb3ZlciB0aGUgbGFzdCA2MCBkYXlzLiBDYWxjdWxhdGVkIHVzaW5nIHRoZSBkZXJpdmVkIGhpc3RvcmljYWwgYmFsYW5jZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZlcmFnZV9iYWxhbmNlXzYwX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXQgTlNGIGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIHRpbWUgcmFuZ2UgZm9yIHRoZSByZXBvcnQgaW4gdGhlIGdpdmVuIGFjY291bnQgKG5vdCBjb3VudGluZyBhbnkgZmVlcyB0aGF0IHdlcmUgcmV2ZXJzZWQgd2l0aGluIHRoZSB0aW1lIHJhbmdlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYmFsYW5jZSBoZWxkIGJ5IGFuIGFjY291bnQgaW4gdGhlIHBhc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZvYVJlcG9ydEFjY291bnRIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZvYVJlcG9ydEFjY291bnRIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudCwgY2FsY3VsYXRlZCBmcm9tIHRoZSBgY3VycmVudGAgYmFsYW5jZSBpbiB0aGUgYGJhbGFuY2VgIG9iamVjdCBieSBzdWJ0cmFjdGluZyBpbmZsb3dzIGFuZCBhZGRpbmcgYmFjayBvdXRmbG93cyBhY2NvcmRpbmcgdG8gdGhlIHBvc3RlZCBkYXRlIG9mIGVhY2ggdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QWNjb3VudEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBjYWxjdWxhdGVkIGhpc3RvcmljYWwgYmFsYW5jZSwgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50SGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRBY2NvdW50SGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEFjY291bnRIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQXR0cmlidXRlcyBmb3IgdGhlIFZPQSByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVZvYVJlcG9ydEF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWb2FSZXBvcnRBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxSZXBvcnRJbmZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50OiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50OiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQgfCBudWxsO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGEgVk9BIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0SXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVZvYVJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgZWFjaCBvZiB0aGUgYWNjb3VudHMgb3BlbiBvbiB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhVm9hUmVwb3J0QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8Q3JhVm9hUmVwb3J0QWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVfdGltZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVm9hUmVwb3J0VHJhbnNhY3Rpb25zSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFWb2FSZXBvcnRUcmFuc2FjdGlvbnNJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyYVZvYVJlcG9ydFRyYW5zYWN0aW9uc0luc2lnaHRzXG4gICAgICovXG4gICAgYWxsX3RyYW5zYWN0aW9uczogQXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IHRpbWVmcmFtZSBwcm92aWRlZCBieSB0aGUgRkksIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVm9hUmVwb3J0VHJhbnNhY3Rpb25zSW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgdGltZWZyYW1lIHByb3ZpZGVkIGJ5IHRoZSBGSSwgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFWb2FSZXBvcnRUcmFuc2FjdGlvbnNJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIDEwOTkgdGF4IGZvcm1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTkge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9ybTEwOTlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZm9ybV8xMDk5X3R5cGU/OiBGb3JtMTA5OVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBDcmVkaXQxMDk5UmVjaXBpZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5UGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcj86IENyZWRpdDEwOTlQYXllcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OUZpbGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlsZXI/OiBDcmVkaXQxMDk5RmlsZXI7XG4gICAgLyoqXG4gICAgICogVGF4IHllYXIgb2YgdGhlIHRheCBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIHJlbnQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcm95YWx0aWVzIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByb3lhbHRpZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBvdGhlciBpbmNvbWUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG90aGVyX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBmaXNoaW5nIGJvYXQgcHJvY2VlZHMgZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlzaGluZ19ib2F0X3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbWVkaWNhbCBhbmQgaGVhbHRoY2FyZSBwYXltZW50cyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtZWRpY2FsX2FuZF9oZWFsdGhjYXJlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygbm9uZW1wbG95ZWUgY29tcGVuc2F0aW9uIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vbmVtcGxveWVlX2NvbXBlbnNhdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN1YnN0aXR1dGUgcGF5bWVudHMgbWFkZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3Vic3RpdHV0ZV9wYXltZW50c19pbl9saWV1X29mX2RpdmlkZW5kc19vcl9pbnRlcmVzdD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgcGF5ZXIgbWFkZSBkaXJlY3Qgc2FsZXMgb3ZlciAkNTAwMCBvZiBjb25zdW1lciBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfbWFkZV9kaXJlY3Rfc2FsZXNfb2ZfNTAwMF9vcl9tb3JlX29mX2NvbnN1bWVyX3Byb2R1Y3RzX3RvX2J1eWVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgY3JvcCBpbnN1cmFuY2UgcHJvY2VlZHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGNyb3BfaW5zdXJhbmNlX3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ29sZGVuIHBhcmFjaHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBleGNlc3NfZ29sZGVuX3BhcmFjaHV0ZV9wYXltZW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGdyb3NzIHByb2NlZWRzIHBhaWQgdG8gYW4gYXR0b3JuZXkgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX3Byb2NlZWRzX3BhaWRfdG9fYW5fYXR0b3JuZXk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGRlZmVycmFscyBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9kZWZlcnJhbHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGluY29tZSBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBzdGF0ZSB0YXggd2l0aGhlbGQgb2YgcGF5ZXIgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV90YXhfd2l0aGhlbGRfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9zdGF0ZV9udW1iZXJfbG93ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgcmVwb3J0ZWQgZm9yIHNlY29uZGFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX2xvd2VyPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgdGhlIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkIFBheW1lbnQgY2FyZCBUaGlyZCBwYXJ0eSBuZXR3b3JrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19yZXBvcnRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgUFNFIChQYXltZW50IFNldHRsZW1lbnQgRW50aXR5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHNlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCAoWFhYKSBYWFgtWFhYWC4gUGhvbmUgbnVtYmVyIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgYW1vdW50IHJlcG9ydGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBncm9zc19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBjYXJkIG5vdCBwcmVzZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY2FyZF9ub3RfcHJlc2VudF90cmFuc2FjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lcmNoYW50X2NhdGVnb3J5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwYXltZW50IHRyYW5zYWN0aW9ucyBtYWRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfcGF5bWVudF90cmFuc2FjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSmFudWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgamFudWFyeV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgRmVicnVhcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlYnJ1YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXJjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWFyY2hfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEFwcmlsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhcHJpbF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTWF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bmVfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bHlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEF1Z3VzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgYXVndXN0X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBTZXB0ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlcHRlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgT2N0b2Jlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb2N0b2Jlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTm92ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vdmVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBEZWNlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZGVjZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIG9mIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSB0YXggcmVwb3J0ZWQgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlciB1c2VkIGJ5IDEwOTktSyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkOiBQYXltZW50IFNldHRsZW1lbnQgRW50aXR5IChQU0UpLCBFbGVjdHJvbmljIFBheW1lbnQgRmFjaWxpdGF0b3IgKEVQRiksIE90aGVyIFRoaXJkIFBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBwYXllciB1c2VkIGJ5IDEwOTktTUlTQyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbGVwaG9uZSBudW1iZXIgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZWNpcGllbnQgdXNlZCBpbiBib3RoIDEwOTktSyBhbmQgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRheCBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIG9mIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgRkFUQ0EgaXMgYSBmaWxpbmcgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZhY3RhX2ZpbGluZ19yZXF1aXJlbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2hlY2tlZCBpZiAybmQgVElOIGV4aXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgc2Vjb25kX3Rpbl9leGlzdHM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSB0cmFuc2Zlci4gUmVxdWlyZWQgZm9yIHRyYW5zZmVycyBvbiBhbiBBQ0ggbmV0d29yay4gIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIFRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIuIEF1dGhvcml6YXRpb24gd2FzIG9idGFpbmVkIGluIHdyaXRpbmcgZWl0aGVyIGluIHBlcnNvbiBvciB2aWEgYW4gZWxlY3Ryb25pYyBkb2N1bWVudCBzaWduaW5nLCBlLmcuIERvY3VzaWduLCBieSB0aGUgY29uc3VtZXIuIENhbiBiZSB1c2VkIGZvciBjcmVkaXRzIG9yIGRlYml0cy4gIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkuIFRoZSB0cmFuc2ZlciBkZWJpdHMgYSBjb25zdW1lclxcJ3MgYmFuayBhY2NvdW50LiBBdXRob3JpemF0aW9uIGZyb20gdGhlIGNvbnN1bWVyIGlzIG9idGFpbmVkIG92ZXIgdGhlIEludGVybmV0IChlLmcuIGEgd2ViIG9yIG1vYmlsZSBhcHBsaWNhdGlvbikuIENhbiBiZSB1c2VkIGZvciBzaW5nbGUgZGViaXRzIG9yIHJlY3VycmluZyBkZWJpdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRBQ0hDbGFzcyB7XG4gICAgQ2NkID0gJ2NjZCcsXG4gICAgUHBkID0gJ3BwZCcsXG4gICAgV2ViID0gJ3dlYidcbn1cblxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBjcmVkaXQgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1jcmVkaXQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QWNjb3VudFN1YnR5cGUge1xuICAgIENyZWRpdENhcmQgPSAnY3JlZGl0IGNhcmQnLFxuICAgIFBheXBhbCA9ICdwYXlwYWwnLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogVGhpcyBjb250YWlucyBhbiBhbW91bnQsIGRlbm9taW5hdGVkIGluIHRoZSBjdXJyZW5jeSBzcGVjaWZpZWQgYnkgZWl0aGVyIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5IHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHJlcG9ydCB0b2tlbnM7IGNhbiBpbmNsdWRlIGF0IG1vc3Qgb25lIFZPQS9zdGFuZGFyZCBBc3NldCBSZXBvcnQgdG9rZW5zIGFuZCBvbmUgVk9FIEFzc2V0IFJlcG9ydCBUb2tlbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IsIHdoaWNoIGFsbG93cyB0aGVtIHRvIGZldGNoIHRoZSBBc3NldCBSZXBvcnRzIGF0dGFjaGVkIHRvIHRoZSB0b2tlbi4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgeW91IHdvdWxkIGxpa2UgdG8gdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0b2tlbnMgd2hpY2ggdGhlIHNwZWNpZmllZCBBdWRpdCBDb3B5IFRva2VuIHdpbGwgYmUgdXBkYXRlZCB3aXRoLiBUaGUgdHlwZXMgb2YgdG9rZW4gc3VwcG9ydGVkIGFyZSBhc3NldCByZXBvcnQgdG9rZW4gYW5kIGVtcGxveW1lbnQgcmVwb3J0IHRva2VuLiBUaGVyZSBjYW4gYmUgYXQgbW9zdCAxIG9mIGVhY2ggdG9rZW4gdHlwZSBpbiB0aGUgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90b2tlbnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0aGUgYmFuayBlbXBsb3ltZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYmFuayBlbXBsb3ltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRCYW5rRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vc3QgcmVjZW50IGRlcG9zaXQgZnJvbSB0aGlzIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgbGF0ZXN0X2RlcG9zaXRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBkZXBvc2l0IGZyb20gdGhpcyBlbXBsb3llciBmcm9tIHdpdGhpbiB0aGUgcGVyaW9kIG9mIHRoZSBkYXlzIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGVhcmxpZXN0X2RlcG9zaXRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBCYW5rIEVtcGxveW1lbnQgZGF0YS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgd2lsbCBiZSBhIGRpc3RpbmN0IGJhbmsgZW1wbG95bWVudCByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYmFuayBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIEl0ZW0uIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgZGlmZmVyZW50IGVtcGxveWVyIGZvdW5kLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudHM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgRW1wbG95bWVudCBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+O1xufVxuLyoqXG4gKiBUaGUgcmVwb3J0IG9mIHRoZSBCYW5rIEVtcGxveW1lbnQgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydCB3YXMgZ2VuZXJhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgSXRlbXMgaW4gdGhlIHJlcG9ydCBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgQmFuayBFbXBsb3ltZW50IHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlIGZvciB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDcmVkaXRCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIHR5cGUgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEJBTktfRU1QTE9ZTUVOVF9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGUge1xuICAgIEJhbmtFbXBsb3ltZW50V2FybmluZyA9ICdCQU5LX0VNUExPWU1FTlRfV0FSTklORydcbn1cblxuLyoqXG4gKiBUaGUgcmVwb3J0IG9mIHRoZSBCYW5rIEluY29tZSBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgcmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz47XG59XG4vKipcbiAqIFRoZSBJdGVtXFwncyBiYW5rIGFjY291bnRzIHRoYXQgaGF2ZSB0aGUgc2VsZWN0ZWQgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogVGhlIGFjY291bnQgdHlwZS4gVGhpcyB3aWxsIGFsd2F5cyBiZSBgZGVwb3NpdG9yeWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGUge1xuICAgIERlcG9zaXRvcnkgPSAnZGVwb3NpdG9yeSdcbn1cblxuLyoqXG4gKiBUaGUgaW5jb21lIGNhdGVnb3J5LiBgQkFOS19JTlRFUkVTVGA6IEludGVyZXN0IGVhcm5lZCBmcm9tIGEgYmFuayBhY2NvdW50LiBgQkVORUZJVF9PVEhFUmA6IEdvdmVybm1lbnQgYmVuZWZpdHMgb3RoZXIgdGhhbiByZXRpcmVtZW50LCB1bmVtcGxveW1lbnQsIGNoaWxkIHN1cHBvcnQsIG9yIGRpc2FiaWxpdHkuIEN1cnJlbnRseSB1c2VkIG9ubHkgaW4gdGhlIFVLLCB0byByZXByZXNlbnQgYmVuZWZpdHMgc3VjaCBhcyBDb3N0IG9mIExpdmluZyBQYXltZW50cy4gYENBU0hgOiBEZXByZWNhdGVkIGFuZCB1c2VkIG9ubHkgZm9yIGV4aXN0aW5nIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbnMuIEhhcyBiZWVuIHJlcGxhY2VkIGJ5IGBDQVNIX0RFUE9TSVRgIGFuZCBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmAuIGBDQVNIX0RFUE9TSVRgOiBBIGNhc2ggb3IgY2hlY2sgZGVwb3NpdC4gYENISUxEX1NVUFBPUlRgOiBDaGlsZCBzdXBwb3J0IHBheW1lbnRzIHJlY2VpdmVkLiBgR0lHX0VDT05PTVlgOiBJbmNvbWUgZWFybmVkIGFzIGEgZ2lnIGVjb25vbXkgd29ya2VyLCBlLmcuIGRyaXZpbmcgZm9yIFViZXIsIEx5ZnQsIFBvc3RtYXRlcywgRG9vckRhc2gsIGV0Yy4gYExPTkdfVEVSTV9ESVNBQklMSVRZYDogRGlzYWJpbGl0eSBwYXltZW50cywgaW5jbHVkaW5nIFNvY2lhbCBTZWN1cml0eSBkaXNhYmlsaXR5IGJlbmVmaXRzLiBgT1RIRVJgOiBJbmNvbWUgdGhhdCBjb3VsZCBub3QgYmUgY2F0ZWdvcml6ZWQgYXMgYW55IG90aGVyIGluY29tZSBjYXRlZ29yeS4gYE1JTElUQVJZYDogVmV0ZXJhbnMgYmVuZWZpdHMuIEluY29tZSBlYXJuZWQgYXMgc2FsYXJ5IGZvciBzZXJ2aW5nIGluIHRoZSBtaWxpdGFyeSAoZS5nLiB0aHJvdWdoIERGQVMpIHdpbGwgYmUgY2xhc3NpZmllZCBhcyBgU0FMQVJZYCByYXRoZXIgdGhhbiBgTUlMSVRBUllgLiBgUkVOVEFMYDogSW5jb21lIGVhcm5lZCBmcm9tIGEgcmVudGFsIHByb3BlcnR5LiBJbmNvbWUgbWF5IGJlIGlkZW50aWZpZWQgYXMgcmVudGFsIHdoZW4gdGhlIHBheW1lbnQgaXMgcmVjZWl2ZWQgdGhyb3VnaCBhIHJlbnRhbCBwbGF0Zm9ybSwgZS5nLiBBaXJibmI7IHJlbnQgcGFpZCBkaXJlY3RseSBieSB0aGUgdGVuYW50IHRvIHRoZSBwcm9wZXJ0eSBvd25lciAoZS5nLiB2aWEgY2FzaCwgY2hlY2ssIG9yIEFDSCkgd2lsbCB0eXBpY2FsbHkgbm90IGJlIGNsYXNzaWZpZWQgYXMgcmVudGFsIGluY29tZS4gYFJFVElSRU1FTlRgOiBQYXltZW50cyBmcm9tIHByaXZhdGUgcmV0aXJlbWVudCBzeXN0ZW1zLCBwZW5zaW9ucywgYW5kIGdvdmVybm1lbnQgcmV0aXJlbWVudCBwcm9ncmFtcywgaW5jbHVkaW5nIFNvY2lhbCBTZWN1cml0eSByZXRpcmVtZW50IGJlbmVmaXRzLiBgU0FMQVJZYDogUGF5bWVudCBmcm9tIGFuIGVtcGxveWVyIHRvIGFuIGVhcm5lciBvciBvdGhlciBmb3JtIG9mIHBlcm1hbmVudCBlbXBsb3ltZW50LiBgVEFYX1JFRlVORGA6IEEgdGF4IHJlZnVuZC4gYFRSQU5TRkVSX0ZST01fQVBQTElDQVRJT05gOiBEZXBvc2l0cyBmcm9tIGEgbW9uZXkgdHJhbnNmZXIgYXBwLCBzdWNoIGFzIFZlbm1vLCBDYXNoIEFwcCwgb3IgWmVsbGUuIGBVTkVNUExPWU1FTlRgOiBVbmVtcGxveW1lbnQgYmVuZWZpdHMuIEluIHRoZSBVSywgaW5jbHVkZXMgY2VydGFpbiBsb3ctaW5jb21lIGJlbmVmaXRzIHN1Y2ggYXMgdGhlIFVuaXZlcnNhbCBDcmVkaXQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnkge1xuICAgIFNhbGFyeSA9ICdTQUxBUlknLFxuICAgIFVuZW1wbG95bWVudCA9ICdVTkVNUExPWU1FTlQnLFxuICAgIENhc2ggPSAnQ0FTSCcsXG4gICAgR2lnRWNvbm9teSA9ICdHSUdfRUNPTk9NWScsXG4gICAgUmVudGFsID0gJ1JFTlRBTCcsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NISUxEX1NVUFBPUlQnLFxuICAgIE1pbGl0YXJ5ID0gJ01JTElUQVJZJyxcbiAgICBSZXRpcmVtZW50ID0gJ1JFVElSRU1FTlQnLFxuICAgIExvbmdUZXJtRGlzYWJpbGl0eSA9ICdMT05HX1RFUk1fRElTQUJJTElUWScsXG4gICAgQmFua0ludGVyZXN0ID0gJ0JBTktfSU5URVJFU1QnLFxuICAgIENhc2hEZXBvc2l0ID0gJ0NBU0hfREVQT1NJVCcsXG4gICAgVHJhbnNmZXJGcm9tQXBwbGljYXRpb24gPSAnVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTicsXG4gICAgVGF4UmVmdW5kID0gJ1RBWF9SRUZVTkQnLFxuICAgIEJlbmVmaXRPdGhlciA9ICdCRU5FRklUX09USEVSJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUNhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogQ3JlZGl0QmFua0luY29tZUVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBFcnJvciBmaWVsZHMgd2lsbCBiZSBgbnVsbGAgaWYgbm8gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gbnVsbCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2FybmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZUVycm9yVHlwZSB7XG4gICAgSW50ZXJuYWxTZXJ2ZXJFcnJvciA9ICdJTlRFUk5BTF9TRVJWRVJfRVJST1InLFxuICAgIEluc3VmZmljaWVudENyZWRlbnRpYWxzID0gJ0lOU1VGRklDSUVOVF9DUkVERU5USUFMUycsXG4gICAgSXRlbUxvY2tlZCA9ICdJVEVNX0xPQ0tFRCcsXG4gICAgVXNlclNldHVwUmVxdWlyZWQgPSAnVVNFUl9TRVRVUF9SRVFVSVJFRCcsXG4gICAgQ291bnRyeU5vdFN1cHBvcnRlZCA9ICdDT1VOVFJZX05PVF9TVVBQT1JURUQnLFxuICAgIEluc3RpdHV0aW9uRG93biA9ICdJTlNUSVRVVElPTl9ET1dOJyxcbiAgICBJbnN0aXR1dGlvbk5vTG9uZ2VyU3VwcG9ydGVkID0gJ0lOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURUQnLFxuICAgIEluc3RpdHV0aW9uTm90UmVzcG9uZGluZyA9ICdJTlNUSVRVVElPTl9OT1RfUkVTUE9ORElORycsXG4gICAgSW52YWxpZENyZWRlbnRpYWxzID0gJ0lOVkFMSURfQ1JFREVOVElBTFMnLFxuICAgIEludmFsaWRNZmEgPSAnSU5WQUxJRF9NRkEnLFxuICAgIEludmFsaWRTZW5kTWV0aG9kID0gJ0lOVkFMSURfU0VORF9NRVRIT0QnLFxuICAgIEl0ZW1Mb2dpblJlcXVpcmVkID0gJ0lURU1fTE9HSU5fUkVRVUlSRUQnLFxuICAgIE1mYU5vdFN1cHBvcnRlZCA9ICdNRkFfTk9UX1NVUFBPUlRFRCcsXG4gICAgTm9BY2NvdW50cyA9ICdOT19BQ0NPVU5UUycsXG4gICAgSXRlbU5vdFN1cHBvcnRlZCA9ICdJVEVNX05PVF9TVVBQT1JURUQnLFxuICAgIEFjY2Vzc05vdEdyYW50ZWQgPSAnQUNDRVNTX05PVF9HUkFOVEVEJ1xufVxuXG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IEJhbmsgSW5jb21lIFJlcG9ydHMgc2hvdWxkIGJlIGZldGNoZWQuIE11bHRpcGxlIHJlcG9ydHMgbWF5IGJlIGF2YWlsYWJsZSBpZiB0aGUgcmVwb3J0IGhhcyBiZWVuIHJlLWNyZWF0ZWQgb3IgcmVmcmVzaGVkLiBJZiBtb3JlIHRoYW4gb25lIHJlcG9ydCBpcyBhdmFpbGFibGUsIHRoZSBtb3N0IHJlY2VudCByZXBvcnRzIHdpbGwgYmUgcmV0dXJuZWQgZmlyc3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVuZCB1c2VyXFwncyBtb250aGx5IHN1bW1hcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBtYXkgcmV0dXJuIGFuIGluY29ycmVjdCB2YWx1ZSBpZiB0aGUgc3VtbWFyeSBpbmNsdWRlcyBpbmNvbWUgc291cmNlcyBpbiBtdWx0aXBsZSBjdXJyZW5jaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1pdGVtcy1iYW5rLWluY29tZS1zb3VyY2VzLWhpc3RvcmljYWwtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKSBvZiB0aGUgdXNlciBmb3IgdGhlIG1vbnRoIGluIHRoZSBzdW1tYXJ5LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHBlcmlvZCBjb3ZlcmVkIGluIHRoaXMgbW9udGhseSBzdW1tYXJ5LiBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGJlZ2luIHdpdGggdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgcGVyaW9kIGluY2x1ZGVkIGluIHRoaXMgbW9udGhseSBzdW1tYXJ5LiBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGxhc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBlbmQgd2l0aCB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBJbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2FjY291bnRzPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT47XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluY29tZSBwYXkgZnJlcXVlbmN5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeSB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZXF1ZXN0IG9wdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBkYXlzIG9mIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgcmVmcmVzaC4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRheXMgcmVxdWVzdGVkIGluIHRoZSBtb3N0IHJlY2VudGx5IGdlbmVyYXRlZCBiYW5rIGluY29tZSByZXBvcnQgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0aGUgaW5jb21lIHNvdXJjZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIG5hbWUgb3Igb3JpZ2luYWwgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGluY29tZSB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3J5PzogQ3JlZGl0QmFua0luY29tZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlcyBpbiB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlcyBpbiB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IENyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlIGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBmb3IgdGhlIGluY29tZSBzb3VyY2Ugd2l0aGluIHRoZSBzdGFydCBhbmQgZW5kIGRhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgYmFuayBpbmNvbWUgYWNyb3NzIGFsbCBpbmNvbWUgc291cmNlcyBhbmQgaXRlbXMgKG1heCBoaXN0b3J5IG9mIDczMCBkYXlzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIG1heSByZXR1cm4gYW4gaW5jb3JyZWN0IHZhbHVlIGlmIHRoZSBzdW1tYXJ5IGluY2x1ZGVzIGluY29tZSBzb3VyY2VzIGluIG11bHRpcGxlIGN1cnJlbmNpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgYWNyb3NzIGFsbCB0aGUgaW5jb21lIHNvdXJjZXMgaW4gdGhlIGVuZCB1c2VyXFwncyBJdGVtcyBmb3IgdGhlIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIHdpdGhpbiB0aGUgZGF5cyByZXF1ZXN0ZWQgaW4gd2hpY2ggYWxsIGluY29tZSBzb3VyY2VzIGlkZW50aWZpZWQgYnkgUGxhaWQgYXBwZWFyIGluIGEgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgaW4gd2hpY2ggYWxsIGluY29tZSBzb3VyY2VzIGlkZW50aWZpZWQgYnkgUGxhaWQgYXBwZWFyIGluIHRoZSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHNvdXJjZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBjYXRlZ29yaWVzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yaWVzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgdHJhbnNhY3Rpb25zIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV90cmFuc2FjdGlvbnNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U/OiBDcmVkaXRCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYElERU5USVRZX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgaWRlbnRpdHkgZm9yIHRoZSBJdGVtIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCB0cmFuc2FjdGlvbnMgZm9yIHRoZSBJdGVtIGBJVEVNX1VOQVBQUk9WRURgOiBVc2VyIGV4aXRlZCBmbG93IGJlZm9yZSBnaXZpbmcgcGVybWlzc2lvbiB0byBzaGFyZSBkYXRhIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIEl0ZW1VbmFwcHJvdmVkID0gJ0lURU1fVU5BUFBST1ZFRCcsXG4gICAgUmVwb3J0RGVsZXRlZCA9ICdSRVBPUlRfREVMRVRFRCcsXG4gICAgRGF0YVVuYXZhaWxhYmxlID0gJ0RBVEFfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogVGhlIHdhcm5pbmcgdHlwZSB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFOS19JTkNPTUVfV0FSTklOR2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGUge1xuICAgIEJhbmtJbmNvbWVXYXJuaW5nID0gJ0JBTktfSU5DT01FX1dBUk5JTkcnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2FjdGl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVpciBpbmNvbWUgY2hhbmdlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmFibGVfd2ViaG9va3M6IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgb3duZXIgb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB1c2VyXFwncyBiYW5rIGFjY291bnQgcmVsYXRlZCB0byBhbiB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBlcmlvZCBvYmplY3RzLCBjb250YWluaW5nIG1vcmUgZGF0YSBvbiB0aGUgb3ZlcmFsbCBwZXJpb2Qgb2YgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcGVyaW9kczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBiYW5rIGFjY291bnQgZm9yIHRoZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kaW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHN0YXRlbWVudCB1cGxvYWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdCB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoYXQgbW9uZXkgbW92ZWQgaW50byB0aGUgYWNjb3VudCAoc3VjaCBhcyBhIHBheWNoZWNrIGJlaW5nIGRlcG9zaXRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBtYWRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gYXMgaXQgYXBwZWFycyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgYmFuayBhY2NvdW50IHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnMgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB3aG9zZSBiYW5rIHN0YXRlbWVudHMgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjcmVkaXQgY2FyZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFyaW91cyBpbnRlcmVzdCByYXRlcyB0aGF0IGFwcGx5IHRvIHRoZSBhY2NvdW50LiBBUFIgaW5mb3JtYXRpb24gaXMgbm90IHByb3ZpZGVkIGJ5IGFsbCBjYXJkIGlzc3VlcnM7IGlmIEFQUiBkYXRhIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QVBSPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFwcnM6IEFycmF5PEFQUj47XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiBhIHBheW1lbnQgaXMgY3VycmVudGx5IG92ZXJkdWUuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG93ZWQgYXMgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IGlzc3VlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBjcmVkaXQgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgY3N2IGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIGNyZWRpdCBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBQQVlTVFVCYDogQSBwYXlzdHViLiAgYEJBTktfU1RBVEVNRU5UYDogQSBiYW5rIHN0YXRlbWVudC4gIGBVU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYFVTX1RBWF8xMDk5X01JU0NgOiBBIDEwOTktTUlTQyB0YXggZm9ybSByZXBvcnRpbmcgbWlzY2VsbGFuZW91cyBpbmNvbWUuICBgVVNfVEFYXzEwOTlfS2A6IEEgMTA5OS1LIHRheCBmb3JtIHJlcG9ydGluZyBwYXltZW50IGNhcmQgYW5kIHRoaXJkLXBhcnR5IG5ldHdvcmsgdHJhbnNhY3Rpb25zLiAgYFVTX1NUVURFTlRfSTIwYDogQSBDZXJ0aWZpY2F0ZSBvZiBFbGlnaWJpbGl0eSBmb3IgTm9uaW1taWdyYW50IFN0dWRlbnQgU3RhdHVzIChGb3JtIEktMjApIGlzc3VlZCBieSBhIFVTIHNjaG9vbC4gIGBVU19NSUxJVEFSWV9FUkFTYDogQW4gZWxlY3Ryb25pYyBSZXRpcmVtZW50IEFjY291bnQgU3RhdGVtZW50IChlUkFTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYFVTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYFVTX01JTElUQVJZX0NMRVNgOiBBIENpdmlsaWFuIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0ZW1lbnQgKENMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgR0lHYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbmNvbWUgaXMgcmVsYXRlZCB0byBnaWcgd29yay4gRG9lcyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljIGRvY3VtZW50IHR5cGUuICBgUExBSURfR0VORVJBVEVEX1BBWVNUVUJfUERGYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBQREYgZm9yIHRoZSBwYXlzdHViIHdhcyBnZW5lcmF0ZWQgYnkgUGxhaWQuICBgTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBVTktOT1dOYDogRG9jdW1lbnQgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZG9jdW1lbnRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTaWduZWQgVVJMIHRvIHJldHJpZXZlIHRoZSBkb2N1bWVudChzKS4gVGhlIHBheWxvYWQgd2lsbCBiZSBhIC56aXAgZmlsZSBjb250YWluaW5nIHRoZSBkb2N1bWVudChzKS4gIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIGZpbGUgdHlwZSBvZiB0aGUgZG9jdW1lbnRzIHdpbGwgYWx3YXlzIGJlIFBERiwgYW5kIHRoZSBkb2N1bWVudHMgbWF5IG5vdCBiZSBhdmFpbGFibGUsIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkIHdpbGwgYmUgYG51bGxgLiBJZiB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBnZW5lcmF0ZSBhIFBERiBpZiB0aGUgb3JpZ2luYWwgaXMgbm90IGF2YWlsYWJsZSwgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci4gW0V4YW1wbGUgZ2VuZXJhdGVkIHBheSBzdHViXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvcGxhaWQtZ2VuZXJhdGVkLW1vY2stcGF5c3R1Yi5wZGYpLiAgRm9yIERvY3VtZW50IEluY29tZSwgdGhpcyBmaWVsZCB3aWxsIG5vdCBiZSBgbnVsbGAsIGFuZCB0aGUgZmlsZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50KHMpIHdpbGwgYmUgdGhlIG9yaWdpbmFsIGZpbGUgdHlwZSB1cGxvYWRlZCBieSB0aGUgdXNlci4gRm9yIG1vcmUgZGV0YWlscyBvbiBhdmFpbGFibGUgZmlsZSB0eXBlcywgc2VlIHRoZSBbRG9jdW1lbnQgSW5jb21lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2luY29tZS9kb2N1bWVudC1pbmNvbWUpIGRvY3VtZW50YXRpb24uICBUaGlzIGRvd25sb2FkIFVSTCBjYW4gb25seSBiZSB1c2VkIG9uY2UgYW5kIGV4cGlyZXMgYWZ0ZXIgdHdvIG1pbnV0ZXMuIFRvIGdlbmVyYXRlIGEgbmV3IGRvd25sb2FkIFVSTCwgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGFnYWluLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb3dubG9hZF91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYWdlcyBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQgKGlmIGF2YWlsYWJsZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHBhZ2VfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gd2h5IGEgZmFpbHVyZSBvY2N1cnJlZCBkdXJpbmcgZG9jdW1lbnQgcHJvY2Vzc2luZyAoaWYgYXZhaWxhYmxlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZW1wbG95bWVudCBpdGVtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RW1wbG95bWVudEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JlZGl0RW1wbG95bWVudEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBlbXBsb3ltZW50IGl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRzOiBBcnJheTxDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUb2tlbiB0byByZXByZXNlbnQgdGhlIHVuZGVybHlpbmcgRW1wbG95bWVudCBkYXRhXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X3JlcG9ydF90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIHByb29mIG9mIGVtcGxveW1lbnQgZGF0YSBmb3IgYW4gaW5kaXZpZHVhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3VycmVudCBlbXBsb3ltZW50IHN0YXR1cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXJ0IG9mIGVtcGxveW1lbnQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmQgb2YgZW1wbG95bWVudCwgaWYgYXBwbGljYWJsZS4gUHJvdmlkZWQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0aXRsZSBvZiBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBsYXRmb3JtSWRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGxhdGZvcm1faWRzOiBDcmVkaXRQbGF0Zm9ybUlkcztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBlbXBsb3ltZW50IGZvciB0aGUgaW5kaXZpZHVhbC4gYFxcXCJGVUxMX1RJTUVcXFwiYDogQSBmdWxsLXRpbWUgZW1wbG95ZWUuIGBcXFwiUEFSVF9USU1FXFxcImA6IEEgcGFydC10aW1lIGVtcGxveWVlLiBgXFxcIkNPTlRSQUNUT1JcXFwiYDogQW4gZW1wbG95ZWUgdHlwaWNhbGx5IGhpcmVkIGV4dGVybmFsbHkgdGhyb3VnaCBhIGNvbnRyYWN0aW5nIGdyb3VwLiBgXFxcIlRFTVBPUkFSWVxcXCJgOiBBIHRlbXBvcmFyeSBlbXBsb3llZS4gYFxcXCJPVEhFUlxcXCJgOiBUaGUgZW1wbG95ZWUgdHlwZSBpcyBub3Qgb25lIG9mIHRoZSBhYm92ZSBkZWZpbmVkIHR5cGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbXBsb3llZV90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBlbXBsb3llZVxcJ3MgbW9zdCByZWNlbnQgcGF5c3R1YiBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBsYXN0X3BheXN0dWJfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGNyZWRpdGAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfREVUQUlMOiBBc3NldERldGFpbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRPd25lcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX09XTkVSUzogQXNzZXRPd25lcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0SG9sZGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRpbmdzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xESU5HUz86IEFzc2V0SG9sZGluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05TOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZhbGlkYXRpb25Tb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nLi4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFVEFJTDogQXNzZXRUcmFuc2FjdGlvbkRldGFpbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTjogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRzIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAgICAgKi9cbiAgICBBU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIEZpcnN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWlkZGxlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTWlkZGxlTmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycztcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIGxvYW4uIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBcXFwiU3ViamVjdExvYW5cXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2FuXG4gICAgICovXG4gICAgTG9hblJvbGVUeXBlOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbGxlY3Rpb24gb2YgY3VycmVudCBhbmQgcHJldmlvdXMgaWRlbnRpZmllcnMgZm9yIHRoaXMgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxMb2FuSWRlbnRpZmllcj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnNcbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVI6IEFycmF5PExvYW5JZGVudGlmaWVyPjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGxvYW5zIHRoYXQgYXJlIHBhcnQgb2YgYSBzaW5nbGUgZGVhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0xvYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2Fuc1xuICAgICAqL1xuICAgIExPQU46IENyZWRpdEZyZWRkaWVNYWNMb2FuO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlZmluZSBzcGVjaWZpYyBwYXJ0aWVzIHRvIGEgZGVhbC4gVGhpcyBpbmNsdWRlcyB0aGUgZGlyZWN0IHBhcnRpY2lwYXRpbmcgcGFydGllcywgc3VjaCBhcyBib3Jyb3dlciBhbmQgc2VsbGVyIGFuZCB0aGUgaW5kaXJlY3QgcGFydGllcyBzdWNoIGFzIHRoZSBjcmVkaXQgcmVwb3J0IHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1BhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXNcbiAgICAgKi9cbiAgICBQQVJUWTogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1BhcnR5Pjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBhcnR5IHRvIGEgdHJhbnNhY3Rpb24uIEluY2x1ZGVzIGRpcmVjdCBwYXJ0aWNpcGFudHMgbGlrZSB0aGUgYm9ycm93ZXIgYW5kIHNlbGxlciBhcyB3ZWxsIGFzIGluZGlyZWN0IHBhcnRpY2lwYW50cyBzdWNoIGFzIHRoZSBmbG9vZCBjZXJ0aWZpY2F0ZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5XG4gICAgICovXG4gICAgSU5ESVZJRFVBTDogQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIFJPTEVTOiBSb2xlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5XG4gICAgICovXG4gICAgVEFYUEFZRVJfSURFTlRJRklFUlM6IFRheHBheWVySWRlbnRpZmllcnM7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWxcbiAgICAgKi9cbiAgICBOQU1FOiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWU7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydERhdGVUaW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJSZXBvcnRJRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0SWRlbnRpZmllclR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uUGFyZW50SWRlbnRpZmllcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvZnJlZGRpZV9tYWMvcmVwb3J0cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChWT0EpIHNjaGVtYSB2ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdGF0dXNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAgICAgKi9cbiAgICBTVEFUVVNFUzogU3RhdHVzZXM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVzY3JpYmUgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyBmb3Igc2VydmljZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXNcbiAgICAgKi9cbiAgICBTRVJWSUNFOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFJFUE9SVElOR19JTkZPUk1BVElPTjogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFNFUlZJQ0VfUFJPRFVDVF9GVUxGSUxMTUVOVDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2U7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjQXNzZXRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gICAgICovXG4gICAgQVNTRVRTOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIHNjaGVtYS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBMT0FOUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydGllc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFBBUlRJRVM6IENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBTRVJWSUNFUzogQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVuZCB1c2VyXFwncyBGb3JtIEktMjAgVVMgaW1taWdyYXRpb24gc3R1ZGVudCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0STIwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0STIwIHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEkyMFxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0STIwU3R1ZGVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0STIwXG4gICAgICovXG4gICAgc3R1ZGVudD86IENyZWRpdEkyMFN0dWRlbnQ7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHRoZSBzdHVkZW50XFwncyBwZXJzb25hbCBmdW5kcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBcbiAgICAgKi9cbiAgICBwZXJzb25hbF9mdW5kcz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZ1bmRzIGZyb20gb24tY2FtcHVzIGVtcGxveW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0STIwXG4gICAgICovXG4gICAgb25fY2FtcHVzX2VtcGxveW1lbnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBmdW5kcyBwcm92aWRlZCBieSB0aGUgaXNzdWluZyBzY2hvb2wuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0STIwXG4gICAgICovXG4gICAgZnVuZHNfZnJvbV90aGlzX3NjaG9vbD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byB0aGUgc3R1ZGVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBcbiAgICAgKi9cbiAgICBzdHVkZW50c19mdW5kaW5nX3RvdGFsPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZnVuZHMgZnJvbSBhbm90aGVyIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBcbiAgICAgKi9cbiAgICBmdW5kc19mcm9tX2Fub3RoZXJfc291cmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgdG90YWwgYXZlcmFnZSBjb3N0cyBmb3IgdGhlIHByb2dyYW0gcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEkyMFxuICAgICAqL1xuICAgIGVzdGltYXRlZF9hdmVyYWdlX2Nvc3RzX3RvdGFsPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgYXZlcmFnZSBsaXZpbmcgZXhwZW5zZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0STIwXG4gICAgICovXG4gICAgZXN0aW1hdGVkX2F2ZXJhZ2VfbGl2aW5nX2V4cGVuc2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgbW9udGhzIHRoZSBzdHVkZW50XFwncyBmdW5kaW5nIGNvdmVycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBcbiAgICAgKi9cbiAgICBzdHVkZW50c19mdW5kaW5nX3BlcmlvZF9tb250aHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBtb250aHMgdGhlIGVzdGltYXRlZCBhdmVyYWdlIGNvc3RzIGNvdmVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEkyMFxuICAgICAqL1xuICAgIGVzdGltYXRlZF9hdmVyYWdlX2Nvc3RzX3BlcmlvZF9tb250aHM/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdHVkZW50IG5hbWVkIG9uIGEgRm9ybSBJLTIwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRJMjBTdHVkZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0STIwU3R1ZGVudCB7XG4gICAgLyoqXG4gICAgICogR2l2ZW4gbmFtZSBvZiB0aGUgc3R1ZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBTdHVkZW50XG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3VybmFtZSBvciBwcmltYXJ5IG5hbWUgb2YgdGhlIHN0dWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0STIwU3R1ZGVudFxuICAgICAqL1xuICAgIHN1cm5hbWVfcHJpbWFyeV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBzdHVkZW50IGFzIGl0IGFwcGVhcnMgb24gdGhlaXIgcGFzc3BvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0STIwU3R1ZGVudFxuICAgICAqL1xuICAgIHBhc3Nwb3J0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByZWZlcnJlZCBuYW1lIG9mIHRoZSBzdHVkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEkyMFN0dWRlbnRcbiAgICAgKi9cbiAgICBwcmVmZXJyZWRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgc2Nob29sIGlzc3VpbmcgdGhlIEZvcm0gSS0yMC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBTdHVkZW50XG4gICAgICovXG4gICAgc2Nob29sX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXJ0IGRhdGUgb2YgdGhlIHByb2dyYW0gaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRJMjBTdHVkZW50XG4gICAgICovXG4gICAgcHJvZ3JhbV9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmQgZGF0ZSBvZiB0aGUgcHJvZ3JhbSBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEkyMFN0dWRlbnRcbiAgICAgKi9cbiAgICBwcm9ncmFtX2VuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbmQgdXNlclxcJ3MgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkRlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVhcm5pbmdzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZWFybmluZ3M6IENyZWRpdFBheVN0dWJFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IENyZWRpdFBheVN0dWJFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1Yk5ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IENyZWRpdFBheVN0dWJOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlTdHViUGF5UGVyaW9kRGV0YWlscztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw6IFBheVN0dWJEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCBhIGJyZWFrZG93biBvZiBlYXJuaW5ncyBvbiBhIHBheSBzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFYXJuaW5ncyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8UGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YkVhcm5pbmdzVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsOiBQYXlTdHViRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBvbmUgb2YgYFNJTkdMRWAsIGBNQVJSSUVEYCwgb3IgYE5PVCBMSVNURURgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViVGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ6IFBheVN0dWJUYXhwYXllcklEO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzczogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXkgc3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBleHBsaWNpdCBwYXkgYmFzaXMgb24gdGhlIHBheXN0dWIgKGlmIHByZXNlbnQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgSG91cmx5ID0gJ0hPVVJMWScsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJ1xufVxuXG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgd2hvc2UgcGF5cm9sbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZC4gRWFjaCBgaXRlbV9pZGAgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGF5cm9sbCBpbmNvbWUgaXRlbS4gSWYgdGhpcyBmaWVsZCBpcyBub3QgcHJvdmlkZWQsIGFsbCBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIGJvZHkgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcGF5cm9sbCBpdGVtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8UGF5cm9sbEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGFuYWx5c2lzIHRvIGVuYWJsZSBmb3IgdGhlIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWc6IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm99XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c19taWxpdGFyeV9pbmZvPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHBheXJvbGxfaW5zdGl0dXRpb24/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgdG8gYmUgcmVmcmVzaGVkLiBFYWNoIGBpdGVtX2lkYCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCBiZSByZWZyZXNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB3aGVyZSBQbGFpZCB3aWxsIHNlbmQgdGhlIHBheXJvbGwgaW5jb21lIHJlZnJlc2ggd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVVNFUl9QUkVTRU5DRV9SRVFVSVJFRFxcXCJgIFVzZXIgcHJlc2VuY2UgaXMgcmVxdWlyZWQgdG8gcmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uLiBgXFxcIlNVQ0NFU1NGVUxcXFwiYCBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoIHdhcyBzdWNjZXNzZnVsLiBgXFxcIk5PVF9GT1VORFxcXCJgIE5vIG5ldyBkYXRhIHdhcyBmb3VuZCBhZnRlciB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fcmVmcmVzaF9zdGF0dXM6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGEgc2V0IG9mIGlkcyByZWxhdGVkIHRvIGFuIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQbGF0Zm9ybUlkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBsYXRmb3JtSWRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgcGF5cm9sbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHJlcG9ydCB0b2tlbiBzdHJpbmdzLCB3aXRoIGF0IG1vc3Qgb25lIHRva2VuIG9mIGVhY2ggcmVwb3J0IHR5cGUuIEN1cnJlbnRseSBvbmx5IEFzc2V0IFJlcG9ydCB0b2tlbiBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90b2tlbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBzZWNvbmRhcnlfY2xpZW50X2lkYCBpcyB0aGUgY2xpZW50IGlkIG9mIHRoZSB0aGlyZCBwYXJ0eSB3aXRoIHdob20geW91IHdvdWxkIGxpa2UgdG8gc2hhcmUgdGhlIHJlbGF5IHRva2VuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY29uZGFyeV9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIHdlYmhvb2tzIHdoZW4gdGhlIFNlY29uZGFyeSBDbGllbnQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlcyBhbiBBc3NldCBSZXBvcnQgYnkgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IHRvIGFsbG93IHRoZW0gdG8gYWNjZXNzIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHJldHJpZXZlIHRoZSBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgYGZhbHNlYCBvdGhlcndpc2UuIFRoaXMgZmllbGQgZGVmYXVsdHMgdG8gYGZhbHNlYCBpZiBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNsdWRlX2luc2lnaHRzPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSByZXBvcnQgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBSZXBvcnRUeXBlO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyB3aGVuIHRoZSByZXBvcnQgb2YgYSByZWxheSB0b2tlbiBoYXMgYmVlbiByZWZyZXNoZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgcmVsYXkgdG9rZW4gd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgYW5kIHJlc3VsdHMgZm9yIGEgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBMaW5rIHNlc3Npb24uIFRoaXMgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBgbGlua19zZXNzaW9uX2lkYCByZXR1cm5lZCBpbiB0aGUgb25TdWNjZXNzL29uRXhpdCBjYWxsYmFja3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBMaW5rIHNlc3Npb24gc3RhcnRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBzZXNzaW9uX3N0YXJ0X3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25SZXN1bHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgcmVzdWx0cz86IENyZWRpdFNlc3Npb25SZXN1bHRzO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgZXJyb3JzIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25FcnJvcj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBlcnJvcnM/OiBBcnJheTxDcmVkaXRTZXNzaW9uRXJyb3I+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGJhbmsgZW1wbG95bWVudCB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgQmFuayBFbXBsb3ltZW50IExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBlbXBsb3ltZW50LiAgYE5PX0VNUExPWUVSU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGVtcGxveW1lbnQgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYEVNUExPWUVSX05PVF9MSVNURURgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZGlkIG5vdCBzZWUgdGhlaXIgY3VycmVudCBvciBwcmV2aW91cyBlbXBsb3llciBpbiB0aGUgbGlzdCBvZiBlbXBsb3llciBuYW1lcyBmb3VuZC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgZW1wbG95bWVudCBwb3J0aW9uIG9mIHRoZSBsaW5rIGZsb3cuICBgSU5URVJOQUxfRVJST1JgOiBUaGUgdXNlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1cyB7XG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIE5vRW1wbG95ZXJzRm91bmQgPSAnTk9fRU1QTE9ZRVJTX0ZPVU5EJyxcbiAgICBFbXBsb3llck5vdExpc3RlZCA9ICdFTVBMT1lFUl9OT1RfTElTVEVEJyxcbiAgICBTdGFydGVkID0gJ1NUQVJURUQnLFxuICAgIEludGVybmFsRXJyb3IgPSAnSU5URVJOQUxfRVJST1InXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgSW5jb21lIExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBpbmNvbWUgIGBOT19ERVBPU0lUU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgVVNFUl9SRVBPUlRFRF9OT19JTkNPTUVgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZG9uXFwndCByZWNlaXZlIGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgU1RBUlRFRGA6IFRoZSB1c2VyIGJlZ2FuIHRoZSBiYW5rIGluY29tZSBwb3J0aW9uIG9mIHRoZSBsaW5rIGZsb3cuICBgSU5URVJOQUxfRVJST1JgOiBUaGUgdXNlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9EZXBvc2l0c0ZvdW5kID0gJ05PX0RFUE9TSVRTX0ZPVU5EJyxcbiAgICBVc2VyUmVwb3J0ZWROb0luY29tZSA9ICdVU0VSX1JFUE9SVEVEX05PX0lOQ09NRScsXG4gICAgU3RhcnRlZCA9ICdTVEFSVEVEJyxcbiAgICBJbnRlcm5hbEVycm9yID0gJ0lOVEVSTkFMX0VSUk9SJ1xufVxuXG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYXlzdHVicyB1cGxvYWRlZCBieSB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfdXBsb2FkZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHcycyB1cGxvYWRlZCBieSB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX2Jhbmtfc3RhdGVtZW50c191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgMTA5OXMgdXBsb2FkZWQgYnkgdGhlIHVzZXJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fMTA5OXNfdXBsb2FkZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIEktMjBzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX2kyMHNfdXBsb2FkZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBMaW5rIGVycm9yLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGFuIEl0ZW0gYWRkIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFJldHVybmVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYXlzdHVicyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdzJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV93MnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW5zdGl0dXRpb24gTmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2V0IG9mIHJlc3VsdHMgZm9yIGEgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25SZXN1bHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIEl0ZW0gYWRkcyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGl0ZW1fYWRkX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBiYW5rIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgZW1wbG95bWVudCB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luY29tZV9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgZG9jdW1lbnRfaW5jb21lX3Jlc3VsdHM/OiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgZm9yIHRoZSB1c2VyLiBTZXNzaW9ucyB3aWxsIGJlIHNvcnRlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2Vzc2lvbnM/OiBBcnJheTxDcmVkaXRTZXNzaW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVzIgaXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBpbmNvbWUgZGF0YSB0YWtlbiBmcm9tIGEgVzIgdGF4IGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRXMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFcyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0UGF5U3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU6IENyZWRpdFBheVN0dWJFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgdGF4X3llYXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHdhZ2VzX3RpcHNfb3RoZXJfY29tcDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIFNvY2lhbCBTZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV93YWdlczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgU2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGF4X3dpdGhoZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gU29jaWFsIFNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGJveF85OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZGVwZW5kZW50X2NhcmVfYmVuZWZpdHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBib3hfMTI6IEFycmF5PFcyQm94MTI+O1xuICAgIC8qKlxuICAgICAqIFN0YXR1dG9yeSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcmQgcGFydHkgc2ljayBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPdGhlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG90aGVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzOiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz47XG59XG4vKipcbiAqIERhdGEgdG8gcG9wdWxhdGUgYXMgdGVzdCB0cmFuc2FjdGlvbiBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDdXN0b21TYW5kYm94VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21TYW5kYm94VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gVHJhbnNhY3Rpb24gZGF0ZSBtdXN0IGJlIHRoZSBwcmVzZW50IGRhdGUgb3IgYSBkYXRlIHVwIHRvIDE0IGRheXMgaW4gdGhlIHBhc3QuIEZ1dHVyZSBkYXRlcyBhcmUgbm90IGFsbG93ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tU2FuZGJveFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gUG9zdGVkIGRhdGUgbXVzdCBiZSB0aGUgcHJlc2VudCBkYXRlIG9yIGEgZGF0ZSB1cCB0byAxNCBkYXlzIGluIHRoZSBwYXN0LiBGdXR1cmUgZGF0ZXMgYXJlIG5vdCBhbGxvd2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEN1c3RvbVNhbmRib3hUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudC4gQ2FuIGJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEN1c3RvbVNhbmRib3hUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21TYW5kYm94VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBmb3JtYXQgY3VycmVuY3kgY29kZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBEZWZhdWx0cyB0byBVU0QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tU2FuZGJveFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbnMgYSByaXNrIHNjb3JlIGFuZCBhIHJpc2sgdGllciB0aGF0IGV2YWx1YXRlIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBvZiBhbiB1bmF1dGhvcml6ZWQgZGViaXQuIENvbW1vbiByZXR1cm4gY29kZXMgaW4gdGhpcyBjYXRlZ29yeSBpbmNsdWRlOiBcXFwiUjA1XFxcIiwgXFxcIlIwN1xcXCIsIFxcXCJSMTBcXFwiLCBcXFwiUjExXFxcIiwgXFxcIlIyOVxcXCIuIFRoZXNlIHJldHVybnMgdHlwaWNhbGx5IGhhdmUgYSByZXR1cm4gdGltZSBmcmFtZSBvZiB1cCB0byA2MCBjYWxlbmRhciBkYXlzLiBEdXJpbmcgdGhpcyBwZXJpb2QsIGN1c3RvbWVycyBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGNhbiBkaXNwdXRlIGEgdHJhbnNhY3Rpb24gYXMgdW5hdXRob3JpemVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2sge1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIERFUFJFQ0FURUQuIFVzZSBTaWduYWwgUnVsZXMgaW5zdGVhZCB0byB0cmFuc2Zvcm0gdGhlIGBzY29yZWAgaW50byBhIHVzZWZ1bCBhY3Rpb24uICBBIHRpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdGVkIGxpa2VsaWhvb2QgdGhhdCB0aGUgdHJhbnNhY3Rpb24sIGlmIGluaXRpYXRlZCwgd2lsbCBiZSBzdWJqZWN0IHRvIGEgcmV0dXJuLiAgSW4gdGhlIGBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGZpdmUgcmlzayB0aWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29yZXM6ICAgMTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAwJSAtIDAuMDIlICAgMjogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAyJSAtIDAuMDUlICAgMzogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjA1JSAtIDAuMSUgICA0OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMSUgLSAwLjUlICAgNTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgZ3JlYXRlciB0aGFuIDAuNSUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByaXNrX3RpZXI6IG51bWJlcjtcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlciB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXNoYm9hcmRVc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyXG4gICAgICovXG4gICAgc3RhdHVzOiBEYXNoYm9hcmRVc2VyU3RhdHVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhIGRhc2hib2FyZCB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHRlYW0gbWVtYmVyIHdpdGggYWNjZXNzIHRvIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXNoYm9hcmRVc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IERhc2hib2FyZFVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBkYXNoYm9hcmQgdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBkYXNoYm9hcmQgdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHR5cGUge0FycmF5PERhc2hib2FyZFVzZXI+fVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJzOiBBcnJheTxEYXNoYm9hcmRVc2VyPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEYXNoYm9hcmRVc2VyU3RhdHVzIHtcbiAgICBJbnZpdGVkID0gJ2ludml0ZWQnLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIERlYWN0aXZhdGVkID0gJ2RlYWN0aXZhdGVkJ1xufVxuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHNvdXJjZSBvZiBkYXRhIGZvciBhIGdpdmVuIHByb2R1Y3QvZGF0YSB0eXBlLiAgYElOU1RJVFVUSU9OYDogVGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHRoaXMgcHJvZHVjdCwgYW5kIHRoZSBkYXRhIHdhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIGBJTlNUSVRVVElPTl9NQVNLYDogVGhlIHVzZXIgbWFudWFsbHkgcHJvdmlkZWQgdGhlIGZ1bGwgYWNjb3VudCBudW1iZXIsIHdoaWNoIHdhcyBtYXRjaGVkIHRvIHRoZSBhY2NvdW50IG1hc2sgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBPbmx5IGFwcGxpY2FibGUgdG8gdGhlIGBudW1iZXJzYCBkYXRhIHR5cGUuIGBVU0VSYDogVGhlIGluc3RpdHV0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBwcm9kdWN0LCBhbmQgdGhlIGRhdGEgd2FzIG1hbnVhbGx5IHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRGF0YVNvdXJjZXMge1xuICAgIEluc3RpdHV0aW9uID0gJ0lOU1RJVFVUSU9OJyxcbiAgICBJbnN0aXR1dGlvbk1hc2sgPSAnSU5TVElUVVRJT05fTUFTSycsXG4gICAgVXNlciA9ICdVU0VSJ1xufVxuXG4vKipcbiAqIEEgZGF0ZSByYW5nZSB3aXRoIGEgc3RhcnQgYW5kIGVuZCBkYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhdGVSYW5nZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVSYW5nZSB7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhdGVSYW5nZVxuICAgICAqL1xuICAgIGJlZ2lubmluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXRlUmFuZ2VcbiAgICAgKi9cbiAgICBlbmRpbmc6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdWJ0b3RhbHM/OiBBcnJheTxUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERlZHVjdGlvbnNCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFsOiBEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgYW4gSXRlbS4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gdGhlIHdlYmhvb2sgcmVsYXRlcyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1kZXBvc2l0b3J5KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRvcnlBY2NvdW50U3VidHlwZSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgQ2QgPSAnY2QnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIExpbWl0ZWRQdXJwb3NlQ2hlY2tpbmcgPSAnbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nJyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0b3J5RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdG9yeUZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgbGltaXRlZCBwdXJwb3NlIHR5cGVzLiBSZXN0cmljdHMgd2hpY2gga2luZHMgb2YgbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nIGFjY291bnRzIG1heSBiZSBjb25uZWN0ZWQgaW4gTGluayB0byBwcmV2ZW50IHVzZXJzIGZyb20gY29ubmVjdGluZyB0aGVtIGZvciB1bnN1cHBvcnRlZCB1c2UgY2FzZXMuIFJlcXVpcmVkIHdoZW4gXFwnbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nXFwnIGlzIGluIHRoZSBzdWJ0eXBlcyBmaWx0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PExpbWl0ZWRQdXJwb3NlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRvcnlGaWx0ZXJcbiAgICAgKi9cbiAgICBsaW1pdGVkX3B1cnBvc2VfdHlwZXM/OiBBcnJheTxMaW1pdGVkUHVycG9zZVR5cGU+O1xufVxuLyoqXG4gKiBPcmlnaW5hdG9yIGFuZCB0aGVpciBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvciB7XG4gICAgLyoqXG4gICAgICogT3JpZ2luYXRvclxcJ3MgY2xpZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRpbGlnZW5jZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGV0YWlsZWRPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2Ygb3V0c3RhbmRpbmcgcmVxdWlyZW1lbnRzIHRoYXQgbXVzdCBiZSBzdWJtaXR0ZWQgYmVmb3JlIFBsYWlkIGNhbiBhcHByb3ZlIHRoZSBvcmlnaW5hdG9yLiBPbmx5IHBvcHVsYXRlZCB3aGVuIGB0cmFuc2Zlcl9kaWxpZ2VuY2Vfc3RhdHVzYCBpcyBgbW9yZV9pbmZvcm1hdGlvbl9yZXF1aXJlZGAuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD59XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX3JlcXVpcmVtZW50cz86IEFycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD47XG59XG4vKipcbiAqIEEgcG9zc2libGUgYWNjb3VudCBkZXRlY3RlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRlY3RlZEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRlY3RlZEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRlY3RlZCBhY2NvdW50IHR5cGUgKGRlcG9zaXRvcnksIGNyZWRpdCwgbG9hbiwgaW52ZXN0bWVudCBldGMuKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbnMgdG8vZnJvbSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogRGV2aWNlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGV2aWNlSWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VJZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV2aWNlSWRcbiAgICAgKi9cbiAgICB0eXBlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBkZXZpY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXZpY2VJZFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZG9jdW1lbnQuICBgRE9DVU1FTlRfVFlQRV9QQVlTVFVCYDogQSBwYXlzdHViLiAgYERPQ1VNRU5UX1RZUEVfQkFOS19TVEFURU1FTlRgOiBBIGJhbmsgc3RhdGVtZW50LiAgYERPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyYDogQSBXLTIgd2FnZSBhbmQgdGF4IHN0YXRlbWVudCBwcm92aWRlZCBieSBhIFVTIGVtcGxveWVyIHJlZmxlY3Rpbmcgd2FnZXMgZWFybmVkIGJ5IHRoZSBlbXBsb3llZS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVNgOiBBbiBlbGVjdHJvbmljIFJldGlyZW1lbnQgQWNjb3VudCBTdGF0ZW1lbnQgKGVSQVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVNgOiBBIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0ZW1lbnQgKExFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0NMRVNgOiBBIENpdmlsaWFuIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0ZW1lbnQgKENMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgRE9DVU1FTlRfVFlQRV9HSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBET0NVTUVOVF9UWVBFX05PTkVgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkb2N1bWVudCBmb3IgdGhlIGRhdGEuICBgRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9NSVNDYDogQSBGb3JtIDEwOTktTUlTQyBpbmZvcm1hdGlvbiByZXR1cm4gcmVwb3J0aW5nIG1pc2NlbGxhbmVvdXMgaW5jb21lLiAgYERPQ1VNRU5UX1RZUEVfVVNfVEFYXzEwOTlfS2A6IEEgRm9ybSAxMDk5LUsgaW5mb3JtYXRpb24gcmV0dXJuIHJlcG9ydGluZyBwYXltZW50IGNhcmQgYW5kIHRoaXJkLXBhcnR5IG5ldHdvcmsgdHJhbnNhY3Rpb25zLiAgYERPQ1VNRU5UX1RZUEVfUExBSURfR0VORVJBVEVEX1BBWVNUVUJfUERGYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBQREYgZm9yIHRoZSBwYXlzdHViIHdhcyBnZW5lcmF0ZWQgYnkgUGxhaWQuICBgRE9DVU1FTlRfVFlQRV9VU19TVFVERU5UX0kyMGA6IEEgRm9ybSBJLTIwIENlcnRpZmljYXRlIG9mIEVsaWdpYmlsaXR5IGZvciBOb25pbW1pZ3JhbnQgU3R1ZGVudCBTdGF0dXMuICBgVU5LTk9XTmA6IERvY3VtZW50IHR5cGUgY291bGQgbm90IGJlIGRldGVybWluZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2NUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIERvY3VtZW50VHlwZVBheXN0dWIgPSAnRE9DVU1FTlRfVFlQRV9QQVlTVFVCJyxcbiAgICBEb2N1bWVudFR5cGVCYW5rU3RhdGVtZW50ID0gJ0RPQ1VNRU5UX1RZUEVfQkFOS19TVEFURU1FTlQnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4VzIgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfVzInLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlFcmFzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBUycsXG4gICAgRG9jdW1lbnRUeXBlVXNNaWxpdGFyeUxlcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFUycsXG4gICAgRG9jdW1lbnRUeXBlVXNNaWxpdGFyeUNsZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9DTEVTJyxcbiAgICBEb2N1bWVudFR5cGVHaWcgPSAnRE9DVU1FTlRfVFlQRV9HSUcnLFxuICAgIERvY3VtZW50VHlwZU5vbmUgPSAnRE9DVU1FTlRfVFlQRV9OT05FJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheDEwOTlNaXNjID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYXzEwOTlfTUlTQycsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5SyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X0snLFxuICAgIERvY3VtZW50VHlwZVBsYWlkR2VuZXJhdGVkUGF5c3R1YlBkZiA9ICdET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERicsXG4gICAgRG9jdW1lbnRUeXBlVXNTdHVkZW50STIwID0gJ0RPQ1VNRU5UX1RZUEVfVVNfU1RVREVOVF9JMjAnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBwcm9jZXNzZWQuIElmIGEgZG9jdW1lbnQgZmFpbHMgdmVyaWZpY2F0aW9uLCB0aGUgZGV0YWlscyBpbiB0aGUgYGFuYWx5c2lzYCBvYmplY3Qgc2hvdWxkIGhlbHAgY2xhcmlmeSB3aHkgdGhlIGRvY3VtZW50IHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGF1dGhlbnRpY2l0eTogRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGltYWdlX3F1YWxpdHk6IEltYWdlUXVhbGl0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbmFseXNpc0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBmcmF1ZF9hbmFseXNpc19kZXRhaWxzOiBGcmF1ZEFuYWx5c2lzRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpbWFnZV9xdWFsaXR5X2RldGFpbHM6IEltYWdlUXVhbGl0eURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIdW1hblJldmlld31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGh1bWFuX3Jldmlldz86IEh1bWFuUmV2aWV3IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUFNVkFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGFhbXZhX3ZlcmlmaWNhdGlvbjogQUFNVkFBbmFseXNpcyB8IG51bGw7XG59XG4vKipcbiAqIEhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB3aGV0aGVyIHRoZSBkb2N1bWVudCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UgbWF0Y2hlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBhbmQgc2VjdXJpdHkgY2hlY2tzIGZvciB0aGUgYXNzb2NpYXRlZCBqdXJpc2RpY3Rpb24uICBGb3IgZXhhbXBsZSwgbW9zdCBpZGVudGl0eSBkb2N1bWVudHMgaGF2ZSBmb3JtYXR0aW5nIHJ1bGVzIGxpa2UgdGhlIGZvbGxvd2luZzogICBUaGUgaW1hZ2Ugb2YgdGhlIHBlcnNvblxcJ3MgZmFjZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGNvbnRyYXN0IGluIG9yZGVyIHRvIGhpZ2hsaWdodCBza2luIHRvbmUgICBUaGUgc3ViamVjdCBpbiB0aGUgZG9jdW1lbnRcXCdzIGltYWdlIG11c3QgcmVtb3ZlIGV5ZSBnbGFzc2VzIGFuZCBwb3NlIGluIGEgY2VydGFpbiB3YXkgICBUaGUgaW5mb3JtYXRpb25hbCBmaWVsZHMgKG5hbWUsIGRhdGUgb2YgYmlydGgsIElEIG51bWJlciwgZXRjLikgbXVzdCBiZSBjb2xvcmVkIGFuZCBhbGlnbmVkIGFjY29yZGluZyB0byBzcGVjaWZpYyBydWxlcyAgIFNlY3VyaXR5IGZlYXR1cmVzIGxpa2Ugd2F0ZXJtYXJrcyBhbmQgYmFja2dyb3VuZCBwYXR0ZXJucyBtdXN0IGJlIHByZXNlbnQgIFNvIGEgYG1hdGNoYCBzdGF0dXMgZm9yIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBzZWVtcyB0byBjb25mb3JtIHRvIHRoZSB2YXJpb3VzIGZvcm1hdHRpbmcgYW5kIHNlY3VyaXR5IHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIG1hdGNoIHN1bW1hcnkgZGVzY3JpYmluZyB0aGUgY3Jvc3MgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzdWJqZWN0XFwncyBkYXRlIG9mIGJpcnRoLCBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UsIGFuZCB0aGUgZGF0ZSBvZiBiaXJ0aCB0aGV5IHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gdGhlIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIGZyb20gdGhlIGVuZCB1c2VyXFwncyB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgdGhhdCBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHBheXN0dWIgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY190eXBlPzogRG9jVHlwZTtcbn1cbi8qKlxuICogQSBtYXRjaCBzdW1tYXJ5IGRlc2NyaWJpbmcgdGhlIGNyb3NzIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3ViamVjdFxcJ3MgbmFtZSwgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLCBhbmQgdGhlIG5hbWUgdGhleSBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIHRoZSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50TmFtZU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGEgY2VydGFpbiByZWFzb24gYXMgdG8gd2h5IGEgZG9jdW1lbnQgY291bGQgcG90ZW50aWFsbHkgYmUgZnJhdWR1bGVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByaXNrIGZvdW5kIGluIHRoZSByaXNrIHNpZ25hbCBjaGVjay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCB3aGljaCB0aGUgcmlzayBzaWduYWwgd2FzIGNvbXB1dGVkIGZvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGZpZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyB1c2VkIHRvIHF1aWNrbHkgaWRlbnRpZnkgaWYgdGhlIHNpZ25hbCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZpZWxkIGlzIGF1dGhlbnRpYyBvciBmcmF1ZHVsZW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGhhc19mcmF1ZF9yaXNrOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbWV0YWRhdGE6IERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCB2YWx1ZSBvZiB0aGUgZmllbGQsIGFzIHNlZW4gb24gdGhlIGRvY3VtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZXhwZWN0ZWRfdmFsdWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlcml2ZWQgdmFsdWUgb2J0YWluZWQgaW4gdGhlIHJpc2sgc2lnbmFsIGNhbGN1bGF0aW9uIHByb2Nlc3MgZm9yIHRoaXMgZmllbGRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBhY3R1YWxfdmFsdWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBwcm92aWRpbmcgbW9yZSBkZXRhaWwgaW50byB0aGUgcGFydGljdWxhciByaXNrIHNpZ25hbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHNpZ25hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZXZhbnQgcGFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJpc2sgc2lnbmFsLiBJZiB0aGUgcmlzayBzaWduYWwgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHBhZ2UsIHRoZSB2YWx1ZSB3aWxsIGJlIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcGFnZV9udW1iZXI6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aGljaCBjb250YWlucyBhZGRpdGlvbmFsIG1ldGFkYXRhIGFib3V0IHRoZSBpbnN0aXR1dGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIHZlcmlmaWNhdGlvbiBhdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmcmF1ZCByaXNrIGRhdGEgZm9yIGEgc2V0IG9mIGluY29tZSBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGRvY3VtZW50IG1ldGFkYXRhIGFuZCBhc3NvY2lhdGVkIHJpc2sgc2lnbmFscyBwZXIgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIHNpbmdsZV9kb2N1bWVudF9yaXNrX3NpZ25hbHM6IEFycmF5PFNpbmdsZURvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmlzayBzaWduYWxzIGNvbXB1dGVkIGZyb20gYSBzZXQgb2YgdXBsb2FkZWQgZG9jdW1lbnRzIGFuZCB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudHNcXCcgbWV0YWRhdGFcbiAgICAgKiBAdHlwZSB7QXJyYXk8TXVsdGlEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgbXVsdGlfZG9jdW1lbnRfcmlza19zaWduYWxzOiBBcnJheTxNdWx0aURvY3VtZW50Umlza1NpZ25hbD47XG59XG4vKipcbiAqIEEgc3VtbWFyeSBhY3Jvc3MgYWxsIHJpc2sgc2lnbmFscyBhc3NvY2lhdGVkIHdpdGggYSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZSwgd2hlcmUgYSBzY29yZSBjbG9zZXIgdG8gMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgdHJ1c3R3b3J0aHkgYW5kIGEgc2NvcmUgY2xvc2VyIHRvIDEwMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgZnJhdWR1bGVudC4gWW91IGNhbiBhdXRvbWF0aWNhbGx5IHJlamVjdCBkb2N1bWVudHMgd2l0aCBhIGhpZ2ggcmlzayBzY29yZSwgYXV0b21hdGljYWxseSBhY2NlcHQgZG9jdW1lbnRzIHdpdGggYSBsb3cgcmlzayBzY29yZSwgYW5kIG1hbnVhbGx5IHJldmlldyBkb2N1bWVudHMgaW4gYmV0d2Vlbi4gV2Ugc3VnZ2VzdCBzdGFydGluZyB3aXRoIGEgdGhyZXNob2xkIG9mIDgwIGZvciBhdXRvLXJlamVjdGlvbiBhbmQgMjAgZm9yIGF1dG8tYWNjZXB0YW5jZS4gQXMgeW91IGdhdGhlciBtb3JlIGRhdGEgcG9pbnRzIG9uIHR5cGljYWwgcmlzayBzY29yZXMgZm9yIHlvdXIgdXNlIGNhc2UsIHlvdSBjYW4gdHVuZSB0aGVzZSBwYXJhbWV0ZXJzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyB1bmRlcmdvaW5nIG1hbnVhbCByZXZpZXcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfc2NvcmU6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG91dGNvbWUgc3RhdHVzIGZvciB0aGlzIHNwZWNpZmljIGRvY3VtZW50IHN1Ym1pc3Npb24uIERpc3RpbmN0IGZyb20gdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbi5zdGF0dXNgIHRoYXQgc3VtbWFyaXplcyB0aGUgdmVyaWZpY2F0aW9uIG91dGNvbWUgZnJvbSBvbmUgb3IgbW9yZSBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBNYW51YWxseUFwcHJvdmVkID0gJ21hbnVhbGx5X2FwcHJvdmVkJ1xufVxuXG4vKipcbiAqIERhdGEsIGltYWdlcywgYW5hbHlzaXMsIGFuZCByZXN1bHRzIGZyb20gdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5kb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5kb2N1bWVudGFyeV92ZXJpZmljYXRpb25gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZG9jdW1lbnRzIHN1Ym1pdHRlZCB0byB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gRWFjaCBlbnRyeSByZXByZXNlbnRzIG9uZSB1c2VyIHN1Ym1pc3Npb24sIHdoZXJlIGVhY2ggc3VibWlzc2lvbiB3aWxsIGNvbnRhaW4gYm90aCBhIGZyb250IGFuZCBiYWNrIGltYWdlLCBvciBqdXN0IGEgZnJvbnQgaW1hZ2UsIGRlcGVuZGluZyBvbiB0aGUgZG9jdW1lbnQgdHlwZS4gIE5vdGU6IFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBsZXQgYSB1c2VyIHN1Ym1pdCBhIG5ldyBzZXQgb2YgZG9jdW1lbnQgaW1hZ2VzIHVwIHRvIHRocmVlIHRpbWVzIGlmIHdlIGRldGVjdCB0aGF0IGEgcHJldmlvdXMgYXR0ZW1wdCBtaWdodCBoYXZlIGZhaWxlZCBkdWUgdG8gdXNlciBlcnJvci4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmaXJzdCBzZXQgb2YgZG9jdW1lbnQgaW1hZ2VzIGFyZSBibHVycnkgb3Igb2JzY3VyZWQgYnkgZ2xhcmUsIHRoZSB1c2VyIHdpbGwgYmUgYXNrZWQgdG8gY2FwdHVyZSB0aGVpciBkb2N1bWVudHMgYWdhaW4sIHJlc3VsdGluZyBpbiBhdCBsZWFzdCB0d28gc2VwYXJhdGUgZW50cmllcyB3aXRoaW4gYGRvY3VtZW50c2AuIElmIHRoZSBvdmVyYWxsIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGlzIGBmYWlsZWRgLCB0aGUgdXNlciBoYXMgZXhoYXVzdGVkIHRoZWlyIHJldHJ5IGF0dGVtcHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudHM6IEFycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+O1xufVxuLyoqXG4gKiBJbWFnZXMsIGV4dHJhY3RlZCBkYXRhLCBhbmQgYW5hbHlzaXMgZnJvbSBhIHVzZXJcXCdzIGlkZW50aXR5IGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IERvY3VtZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXR0ZW1wdGAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCBkb2N1bWVudCB1cGxvYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEltYWdlc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGltYWdlczogUGh5c2ljYWxEb2N1bWVudEltYWdlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGF9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBleHRyYWN0ZWRfZGF0YTogUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYW5hbHlzaXM6IERvY3VtZW50QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5c3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdWJ0b3RhbHM/OiBBcnJheTxFYXJuaW5nc1RvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxFYXJuaW5nc1RvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bj86IEFycmF5PEVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbD86IEVhcm5pbmdzVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVhcm5pbmdzIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb24/OiBFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbiB7XG4gICAgQm9udXMgPSAnQk9OVVMnLFxuICAgIENvbW1pc3Npb24gPSAnQ09NTUlTU0lPTicsXG4gICAgT3ZlcnRpbWUgPSAnT1ZFUlRJTUUnLFxuICAgIFBhaWRUaW1lT2ZmID0gJ1BBSUQgVElNRSBPRkYnLFxuICAgIFJlZ3VsYXJQYXkgPSAnUkVHVUxBUiBQQVknLFxuICAgIFZhY2F0aW9uID0gJ1ZBQ0FUSU9OJyxcbiAgICBCYXNpY0FsbG93YW5jZUhvdXNpbmcgPSAnQkFTSUMgQUxMT1dBTkNFIEhPVVNJTkcnLFxuICAgIEJhc2ljQWxsb3dhbmNlU3Vic2lzdGVuY2UgPSAnQkFTSUMgQUxMT1dBTkNFIFNVQlNJU1RFTkNFJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbCB7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIHRoZSBlYXJuaW5ncyBmb3IgdGhpcyBwYXkgcGVyaW9kXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB5dGRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBob3VycyB3b3JrZWQgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3Vycz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW1haWwgYWRkcmVzc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbWFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgZW1haWwgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBlbWFpbCBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1haWwgYWNjb3VudCBhcyBkZXNjcmliZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHR5cGU6IEVtYWlsVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRW1haWxUeXBlRW51bSB7XG4gICAgUHJpbWFyeSA9ICdwcmltYXJ5JyxcbiAgICBTZWNvbmRhcnkgPSAnc2Vjb25kYXJ5JyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBlbWFpbCBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIGVtYWlsIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2ggYW5kIDAgaXMgYSBubyBtYXRjaC4gSWYgdGhlIGFjY291bnQgY29udGFpbnMgbXVsdGlwbGUgb3duZXJzLCB0aGUgbWF4aW11bSBtYXRjaCBzY29yZSBpcyBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsQWRkcmVzc01hdGNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3Igbm9ybWFsaXplZCBlbWFpbC4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktNzAgaXMgYSBwYXJ0aWFsIG1hdGNoIChtYXRjaGluZyB0aGUgc2FtZSBlbWFpbCB3aXRoIGRpZmZlcmVudCBcXCcrXFwnIGV4dGVuc2lvbnMpLCBhbnl0aGluZyBiZWxvdyA3MCBpcyBjb25zaWRlcmVkIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgZW1haWwgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzczogUGF5c3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYHNpbmdsZWAgb3IgYG1hcnJpZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkPzogVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGVtcGxveWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzczogQWRkcmVzc0RhdGFOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgZnJvbSAwIHRvIDEgaW5kaWNhdGluZyBQbGFpZFxcJ3MgbGV2ZWwgb2YgY29uZmlkZW5jZSBpbiB0aGUgcGFpcmluZyBiZXR3ZWVuIHRoZSBlbXBsb3llciBhbmQgdGhlIGluc3RpdHV0aW9uIChub3QgeWV0IGltcGxlbWVudGVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGNvbmZpZGVuY2Vfc2NvcmU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3llcnMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgbmFtZSB0byBiZSBzZWFyY2hlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIHByb2R1Y3RzIHRoZSByZXR1cm5lZCBlbXBsb3llcnMgc2hvdWxkIHN1cHBvcnQuIEN1cnJlbnRseSwgdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBgXFxcImRlcG9zaXRfc3dpdGNoXFxcImAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveWVycy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1wbG95ZXJzIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWEuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3llcnM6IEFycmF5PEVtcGxveWVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZW1wbG95bWVudCBkZXRhaWxzIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudERldGFpbHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFubnVhbF9zYWxhcnk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvbiB3aGljaCB0aGUgZW1wbG95ZWUgd2FzIGhpcmVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBoaXJlX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZXMgb2Ygc291cmNlIGVtcGxveW1lbnQgZGF0YSB0aGF0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNoYXJlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbXBsb3ltZW50U291cmNlVHlwZSB7XG4gICAgQmFuayA9ICdiYW5rJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvb2Ygb2YgZW1wbG95bWVudCBkYXRhIGZvciBhbiBpbmRpdmlkdWFsXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1cz86IEVtcGxveW1lbnRWZXJpZmljYXRpb25TdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXJ0IG9mIGVtcGxveW1lbnQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGVtcGxveW1lbnQsIGlmIGFwcGxpY2FibGUuIFByb3ZpZGVkIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llclZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVyPzogRW1wbG95ZXJWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0aXRsZSBvZiBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGl0bGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGF0Zm9ybUlkc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBsYXRmb3JtX2lkcz86IFBsYXRmb3JtSWRzO1xufVxuLyoqXG4gKiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbiBzdW1tYXJpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveW1lbnRWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50czogQXJyYXk8RW1wbG95bWVudFZlcmlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VycmVudCBlbXBsb3ltZW50IHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVtcGxveW1lbnRWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEVtcGxveW1lbnRTdGF0dXNBY3RpdmUgPSAnRU1QTE9ZTUVOVF9TVEFUVVNfQUNUSVZFJyxcbiAgICBFbXBsb3ltZW50U3RhdHVzSW5hY3RpdmUgPSAnRU1QTE9ZTUVOVF9TVEFUVVNfSU5BQ1RJVkUnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBIGdyb3VwaW5nIG9mIHRoZSBQbGFpZCBwcm9kdWNlZCB0cmFuc2FjdGlvbiBlbmhhbmNlbWVudCBmaWVsZHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVuaGFuY2VtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VtZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgd2Vic2l0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgYSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgYSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PENvdW50ZXJwYXJ0eT47XG59XG4vKipcbiAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhY2NvdW50IGhvbGRlcjogIGBPVVRGTE9XYCAtIEluY2x1ZGVzIG91dGdvaW5nIHRyYW5zZmVycywgcHVyY2hhc2VzLCBhbmQgZmVlcy4gKFR5cGljYWxseSByZXByZXNlbnRlZCBhcyBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNoZWNraW5nIGFjY291bnRzIGFuZCBkZWJpdCBjYXJkcyBhbmQgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjcmVkaXQgY2FyZHMuKSAgYElORkxPV2AgLSBJbmNsdWRlcyBpbmNvbWluZyB0cmFuc2ZlcnMsIHJlZnVuZHMsIGFuZCBpbmNvbWUuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgbmVnYXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLilcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uIHtcbiAgICBJbmZsb3cgPSAnSU5GTE9XJyxcbiAgICBPdXRmbG93ID0gJ09VVEZMT1cnXG59XG5cbi8qKlxuICogQSBncm91cGluZyBvZiB0aGUgUGxhaWQgcHJvZHVjZWQgdHJhbnNhY3Rpb24gZW5yaWNobWVudCBmaWVsZHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVucmljaG1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5yaWNobWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzOiBBcnJheTxDb3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGZvciB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiB0byBvYnRhaW4gdGhlIGJlc3QgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgbGVnYWN5IGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhY3lfY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIGEgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkgaW4gRS4xNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeTogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgYSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9mZmljaWFsIGRvY3VtZW50LCB1c3VhbGx5IGlzc3VlZCBieSBhIGdvdmVybmluZyBib2R5IG9yIGluc3RpdHV0aW9uLCB3aXRoIGFuIGFzc29jaWF0ZWQgaWRlbnRpZmllci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlEb2N1bWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eURvY3VtZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICB0eXBlOiBFbnRpdHlEb2N1bWVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlEb2N1bWVudFxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUga2luZCBvZiBvZmZpY2lhbCBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4gIGBiaWtgIC0gUnVzc2lhbiBiYW5rIGNvZGUgIGBidXNpbmVzc19udW1iZXJgIC0gQSBudW1iZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBidXNpbmVzcyB3aXRoaW4gYSBjYXRlZ29yeSBvZiBidXNpbmVzc2VzICBgaW1vYCAtIE51bWJlciBhc3NpZ25lZCB0byB0aGUgZW50aXR5IGJ5IHRoZSBJbnRlcm5hdGlvbmFsIE1hcml0aW1lIE9yZ2FuaXphdGlvbiAgYG90aGVyYCAtIEFueSBkb2N1bWVudCBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgc3dpZnRgIC0gTnVtYmVyIGlkZW50aWZ5aW5nIGEgYmFuayBhbmQgYnJhbmNoLiAgYHRheF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbGxlY3RpbmcgdGF4ZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVudGl0eURvY3VtZW50VHlwZSB7XG4gICAgQmlrID0gJ2JpaycsXG4gICAgQnVzaW5lc3NOdW1iZXIgPSAnYnVzaW5lc3NfbnVtYmVyJyxcbiAgICBJbW8gPSAnaW1vJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgU3dpZnQgPSAnc3dpZnQnLFxuICAgIFRheElkID0gJ3RheF9pZCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgZW50aXR5IGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRvY3VtZW50cz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc2VzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICB1cmxzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZW50aXR5IHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AgdGhhdCB3ZXJlIGNvbXBhcmVkIHdoZW4gdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gRW50aXR5IHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgLCB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBFbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBMb2NhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IEFycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBOYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz47XG4gICAgLyoqXG4gICAgICogVVJMcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHVybHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRVcmxzSXRlbXM+O1xufVxuLyoqXG4gKiBBbmFseXplZCBkb2N1bWVudHMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5RG9jdW1lbnQ7XG59XG4vKipcbiAqIEVtYWlsIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlscyB7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nO1xufVxuLyoqXG4gKiBBbmFseXplZCBlbWFpbHMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdEVtYWlscztcbn1cbi8qKlxuICogTmFtZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgZnVsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgbmFtZXMgYXJlIHRob3NlIG1vc3QgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byB0aGlzIGVudGl0eS4gT25seSBvbmUgbmFtZSB3aWxsIGV2ZXIgYmUgbWFya2VkIGFzIHByaW1hcnkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2Vha0FsaWFzRGV0ZXJtaW5hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICB3ZWFrX2FsaWFzX2RldGVybWluYXRpb246IFdlYWtBbGlhc0RldGVybWluYXRpb247XG59XG4vKipcbiAqIEFuYWx5emVkIG5hbWVzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0TmFtZXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0TmFtZXM7XG59XG4vKipcbiAqIFBob25lIG51bWJlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgdHlwZTogUGhvbmVUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVVJMcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzIHtcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbmFseXplZCBVUkxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0VXJsc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdFVybHM7XG59XG4vKipcbiAqIEFuYWx5emVkIHBob25lIG51bWJlcnMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVycztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlbnRpdHkgc2NyZWVuaW5nIHN0YXR1cyBoYXMgY2hhbmdlZCwgd2hpY2ggY2FuIG9jY3VyIG1hbnVhbGx5IHZpYSB0aGUgZGFzaGJvYXJkIG9yIGR1cmluZyBvbmdvaW5nIG1vbml0b3JpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBFTlRJVFlfU0NSRUVOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnRpdHlfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTaG9ydGhhbmQgaWRlbnRpZmllciBmb3IgYSBzcGVjaWZpYyBzY3JlZW5pbmcgbGlzdCBmb3IgZW50aXRpZXMuICBgQVVfQ09OYDogQXVzdHJhbGlhIERlcGFydG1lbnQgb2YgRm9yZWlnbiBBZmZhaXJzIGFuZCBUcmFkZSBDb25zb2xpZGF0ZWQgTGlzdCAgYENBX0NPTmA6IEdvdmVybm1lbnQgb2YgQ2FuYWRhIENvbnNvbGlkYXRlZCBMaXN0IG9mIFNhbmN0aW9ucyAgYEVVX0NPTmA6IEV1cm9wZWFuIEV4dGVybmFsIEFjdGlvbiBTZXJ2aWNlIENvbnNvbGlkYXRlZCBMaXN0ICBgSVpfU09FYDogU3RhdGUgT3duZWQgRW50ZXJwcmlzZSBMaXN0ICBgSVpfVU5DYDogVW5pdGVkIE5hdGlvbnMgQ29uc29saWRhdGVkIFNhbmN0aW9ucyAgYElaX1dCS2A6IFdvcmxkIEJhbmsgTGlzdGluZyBvZiBJbmVsaWdpYmxlIEZpcm1zIGFuZCBJbmRpdmlkdWFscyAgYFVTX0NBUGA6IFVTIE9GQUMgQ29ycmVzcG9uZGVudCBBY2NvdW50IG9yIFBheWFibGUtVGhyb3VnaCBBY2NvdW50IFNhbmN0aW9ucyAgYFVTX0ZTRWA6IFVTIE9GQUMgRm9yZWlnbiBTYW5jdGlvbnMgRXZhZGVycyAgYFVTX01CU2A6IFVTIE5vbi1TRE4gTWVudS1CYXNlZCBTYW5jdGlvbnMgIGBVU19TRE5gOiBVUyBPRkFDIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hdGlvbmFscyBMaXN0ICBgVVNfU1NJYDogVVMgT0ZBQyBTZWN0b3JhbCBTYW5jdGlvbnMgSWRlbnRpZmljYXRpb25zICBgVVNfQ01DYDogVVMgT0ZBQyBOb24tU0ROIENoaW5lc2UgTWlsaXRhcnktSW5kdXN0cmlhbCBDb21wbGV4IExpc3QgIGBVU19VVkxgOiBCdXJlYXUgb2YgSW5kdXN0cnkgYW5kIFNlY3VyaXR5IFVudmVyaWZpZWQgTGlzdCAgYFVTX1NBTWA6IFVTIFN5c3RlbSBmb3IgQXdhcmQgTWFuYWdlbWVudCBFeGNsdXNpb24gTGlzdCAgYFVTX1RFTGA6IFVTIFRlcnJvcmlzdCBFeGNsdXNpb24gTGlzdCAgYFVLX0hNQ2A6IEZvcmVpZ24sIENvbW1vbndlYWx0aCAmIERldmVsb3BtZW50IE9mZmljZSBVSyBTYW5jdGlvbnMgTGlzdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW50aXR5V2F0Y2hsaXN0Q29kZSB7XG4gICAgQ2FDb24gPSAnQ0FfQ09OJyxcbiAgICBFdUNvbiA9ICdFVV9DT04nLFxuICAgIEl6U29lID0gJ0laX1NPRScsXG4gICAgSXpVbmMgPSAnSVpfVU5DJyxcbiAgICBJeldiayA9ICdJWl9XQksnLFxuICAgIFVzQ2FwID0gJ1VTX0NBUCcsXG4gICAgVXNGc2UgPSAnVVNfRlNFJyxcbiAgICBVc01icyA9ICdVU19NQlMnLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBVc0NtYyA9ICdVU19DTUMnLFxuICAgIFVzVXZsID0gJ1VTX1VWTCcsXG4gICAgVXNTYW0gPSAnVVNfU0FNJyxcbiAgICBVc1RlbCA9ICdVU19URUwnLFxuICAgIEF1Q29uID0gJ0FVX0NPTicsXG4gICAgVWtIbWMgPSAnVUtfSE1DJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nIGhpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHJldmlld19zdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZmlyc3RfYWN0aXZlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGluYWN0aXZlX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEVudGl0eVdhdGNobGlzdENvZGU7XG4gICAgLyoqXG4gICAgICogQSB1bml2ZXJzYWwgaWRlbnRpZmllciBmb3IgYSB3YXRjaGxpc3QgaW5kaXZpZHVhbCB0aGF0IGlzIHN0YWJsZSBhY3Jvc3Mgc2VhcmNoZXMgYW5kIHVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcGxhaWRfdWlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBzYW5jdGlvbiBvciB3YXRjaGxpc3QuIFdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc291cmNlLCB0aGlzIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzb3VyY2VfdWlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1Yi1wcm9ncmFtIGRlc2lnbmF0aW9ucyB0aGF0IG1heSBiZSBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IGVudHJ5IGJ5IHRoZSBpc3N1aW5nIGF1dGhvcml0eS4gRm9yIE9GQUMgU0ROIGVudHJpZXMgdGhlc2UgYXJlIHRoZSBwcm9ncmFtIGNvZGVzIHB1Ymxpc2hlZCBpbiB0aGUgU0ROIGxpc3QgKGZvciBleGFtcGxlIGBTREdUYCBmb3IgU3BlY2lhbGx5IERlc2lnbmF0ZWQgR2xvYmFsIFRlcnJvcmlzdHMsIGBTRE5US2AgZm9yIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hcmNvdGljcyBUcmFmZmlja2luZyBLaW5ncGlucywgYElSQU5gLCBgUlVTU0lBLUVPMTQwMjRgKS4gTmV3IGNvZGVzIGFyZSBhZGRlZCBieSBzYW5jdGlvbmluZyBhdXRob3JpdGllcyB3aXRob3V0IHByaW9yIG5vdGljZSwgc28gY2FsbGVycyBzaG91bGQgdHJlYXQgdW5rbm93biB2YWx1ZXMgYXMgb3BhcXVlIHN0cmluZ3MgcmF0aGVyIHRoYW4gZW51bSBtZW1iZXJzLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgc3ViX3Byb2dyYW1zOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdERhdGE7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgY29uZmlybWVkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBhc3NvY2lhdGVkIHdpdGggYW4gZW50aXR5IHVzZWQgZm9yIHNlYXJjaGluZyBhZ2FpbnN0IHdhdGNobGlzdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc2VhcmNoIHRlcm1zLiBTdGFydHMgYXQgYDFgIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBlZGl0IHRvIGBzZWFyY2hfdGVybXNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBTZWFyY2ggaW5wdXRzIGZvciBjcmVhdGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb24gYmVpbmcgc2NyZWVuZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWxwaGFiZXRpY2FsIGNoYXJhY3RlciwgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLCBhbmQgbm90IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFd2FTY29yZSByZXByZXNlbnRzIGFuIGVhcm5lZCB3YWdlIGFjY2VzcyBzY29yZSBmb3IgYSBzcGVjaWZpYyBhZHZhbmNlIGFtb3VudCByYW5nZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXdhU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFd2FTY29yZSB7XG4gICAgLyoqXG4gICAgICogRmxvYXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsb3dlciBib3VuZCAoaW5jbHVzaXZlKSBvZiB0aGUgYWR2YW5jZSBhbW91bnQgcmFuZ2UgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgRVdBIHNjb3JlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV3YVNjb3JlXG4gICAgICovXG4gICAgbG93ZXN0X2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGbG9hdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHVwcGVyIGJvdW5kIChleGNsdXNpdmUpIG9mIHRoZSBhZHZhbmNlIGFtb3VudCByYW5nZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBFV0Egc2NvcmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXdhU2NvcmVcbiAgICAgKi9cbiAgICBoaWdoZXN0X2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBFV0Egc2NvcmUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGFtb3VudCBidWNrZXQuIFNjb3JlcyByYW5nZSBmcm9tIDEtOTksIHdoZXJlIGEgaGlnaGVyIHNjb3JlIGluZGljYXRlcyBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHJlcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFd2FTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyO1xufVxuLyoqXG4gKiBDb21wcmVoZW5zaXZlIGFuYWx5c2lzIG9mIHNwZW5kaW5nIHBhdHRlcm5zLCBjYXRlZ29yaXppbmcgZXhwZW5zZXMgaW50byBlc3NlbnRpYWwsIG5vbi1lc3NlbnRpYWwsIGFuZCBvdGhlciBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHBlbmRpdHVyZUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZW5kaXR1cmVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogTmV0IGNhc2ggZmxvdyBmb3IgdGhlIHBlcmlvZCAoaW5mbG93cyBtaW51cyBvdXRmbG93cyksIGluY2x1ZGluZyBhIG1vbnRobHkgYXZlcmFnZS5cbiAgICAgKiBAdHlwZSB7QW1vdW50V2l0aEN1cnJlbmN5V2l0aE1vbnRobHlBdmVyYWdlfVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZUluc2lnaHRzXG4gICAgICovXG4gICAgY2FzaF9mbG93PzogQW1vdW50V2l0aEN1cnJlbmN5V2l0aE1vbnRobHlBdmVyYWdlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHBlbmRpdHVyZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlSW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9leHBlbmRpdHVyZT86IEV4cGVuZGl0dXJlU3VtbWFyeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGVuZGl0dXJlU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVzc2VudGlhbF9leHBlbmRpdHVyZT86IEV4cGVuZGl0dXJlU3VtbWFyeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGVuZGl0dXJlU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVJbnNpZ2h0c1xuICAgICAqL1xuICAgIG5vbl9lc3NlbnRpYWxfZXhwZW5kaXR1cmU/OiBFeHBlbmRpdHVyZVN1bW1hcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHBlbmRpdHVyZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlSW5zaWdodHNcbiAgICAgKi9cbiAgICBvdGhlcj86IEV4cGVuZGl0dXJlU3VtbWFyeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGVuZGl0dXJlU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zZmVyc19vdXQ/OiBFeHBlbmRpdHVyZVN1bW1hcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdXRsaWVyVHJhbnNhY3Rpb25zSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlSW5zaWdodHNcbiAgICAgKi9cbiAgICBvdXRsaWVyX3RyYW5zYWN0aW9ucz86IE91dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0cyB8IG51bGw7XG59XG4vKipcbiAqIFN1bW1hcnkgc3RhdGlzdGljcyBmb3IgYSBzcGVjaWZpYyBleHBlbmRpdHVyZSBjYXRlZ29yeSwgaW5jbHVkaW5nIHRvdGFsIGFtb3VudCwgbW9udGhseSBhdmVyYWdlLCBhbmQgcGVyY2VudGFnZSBvZiBpbmNvbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4cGVuZGl0dXJlU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVuZGl0dXJlU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHZhbHVlIG9mIGFsbCB0aGUgYWdncmVnYXRlZCB0cmFuc2FjdGlvbnMgaW4gdGhpcyBleHBlbmRpdHVyZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZVN1bW1hcnlcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4cGVuZGl0dXJlU3VtbWFyeVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbnRobHlBdmVyYWdlfVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZVN1bW1hcnlcbiAgICAgKi9cbiAgICBtb250aGx5X2F2ZXJhZ2U/OiBNb250aGx5QXZlcmFnZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBvdXRmbG93IHRyYW5zYWN0aW9ucyBpbiB0aGlzIGV4cGVuc2VzIGdyb3VwLCB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93IGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXhwZW5kaXR1cmVTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgaW5mbG93cyB0aGF0IHdhcyBzcGVudCBpbiB0aGlzIGV4cGVuc2VzIGdyb3VwLCB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93IGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwMCByZXByZXNlbnRzIHRoYXQgMTAwJSBvZiB0aGUgaW5mbG93cyB3ZXJlIHNwZW50IG9uIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGlzIGV4cGVuZGl0dXJlIGdyb3VwLiBJZiB0aGVyZVxcJ3Mgbm8gYXZhaWxhYmxlIGluY29tZSBmb3IgdGhlIGdpdmVuIHRpbWUgcGVyaW9kLCB0aGlzIGZpZWxkIHZhbHVlIHdpbGwgYmUgYC0xYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZVN1bW1hcnlcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlX29mX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgY3JlZGl0IGNhdGVnb3JpZXMgb2YgdGhlIGV4cGVuc2VzIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuICBUaGUgY2F0ZWdvcmllcyBhcmUgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHRvdGFsIHZhbHVlIHNwZW50LiBTZWUgdGhlIFtjYXRlZ29yeSB0YXhvbm9teV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NyZWRpdC1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBjYXRlZ29yeSBJRHMuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5RXhwZW5zZXM+fVxuICAgICAqIEBtZW1iZXJvZiBFeHBlbmRpdHVyZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3BfY2F0ZWdvcmllcz86IEFycmF5PENhdGVnb3J5RXhwZW5zZXM+O1xufVxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQgd2FzIGV4cGlyZWQgd2hlbiB0aGUgdmVyaWZpY2F0aW9uIHdhcyBwZXJmb3JtZWQuICBOb3RlOiBJbiB0aGUgY2FzZSB3aGVyZSBhbiBleHBpcmF0aW9uIGRhdGUgaXMgbm90IHByZXNlbnQgb24gdGhlIGRvY3VtZW50IG9yIGZhaWxlZCB0byBiZSBleHRyYWN0ZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFeHBpcmF0aW9uRGF0ZSB7XG4gICAgTm90RXhwaXJlZCA9ICdub3RfZXhwaXJlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBQbGFpZCBhbmQgRkRYLWRlZmluZWQgcmVjaXBpZW50IG1ldGFkYXRhIGZpZWxkc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWNpcGllbnQgbmFtZSBkaXNwbGF5ZWQgYnkgdGhlIERhdGEgUHJvdmlkZXIgZHVyaW5nIHRoZSBjb25zZW50IGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIFJlY2lwaWVudCBMb2dvIFVSTCBsb2NhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBsb2dvX3VyaT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9sZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNhdGVnb3J5IHRoYXQgdGhlIHJlY2lwaWVudCBmYWxscyB1bmRlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIHRoZSByZWNpcGllbnQgZ2FpbmVkIHByb2R1Y3Rpb24gYWNjZXNzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGpvaW5lZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjb25zdW1lcnMgY29ubmVjdGVkIHRvIHRoZSByZWNpcGllbnQgdGhyb3VnaCB0aGlzIERhdGEgUGFydG5lclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uX2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBjYXRlZ29yeSB0aGF0IHRoZSByZWNpcGllbnQgZmFsbHMgdW5kZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhQWxsT2ZcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIHRoZSByZWNpcGllbnQgZ2FpbmVkIHByb2R1Y3Rpb24gYWNjZXNzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgam9pbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbnN1bWVycyBjb25uZWN0ZWQgdG8gdGhlIHJlY2lwaWVudCB0aHJvdWdoIHRoaXMgRGF0YSBQYXJ0bmVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgQWRkaXRpb25hbCBwYXltZW50IGNvbnNlbnQgb3B0aW9ucy4gUGxlYXNlIHVzZSBgcGF5ZXJfZGV0YWlsc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IHVwIHBheW1lbnQgY29uc2VudCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGV4dGVybmFsIHBheW1lbnQgcmVmdW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGJhY3M6IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbD86IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIEZEWCBjb25zZW50IGdyYW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhDb25zZW50R3JhbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhDb25zZW50R3JhbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJzaXN0ZW50IGlkZW50aWZpZXIgb2YgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhDb25zZW50R3JhbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRHcmFudFxuICAgICAqL1xuICAgIHN0YXR1czogRkRYQ29uc2VudEdyYW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIGNvbnNlbnQgd2FzIGluaXRpYWxseSBncmFudGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50XG4gICAgICovXG4gICAgY3JlYXRlZFRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjb25zZW50IGdyYW50IHdhcyBsYXN0IHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRcbiAgICAgKi9cbiAgICB1cGRhdGVkVGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIGNvbnNlbnQgZ3JhbnQgd2lsbCBleHBpcmUuIE9taXR0ZWQgd2hlbiB0aGUgZ3JhbnQgaGFzIG5vIGV4cGlyYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50XG4gICAgICovXG4gICAgZXhwaXJhdGlvblRpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTm9uLWVuZC11c2VyIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiB0aGUgY29uc2VudCBncmFudCAoRGF0YSBSZWNpcGllbnQsIERhdGEgUHJvdmlkZXIsIERhdGEgQWNjZXNzIFBsYXRmb3JtKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYUGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRcbiAgICAgKi9cbiAgICBwYXJ0aWVzOiBBcnJheTxGRFhQYXJ0eT47XG4gICAgLyoqXG4gICAgICogUGVybWlzc2lvbmVkIHJlc291cmNlIGVudHJpZXMuIE9taXR0ZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVzb3VyY2VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxGRFhDb25zZW50R3JhbnRSZXNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRHcmFudFxuICAgICAqL1xuICAgIHJlc291cmNlcz86IEFycmF5PEZEWENvbnNlbnRHcmFudFJlc291cmNlPjtcbn1cbi8qKlxuICogT25lIHBlcm1pc3Npb25lZCByZXNvdXJjZSBvbiBhIGNvbnNlbnQgZ3JhbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWENvbnNlbnRHcmFudFJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYQ29uc2VudEdyYW50UmVzb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhDb25zZW50UmVzb3VyY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50R3JhbnRSZXNvdXJjZVxuICAgICAqL1xuICAgIHJlc291cmNlVHlwZTogRkRYQ29uc2VudFJlc291cmNlVHlwZTtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSBwZXJtaXNzaW9uZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50UmVzb3VyY2VcbiAgICAgKi9cbiAgICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTmFtZXMgb2YgY2x1c3RlcnMgb2YgZGF0YSBlbGVtZW50cyBwZXJtaXNzaW9uZWQuXG4gICAgICogQHR5cGUge0FycmF5PEZEWERhdGFDbHVzdGVyPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudEdyYW50UmVzb3VyY2VcbiAgICAgKi9cbiAgICBkYXRhQ2x1c3RlcnM6IEFycmF5PEZEWERhdGFDbHVzdGVyPjtcbn1cbi8qKlxuICogQ3VycmVudCBzdGF0dXMgb2YgYSBjb25zZW50IGdyYW50LiBPbmUgb2YgYEFDVElWRWAsIGBSRVZPS0VEYCwgYEVYUElSRURgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYQ29uc2VudEdyYW50U3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBSZXZva2VkID0gJ1JFVk9LRUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBUeXBlIG9mIHJlc291cmNlIHBlcm1pc3Npb25lZCBvbiBhIGNvbnNlbnQgZ3JhbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhDb25zZW50UmVzb3VyY2VUeXBlIHtcbiAgICBBY2NvdW50ID0gJ0FDQ09VTlQnLFxuICAgIEN1c3RvbWVyID0gJ0NVU1RPTUVSJyxcbiAgICBEb2N1bWVudCA9ICdET0NVTUVOVCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGJvZHkgZm9yIFBVVCAvZmR4L2NvbnNlbnRzL3tjb25zZW50SWR9L3Jldm9jYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWENvbnNlbnRSZXZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYQ29uc2VudFJldm9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRSZXZvY2F0aW9uXG4gICAgICovXG4gICAgaW5pdGlhdG9yOiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFVwZGF0ZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25cbiAgICAgKi9cbiAgICByZWFzb246IEZEWFVwZGF0ZVJlYXNvbjtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGRlc2NyaXB0aW9uIG9mIGFuIGBPVEhFUmAgcmVhc29uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25cbiAgICAgKi9cbiAgICBvdGhlclJlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSByZXZvY2F0aW9uIHdhcyBlZmZlY3RlZCBvbiB0aGUgaW5pdGlhdG9yXFwncyBzaWRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25cbiAgICAgKi9cbiAgICB1cGRhdGVkVGltZT86IHN0cmluZztcbn1cbi8qKlxuICogT25lIHJldm9jYXRpb24gcmVjb3JkIG9uIGEgY29uc2VudCBncmFudCwgbWlycm9yaW5nIHRoZSBGRFggQ29uc2VudFJldm9jYXRpb24gZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhDb25zZW50UmV2b2NhdGlvblJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWENvbnNlbnRSZXZvY2F0aW9uUmVjb3JkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYQ29uc2VudEdyYW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50UmV2b2NhdGlvblJlY29yZFxuICAgICAqL1xuICAgIHN0YXR1czogRkRYQ29uc2VudEdyYW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhVcGRhdGVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIEZEWENvbnNlbnRSZXZvY2F0aW9uUmVjb3JkXG4gICAgICovXG4gICAgcmVhc29uOiBGRFhVcGRhdGVSZWFzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I6IEZEWFBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjb25zZW50IGdyYW50IHdhcyByZXZva2VkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmRcbiAgICAgKi9cbiAgICB1cGRhdGVkVGltZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmV2b2NhdGlvbiBoaXN0b3J5IG9mIGEgY29uc2VudCBncmFudC4gUmVzcG9uc2UgYm9keSBmb3IgR0VUIC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH0vcmV2b2NhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYQ29uc2VudFJldm9jYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYQ29uc2VudFJldm9jYXRpb25zIHtcbiAgICAvKipcbiAgICAgKiBSZXZvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBjb25zZW50IGdyYW50LCBtb3N0IHJlY2VudCBmaXJzdC4gRW1wdHkgd2hlbiB0aGUgZ3JhbnQgaGFzIG5ldmVyIGJlZW4gcmV2b2tlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmQ+fVxuICAgICAqIEBtZW1iZXJvZiBGRFhDb25zZW50UmV2b2NhdGlvbnNcbiAgICAgKi9cbiAgICByZXZvY2F0aW9uczogQXJyYXk8RkRYQ29uc2VudFJldm9jYXRpb25SZWNvcmQ+O1xufVxuLyoqXG4gKiBUeXBlcyBvZiBkb2N1bWVudCBmb3JtYXRzLiAoU3VnZ2VzdGVkIHZhbHVlcylcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWENvbnRlbnRUeXBlcyB7XG4gICAgQXBwbGljYXRpb25QZGYgPSAnYXBwbGljYXRpb24vcGRmJyxcbiAgICBJbWFnZUdpZiA9ICdpbWFnZS9naWYnLFxuICAgIEltYWdlSnBlZyA9ICdpbWFnZS9qcGVnJyxcbiAgICBJbWFnZVRpZmYgPSAnaW1hZ2UvdGlmZicsXG4gICAgSW1hZ2VQbmcgPSAnaW1hZ2UvcG5nJyxcbiAgICBBcHBsaWNhdGlvbkpzb24gPSAnYXBwbGljYXRpb24vanNvbidcbn1cblxuLyoqXG4gKiBOYW1lIG9mIGEgY2x1c3RlciBvZiBkYXRhIGVsZW1lbnRzIHBlcm1pc3Npb25lZCBieSBhIGNvbnNlbnQgZ3JhbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhEYXRhQ2x1c3RlciB7XG4gICAgQWNjb3VudEJhc2ljID0gJ0FDQ09VTlRfQkFTSUMnLFxuICAgIEFjY291bnREZXRhaWxlZCA9ICdBQ0NPVU5UX0RFVEFJTEVEJyxcbiAgICBBY2NvdW50UGF5bWVudHMgPSAnQUNDT1VOVF9QQVlNRU5UUycsXG4gICAgQmlsbHMgPSAnQklMTFMnLFxuICAgIEN1c3RvbWVyQ29udGFjdCA9ICdDVVNUT01FUl9DT05UQUNUJyxcbiAgICBDdXN0b21lclBlcnNvbmFsID0gJ0NVU1RPTUVSX1BFUlNPTkFMJyxcbiAgICBJbWFnZXMgPSAnSU1BR0VTJyxcbiAgICBJbnZlc3RtZW50cyA9ICdJTlZFU1RNRU5UUycsXG4gICAgTm90aWZpY2F0aW9ucyA9ICdOT1RJRklDQVRJT05TJyxcbiAgICBQYXltZW50U3VwcG9ydCA9ICdQQVlNRU5UX1NVUFBPUlQnLFxuICAgIFJld2FyZHMgPSAnUkVXQVJEUycsXG4gICAgU3RhdGVtZW50cyA9ICdTVEFURU1FTlRTJyxcbiAgICBUYXggPSAnVEFYJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAnVFJBTlNBQ1RJT05TJyxcbiAgICBCYWxhbmNlcyA9ICdCQUxBTkNFUycsXG4gICAgU2NoZWR1bGVkUGF5bWVudHMgPSAnU0NIRURVTEVEX1BBWU1FTlRTJ1xufVxuXG4vKipcbiAqIEN1cnJlbnQgc3RhdHVzIG9mIGluZGljYXRlZCBlbnRpdHkgYWZ0ZXIgcmVwb3J0ZWQgZXZlbnQgY2hhbmdlLiBOb3QgYWxsIHN0YXR1c2VzIHdpbGwgYmUgc3VwcG9ydGVkIG9uIGFsbCBlbnRpdHkgdHlwZXMgYnkgYWxsIGRhdGEgcHJvdmlkZXJzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhFdmVudFN0YXR1cyB7XG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgRXhwaXJlZCA9ICdFWFBJUkVEJyxcbiAgICBSZXZva2VkID0gJ1JFVk9LRUQnLFxuICAgIFN1c3BlbmRlZCA9ICdTVVNQRU5ERUQnXG59XG5cbi8qKlxuICogRmluYW5jaWFsIEluc3RpdHV0aW9uIHByb3ZpZGVyLXNwZWNpZmljIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWEZpQXR0cmlidXRlIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbn1cbi8qKlxuICogUkVTVCBhcHBsaWNhdGlvbiBjb25zdHJhaW50IChIeXBlcm1lZGlhIEFzIFRoZSBFbmdpbmUgT2YgQXBwbGljYXRpb24gU3RhdGUpXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYSGF0ZW9hc0xpbmsge1xuICAgIC8qKlxuICAgICAqIFVSTCB0byBpbnZva2UgdGhlIGFjdGlvbiBvbiB0aGUgcmVzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGhyZWY6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYSGF0ZW9hc0xpbmtBY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgYWN0aW9uPzogRkRYSGF0ZW9hc0xpbmtBY3Rpb247XG4gICAgLyoqXG4gICAgICogUmVsYXRpb24gb2YgdGhpcyBsaW5rIHRvIGl0cyBjb250YWluaW5nIGVudGl0eSwgYXMgZGVmaW5lZCBieSBhbmQgd2l0aCBtYW55IGV4YW1wbGUgcmVsYXRpb24gdmFsdWVzIGF0IFtJRVRGIFJGQzU5ODhdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTk4OClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIHJlbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb250ZW50LXR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYQ29udGVudFR5cGVzPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICB0eXBlcz86IEFycmF5PEZEWENvbnRlbnRUeXBlcz47XG59XG4vKipcbiAqIEhUVFAgTWV0aG9kIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWEhhdGVvYXNMaW5rQWN0aW9uIHtcbiAgICBHZXQgPSAnR0VUJyxcbiAgICBQb3N0ID0gJ1BPU1QnLFxuICAgIFBhdGNoID0gJ1BBVENIJyxcbiAgICBEZWxldGUgPSAnREVMRVRFJyxcbiAgICBQdXQgPSAnUFVUJ1xufVxuXG4vKipcbiAqIEluaXRpYXRvciBGaSBBdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgb2YgY29uc2VudCBvciBwYXltZW50IG5ldHdvcmsgaWRlbnRpZmllciBvciBvdGhlciBlbnRpdHlcXCdzIHJldm9jYXRpb24gcmVxdWVzdCBvciBvdGhlciBsaWZlY3ljbGUgc3RhdHVzIGNoYW5nZSBldmVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhMaWZlY3ljbGVFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWExpZmVjeWNsZUV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYRXZlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEZEWExpZmVjeWNsZUV2ZW50XG4gICAgICovXG4gICAgc3RhdHVzPzogRkRYRXZlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFVwZGF0ZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTGlmZWN5Y2xlRXZlbnRcbiAgICAgKi9cbiAgICByZWFzb24/OiBGRFhVcGRhdGVSZWFzb247XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBkZXNjcmlwdGlvbiBvZiBhbiBgT1RIRVJgIHJlYXNvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWExpZmVjeWNsZUV2ZW50XG4gICAgICovXG4gICAgb3RoZXJSZWFzb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTGlmZWN5Y2xlRXZlbnRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I/OiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogSVNPIDg2MDEgZGF0ZS10aW1lIGluIGZvcm1hdCBcXCdZWVlZLU1NLUREVGhoOm1tOnNzLm5ubltafFsrfC1daGg6bW1dXFwnIGFjY29yZGluZyB0byBbSUVURiBSRkMzMzM5XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMzMzkpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTGlmZWN5Y2xlRXZlbnRcbiAgICAgKi9cbiAgICB1cGRhdGVkVGltZT86IHN0cmluZztcbn1cbi8qKlxuICogUHJvdmlkZXMgdGhlIGJhc2UgZmllbGRzIG9mIGEgbm90aWZpY2F0aW9uLiBDbGllbnRzIHdpbGwgcmVhZCB0aGUgYHR5cGVgIHByb3BlcnR5IHRvIGRldGVybWluZSB0aGUgZXhwZWN0ZWQgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSWQgb2Ygbm90aWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgbm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgdHlwZTogRkRYTm90aWZpY2F0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBpbml0aWF0b3ItZGVmaW5lZCBldmVudCBzdWJ0eXBlIGNvZGUgb3IgZGVzY3JpcHRpb24gaWYgdGhlIGV2ZW50IHR5cGUgbmVlZHMgdG8gYmUgZnVydGhlciBjYXRlZ29yaXplZCBvciBkZXNjcmliZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU08gODYwMSBkYXRlLXRpbWUgaW4gZm9ybWF0IFxcJ1lZWVktTU0tRERUaGg6bW06c3Mubm5uW1p8Wyt8LV1oaDptbV1cXCcgYWNjb3JkaW5nIHRvIFtJRVRGIFJGQzMzMzldKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzMzOSlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZW50T246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBGRFhOb3RpZmljYXRpb25DYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uU2V2ZXJpdHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHNldmVyaXR5PzogRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblByaW9yaXR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmlvcml0eT86IEZEWE5vdGlmaWNhdGlvblByaW9yaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgcHVibGlzaGVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdWJzY3JpYmVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblBheWxvYWR9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIG5vdGlmaWNhdGlvblBheWxvYWQ6IEZEWE5vdGlmaWNhdGlvblBheWxvYWQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBGRFhIYXRlb2FzTGluaztcbn1cbi8qKlxuICogQ2F0ZWdvcnkgb2YgTm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25DYXRlZ29yeSB7XG4gICAgU2VjdXJpdHkgPSAnU0VDVVJJVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBGcmF1ZCA9ICdGUkFVRCcsXG4gICAgQ29uc2VudCA9ICdDT05TRU5UJyxcbiAgICBOZXdEYXRhID0gJ05FV19EQVRBJyxcbiAgICBUb2tlbml6ZWRBY2NvdW50TnVtYmVyID0gJ1RPS0VOSVpFRF9BQ0NPVU5UX05VTUJFUidcbn1cblxuLyoqXG4gKiBDdXN0b20ga2V5LXZhbHVlIHBhaXJzIHBheWxvYWQgZm9yIGEgbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25QYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBJRCBmb3IgdGhlIG9yaWdpbmF0aW9uIGVudGl0eSByZWxhdGVkIHRvIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBpZFR5cGU/OiBGRFhOb3RpZmljYXRpb25QYXlsb2FkSWRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhMaWZlY3ljbGVFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGV2ZW50PzogRkRYTGlmZWN5Y2xlRXZlbnQ7XG59XG4vKipcbiAqIFR5cGUgb2YgZW50aXR5IGNhdXNpbmcgb3JpZ2luYXRpb24gb2YgYSBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGUge1xuICAgIEFjY291bnQgPSAnQUNDT1VOVCcsXG4gICAgQ3VzdG9tZXIgPSAnQ1VTVE9NRVInLFxuICAgIFBhcnR5ID0gJ1BBUlRZJyxcbiAgICBNYWludGVuYW5jZSA9ICdNQUlOVEVOQU5DRScsXG4gICAgQ29uc2VudCA9ICdDT05TRU5UJ1xufVxuXG4vKipcbiAqIFByaW9yaXR5IG9mIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uUHJpb3JpdHkge1xuICAgIEhpZ2ggPSAnSElHSCcsXG4gICAgTWVkaXVtID0gJ01FRElVTScsXG4gICAgTG93ID0gJ0xPVydcbn1cblxuLyoqXG4gKiBTZXZlcml0eSBsZXZlbCBvZiBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblNldmVyaXR5IHtcbiAgICBFbWVyZ2VuY3kgPSAnRU1FUkdFTkNZJyxcbiAgICBBbGVydCA9ICdBTEVSVCcsXG4gICAgV2FybmluZyA9ICdXQVJOSU5HJyxcbiAgICBOb3RpY2UgPSAnTk9USUNFJyxcbiAgICBJbmZvID0gJ0lORk8nXG59XG5cbi8qKlxuICogVHlwZSBvZiBOb3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblR5cGUge1xuICAgIEFjY291bnRUYWtlb3ZlciA9ICdBQ0NPVU5UX1RBS0VPVkVSJyxcbiAgICBBZGRyZXNzQ2hhbmdlZCA9ICdBRERSRVNTX0NIQU5HRUQnLFxuICAgIEJhbGFuY2UgPSAnQkFMQU5DRScsXG4gICAgQ29uc2VudEV4cGlyZWQgPSAnQ09OU0VOVF9FWFBJUkVEJyxcbiAgICBDb25zZW50R3JhbnRlZCA9ICdDT05TRU5UX0dSQU5URUQnLFxuICAgIENvbnNlbnRSZXZva2VkID0gJ0NPTlNFTlRfUkVWT0tFRCcsXG4gICAgQ29uc2VudFVwZGF0ZWQgPSAnQ09OU0VOVF9VUERBVEVEJyxcbiAgICBDdXN0b20gPSAnQ1VTVE9NJyxcbiAgICBNZmFUYXJnZXRDaGFuZ2VkID0gJ01GQV9UQVJHRVRfQ0hBTkdFRCcsXG4gICAgUGhvbmVDaGFuZ2VkID0gJ1BIT05FX0NIQU5HRUQnLFxuICAgIFBsYW5uZWRPdXRhZ2UgPSAnUExBTk5FRF9PVVRBR0UnLFxuICAgIFJpc2sgPSAnUklTSycsXG4gICAgU2VydmljZSA9ICdTRVJWSUNFJyxcbiAgICBTdXNwZWN0ZWRJbmNpZGVudCA9ICdTVVNQRUNURURfSU5DSURFTlQnLFxuICAgIFRhbkFjdGl2YXRlZCA9ICdUQU5fQUNUSVZBVEVEJyxcbiAgICBUYW5DcmVhdGVkID0gJ1RBTl9DUkVBVEVEJyxcbiAgICBUYW5SZXZva2VkID0gJ1RBTl9SRVZPS0VEJyxcbiAgICBUYW5TdXNwZW5kZWQgPSAnVEFOX1NVU1BFTkRFRCdcbn1cblxuLyoqXG4gKiBGRFggUGFydGljaXBhbnQgLSBhbiBlbnRpdHkgb3IgcGVyc29uIHRoYXQgaXMgYSBwYXJ0IG9mIGEgRkRYIEFQSSB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhQYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWFBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBIdW1hbiByZWNvZ25pemFibGUgY29tbW9uIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHR5cGU6IEZEWFBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBVUkkgZm9yIHBhcnR5LCB3aGVyZSBhbiBlbmQgdXNlciBjb3VsZCBsZWFybiBtb3JlIGFib3V0IHRoZSBjb21wYW55IG9yIGFwcGxpY2F0aW9uIGludm9sdmVkIGluIHRoZSBkYXRhIHNoYXJpbmcgY2hhaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIGhvbWVVcmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJJIGZvciBhIGxvZ28gYXNzZXQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSBlbmQgdXNlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgbG9nb1VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHlSZWdpc3RyeX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICByZWdpc3RyeT86IEZEWFBhcnR5UmVnaXN0cnk7XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJlZCBuYW1lIG9mIHBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkRW50aXR5TmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcmVkIGlkIG9mIHBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkRW50aXR5SWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZWdpc3RyeSBjb250YWluaW5nIHRoZSBwYXJ0eVxcJ3MgcmVnaXN0cmF0aW9uIHdpdGggbmFtZSBhbmQgaWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWFBhcnR5UmVnaXN0cnkge1xuICAgIEZkeCA9ICdGRFgnLFxuICAgIEdsZWlmID0gJ0dMRUlGJyxcbiAgICBJY2FubiA9ICdJQ0FOTicsXG4gICAgUHJpdmF0ZSA9ICdQUklWQVRFJ1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHR5cGUgb2YgYSBwYXJ0eVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYUGFydHlUeXBlIHtcbiAgICBEYXRhQWNjZXNzUGxhdGZvcm0gPSAnREFUQV9BQ0NFU1NfUExBVEZPUk0nLFxuICAgIERhdGFQcm92aWRlciA9ICdEQVRBX1BST1ZJREVSJyxcbiAgICBEYXRhUmVjaXBpZW50ID0gJ0RBVEFfUkVDSVBJRU5UJyxcbiAgICBJbmRpdmlkdWFsID0gJ0lORElWSURVQUwnLFxuICAgIE1lcmNoYW50ID0gJ01FUkNIQU5UJyxcbiAgICBWZW5kb3IgPSAnVkVORE9SJ1xufVxuXG4vKipcbiAqIFJlY2lwaWVudCBtZXRhZGF0YSBmaWVsZHMgdGhhdCBhcmUgZGVmaW5lZCBieSBGRFguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWFJlY2lwaWVudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYUmVjaXBpZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSByZWNpcGllbnQgaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBuYW1lIGRpc3BsYXllZCBieSB0aGUgRGF0YSBQcm92aWRlciBkdXJpbmcgdGhlIGNvbnNlbnQgZmxvd1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIFJlY2lwaWVudCBMb2dvIFVSTCBsb2NhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbG9nb191cmk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X2xlZ2FsX25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogUmVhc29uIGZvciBsaWZlY3ljbGUgZXZlbnQgc3RhdHVzIGNoYW5nZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYVXBkYXRlUmVhc29uIHtcbiAgICBCdXNpbmVzc1J1bGUgPSAnQlVTSU5FU1NfUlVMRScsXG4gICAgU2VjdXJpdHlFdmVudCA9ICdTRUNVUklUWV9FVkVOVCcsXG4gICAgVXNlckFjdGlvbiA9ICdVU0VSX0FDVElPTicsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogRmlyZXMgd2hlbiBhbiBhY2NvdW50IGlzIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgdXNpbmcgbWljcm8tZGVwb3NpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQVVUT01BVElDQUxMWV9WRVJJRklFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaWNyby1kZXBvc2l0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZXMgd2hlbiBhbiBhY2NvdW50IGhhcyBhbiBleHBpcmVkIHZlcmlmaWNhdGlvbiB3aGVuIHVzaW5nIG1pY3JvLWRlcG9zaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9FWFBJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWljcm8tZGVwb3NpdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluc2lnaHRzIHN1cnJvdW5kaW5nIGV4dGVybmFsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydGllcyBhc3NvY2lhdGVkIHdpdGggYSB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBpZCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBc3NvY2lhdGVkIGFjY291bnRzLCBkZXRlY3RlZCBiYXNlZCBvbiB0aGUgbmF0dXJlIG9mIHRyYW5zZmVycyB0by9mcm9tIHRoaXMgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PERldGVjdGVkQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBkZXRlY3RlZF9hY2NvdW50czogQXJyYXk8RGV0ZWN0ZWRBY2NvdW50Pjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZml4ZWQgaW5jb21lIHNlY3VyaXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGaXhlZEluY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpeGVkSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7WWllbGRSYXRlfVxuICAgICAqIEBtZW1iZXJvZiBGaXhlZEluY29tZVxuICAgICAqL1xuICAgIHlpZWxkX3JhdGU6IFlpZWxkUmF0ZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1hdHVyaXR5IGRhdGUgZm9yIHRoaXMgZml4ZWQgaW5jb21lIHNlY3VyaXR5LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICBtYXR1cml0eV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpc3N1ZSBkYXRlIGZvciB0aGlzIGZpeGVkIGluY29tZSBzZWN1cml0eSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpeGVkSW5jb21lXG4gICAgICovXG4gICAgaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZmFjZSB2YWx1ZSB0aGF0IGlzIHBhaWQgdXBvbiBtYXR1cml0eSBvZiB0aGUgZml4ZWQgaW5jb21lIHNlY3VyaXR5LCBwZXIgdW5pdCBvZiBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGaXhlZEluY29tZVxuICAgICAqL1xuICAgIGZhY2VfdmFsdWU6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHByZWRpY3RlZCBhdmVyYWdlIG1vbnRobHkgbmV0IGluY29tZSBhbW91bnQuIFRoaXMgYW1vdW50IHJlZmxlY3RzIHRoZSBmdW5kcyBkZXBvc2l0ZWQgaW50byB0aGUgYWNjb3VudCBhbmQgbWF5IG5vdCBpbmNsdWRlIGFueSB3aXRoaGVsZCBpbmNvbWUgc3VjaCBhcyB0YXhlcyBvciBvdGhlciBwYXlyb2xsIGRlZHVjdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRm9yZWNhc3RlZE1vbnRobHlJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JlY2FzdGVkTW9udGhseUluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZvcmVjYXN0ZWQgbW9udGhseSBpbmNvbWUgYXQgdGhlIHRpbWUgb2Ygc3Vic2NyaXB0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRm9yZWNhc3RlZE1vbnRobHlJbmNvbWVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGJhc2VsaW5lX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZm9yZWNhc3RlZCBtb250aGx5IGluY29tZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogRm9ybSAxMDk5IFR5cGVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZvcm0xMDk5VHlwZSB7XG4gICAgVW5rbm93biA9ICdGT1JNXzEwOTlfVFlQRV9VTktOT1dOJyxcbiAgICBNaXNjID0gJ0ZPUk1fMTA5OV9UWVBFX01JU0MnLFxuICAgIEsgPSAnRk9STV8xMDk5X1RZUEVfSydcbn1cblxuLyoqXG4gKiBBbiBhcmJpdHJhcnkgSlNPTiBwYXlsb2FkIHNlbnQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgUGxhaWQgc2VydmVyLiBJbnRlcm5hbCB1c2Ugb25seS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiB0aGUgZnJhdWQgb3IgYXR0ZW1wdGVkIGZyYXVkLiBgZnJhdWRfYW1vdW50YCBzaG91bGQgYmUgb21pdHRlZCB0byBpbmRpY2F0ZSBhbiB1bmtub3duIGZyYXVkIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogSVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdmFsdWUuIFRoaXMgdmFsdWUgY2FuIGJlIDAgdG8gaW5kaWNhdGUgbm8gbW9uZXkgd2FzIGxvc3QuIE11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIChlLmcuLCBgMS4yM2ApLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZnJhdWQgYW5hbHlzaXMgcGVyZm9ybWVkIG9uIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFuYWx5c2lzRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc3VibWl0dGVkIGRvY3VtZW50IHR5cGUgaXMgc3VwcG9ydGVkIGZvciBmcmF1ZCBhbmFseXNpcy4gIGBzdWNjZXNzYCAtIFRoZSBkb2N1bWVudCB0eXBlIGlzIHN1cHBvcnRlZC4gIGBmYWlsZWRgIC0gVGhlIGRvY3VtZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZV9zdXBwb3J0ZWQ6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIG9mIHRoZSBwb3J0cmFpdCBwcmVzZW5jZSBjaGVjay4gIGBzdWNjZXNzYCAtIEEgcG9ydHJhaXQgd2FzIGRldGVjdGVkLiAgYGZhaWxlZGAgLSBObyBwb3J0cmFpdCB3YXMgZGV0ZWN0ZWQuXG4gICAgICogQHR5cGUge0ZyYXVkQ2hlY2tPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIHBvcnRyYWl0X3ByZXNlbmNlX2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgcG9ydHJhaXQgZGV0YWlscyBjaGVjayBpbmNsdWRpbmcgcGhvdG8gZW1iZWRkaW5nIGFuZCBmYWNlIGxhbmRtYXJrIGNoZWNrcy4gIGBzdWNjZXNzYCAtIFRoZSBwb3J0cmFpdCBwYXNzZWQgYWxsIHZhbGlkaXR5IGNoZWNrcy4gIGBmYWlsZWRgIC0gVGhlIHBvcnRyYWl0IGRpZCBub3QgcGFzcyBvbmUgb3IgbW9yZSB2YWxpZGl0eSBjaGVja3MuXG4gICAgICogQHR5cGUge0ZyYXVkQ2hlY2tPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIHBvcnRyYWl0X2RldGFpbHNfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIG9mIHRoZSBpbWFnZSBjb21wb3NpdGlvbiBjaGVjay4gIGBzdWNjZXNzYCAtIFRoZSBpbWFnZSBpcyBhIHZhbGlkIHBoeXNpY2FsIGRvY3VtZW50IGNhcHR1cmUuICBgZmFpbGVkYCAtIFRoZSBpbWFnZSBhcHBlYXJzIHRvIGJlIGEgcGhvdG9ncmFwaCBvZiBhIHNjcmVlbiBvciBhIGRpZ2l0YWwgZm9yZ2VyeS5cbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaW1hZ2VfY29tcG9zaXRpb25fY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIG9mIHRoZSBpbnRlZ3JpdHkgY2hlY2sgZm9yIGRvY3VtZW50IHNlY3VyaXR5IGVsZW1lbnRzLiAgYHN1Y2Nlc3NgIC0gRGF0YSBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgY2hlY2tlZCBzZWN1cml0eSBlbGVtZW50cy4gIGBmYWlsZWRgIC0gSW5jb25zaXN0ZW5jaWVzIHdlcmUgZGV0ZWN0ZWQgYWNyb3NzIG9uZSBvciBtb3JlIHNlY3VyaXR5IGVsZW1lbnRzLlxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBpbnRlZ3JpdHlfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIG9mIHRoZSBkb2N1bWVudCBkZXRhaWwgY2hlY2sgZm9yIGNvcnJlY3Qgc3R5bGluZyBhbmQgbGF5b3V0LiAgYHN1Y2Nlc3NgIC0gVGhlIGRvY3VtZW50IHBhc3NlZCBhbGwgYXV0aGVudGljaXR5IGNoZWNrcy4gIGBmYWlsZWRgIC0gVGhlIGRvY3VtZW50IGRpZCBub3QgcGFzcyBvbmUgb3IgbW9yZSBhdXRoZW50aWNpdHkgY2hlY2tzLlxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBkZXRhaWxfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIG9mIHRoZSBpc3N1ZSBkYXRlIHZhbGlkaXR5IGNoZWNrLiAgYHN1Y2Nlc3NgIC0gVGhlIGlzc3VlIGRhdGUgaXMgdmFsaWQuICBgZmFpbGVkYCAtIFRoZSBpc3N1ZSBkYXRlIGlzIGludmFsaWQgb3IgY291bGQgbm90IGJlIHZlcmlmaWVkLiAgYG5vX2RhdGFgIC0gVGhlIGNoZWNrIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhLlxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaXNzdWVfZGF0ZV9jaGVjazogRnJhdWRDaGVja091dGNvbWVXaXRoTm9EYXRhO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgZnJhdWQgY2hlY2suICAgYHN1Y2Nlc3NgIC0gVGhlIGNoZWNrIHBhc3NlZC4gIGBmYWlsZWRgIC0gVGhlIGNoZWNrIGRpZCBub3QgcGFzcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZyYXVkQ2hlY2tPdXRjb21lIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogVGhlIG91dGNvbWUgb2YgdGhlIGZyYXVkIGNoZWNrLiAgIGBzdWNjZXNzYCAtIFRoZSBjaGVjayBwYXNzZWQuICBgZmFpbGVkYCAtIFRoZSBjaGVjayBkaWQgbm90IHBhc3MuICBgbm9fZGF0YWAgLSBUaGUgY2hlY2sgY291bGQgbm90IGJlIHBlcmZvcm1lZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGEge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogVGhlIHR5cGVzIG9mIEdTRSBSZXBvcnRzIHN1cHBvcnRlZCBieSB0aGUgUGxhaWQgQVBJXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBHU0VSZXBvcnRUeXBlIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBFbXBsb3ltZW50UmVmcmVzaCA9ICdFTVBMT1lNRU5UX1JFRlJFU0gnXG59XG5cbi8qKlxuICogSW5zaWdodHMgaW50byBnYW1ibGluZy1yZWxhdGVkIHRyYW5zYWN0aW9ucywgaW5jbHVkaW5nIGZyZXF1ZW5jeSwgYW1vdW50cywgYW5kIHRvcCBtZXJjaGFudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEdhbWJsaW5nSW5kaWNhdG9yc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdhbWJsaW5nSW5kaWNhdG9ycyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHZhbHVlIG9mIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEdBTUJMSU5HYCBjcmVkaXQgY2F0ZWdvcnksIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBHYW1ibGluZ0luZGljYXRvcnNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb250aGx5QXZlcmFnZX1cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgbW9udGhseV9hdmVyYWdlPzogTW9udGhseUF2ZXJhZ2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVwIHRvIDMgdG9wIG1lcmNoYW50cyB0aGF0IHRoZSB1c2VyIGhhZCB0aGUgbW9zdCB0cmFuc2FjdGlvbnMgZm9yIGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0b3RhbCBzcGVuZC4gIElmIHRoZSB1c2VyIGhhcyBub3Qgc3BlbnQgbW9uZXkgb24gYW55IG1lcmNoYW50cyBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIHRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBHYW1ibGluZ0luZGljYXRvcnNcbiAgICAgKi9cbiAgICB0b3BfbWVyY2hhbnRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEdBTUJMSU5HYCBjcmVkaXQgY2F0ZWdvcnksIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9udGhseSBzdW1tYXJpZXMgb2YgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYEdBTUJMSU5HYCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxNb250aGx5U3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIEdhbWJsaW5nSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIG1vbnRobHlfc3VtbWFyaWVzPzogQXJyYXk8TW9udGhseVN1bW1hcnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0aGF0IGZhbGxzIGludG8gdGhlIGBHQU1CTElOR2AgY2F0ZWdvcnksIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgR2FtYmxpbmdJbmRpY2F0b3JzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9sYXN0X29jY3VycmVuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB1c2VyXFwncyBtb250aGx5IGluZmxvd3MgdGhhdCB3YXMgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgR0FNQkxJTkdgIGNhdGVnb3J5IHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwMCBpbmRpY2F0ZXMgdGhhdCAxMDAlIG9mIHRoZSBpbmZsb3dzIHdlcmUgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgR0FNQkxJTkdgIGNyZWRpdCBjYXRlZ29yeS4gSWYgdGhlcmVcXCdzIG5vIGF2YWlsYWJsZSBpbmNvbWUgZm9yIHRoZSBnaXZlbiB0aW1lIHBlcmlvZCwgdGhpcyBmaWVsZCB2YWx1ZSB3aWxsIGJlIGAtMWBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBHYW1ibGluZ0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlX29mX2luY29tZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5emVkIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnM7XG59XG4vKipcbiAqIEdldENvbnNlbnRzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9jb25zZW50c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2V0Q29uc2VudHNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldENvbnNlbnRzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnNlbnQgZ3JhbnRzIG1hdGNoaW5nIHRoZSBjdXN0b21lcklkIChhbmQgb3B0aW9uYWwgc3RhdHVzKSBmaWx0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PEZEWENvbnNlbnRHcmFudD59XG4gICAgICogQG1lbWJlcm9mIEdldENvbnNlbnRzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2dyYW50czogQXJyYXk8RkRYQ29uc2VudEdyYW50Pjtcbn1cbi8qKlxuICogR2V0UmVjaXBpZW50UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnQve3JlY2lwaWVudElkfWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IG5hbWUgZGlzcGxheWVkIGJ5IHRoZSBEYXRhIFByb3ZpZGVyIGR1cmluZyB0aGUgY29uc2VudCBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsb2dvX3VyaT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEdldFJlY2lwaWVudFJlc3BvbnNlXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfbGVnYWxfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBHZXRSZWNpcGllbnRzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8RXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YT47XG59XG4vKipcbiAqIEEgc3RhdHVzIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIZWFsdGhJbmNpZGVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aEluY2lkZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGluY2lkZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb24gdGhlIGhlYWx0aCBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jaWRlbnRVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGluY2lkZW50X3VwZGF0ZXM6IEFycmF5PEluY2lkZW50VXBkYXRlPjtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBoaXN0b3JpY2FsIGFubnVhbCBpbmNvbWUgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbEFubnVhbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGhpc3RvcmljYWwgYW5udWFsIGluY29tZSBhdCB0aGUgdGltZSBvZiBzdWJzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBiYXNlbGluZV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGhpc3RvcmljYWwgYW5udWFsIGluY29tZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxBbm51YWxJbmNvbWVcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYmFsYW5jZSBoZWxkIGJ5IGFuIGFjY291bnQgaW4gdGhlIHBhc3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSGlzdG9yaWNhbEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGNhbGN1bGF0ZWQgaGlzdG9yaWNhbCBiYWxhbmNlLCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudCwgY2FsY3VsYXRlZCBmcm9tIHRoZSBgY3VycmVudGAgYmFsYW5jZSBpbiB0aGUgYGJhbGFuY2VgIG9iamVjdCBieSBzdWJ0cmFjdGluZyBpbmZsb3dzIGFuZCBhZGRpbmcgYmFjayBvdXRmbG93cyBhY2NvcmRpbmcgdG8gdGhlIHBvc3RlZCBkYXRlIG9mIGVhY2ggdHJhbnNhY3Rpb24uICBJZiB0aGUgYWNjb3VudCBoYXMgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zLCBoaXN0b3JpY2FsIGJhbGFuY2UgYW1vdW50cyBvbiBvciBhZnRlciB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgcGVuZGluZyB0cmFuc2FjdGlvbiBtYXkgZGlmZmVyIGlmIHJldHJpZXZlZCBpbiBzdWJzZXF1ZW50IEFzc2V0IFJlcG9ydHMgYXMgYSByZXN1bHQgb2YgdGhvc2UgcGVuZGluZyB0cmFuc2FjdGlvbnMgcG9zdGluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkIGFuZCBQbGFpZCBoYXMgcHJlcGFyZWQgYXMgbXVjaCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIGRhdGEgYXMgcG9zc2libGUgZm9yIHRoZSBJdGVtLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBiZXlvbmQgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBUaGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSBzZWN1cml0aWVzIGhvbGRpbmcgYXQgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgc2VjdXJpdHlfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gU2VjdXJpdHkgZGF0YSBpcyBub3Qgc3BlY2lmaWMgdG8gYSB1c2VyXFwncyBhY2NvdW50OyBhbnkgdXNlciB3aG8gaGVsZCB0aGUgc2FtZSBzZWN1cml0eSBhdCB0aGUgc2FtZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXQgdGhlIHNhbWUgdGltZSB3b3VsZCBoYXZlIGlkZW50aWNhbCBzZWN1cml0eSBkYXRhLiBUaGUgYHNlY3VyaXR5X2lkYCBmb3IgdGhlIHNhbWUgc2VjdXJpdHkgd2lsbCB0eXBpY2FsbHkgYmUgdGhlIHNhbWUgYWNyb3NzIGRpZmZlcmVudCBpbnN0aXR1dGlvbnMsIGJ1dCB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLiBUaGUgYHNlY3VyaXR5X2lkYCBkb2VzIG5vdCB0eXBpY2FsbHkgY2hhbmdlLCBidXQgbWF5IGNoYW5nZSBpZiBpbmhlcmVudCBkZXRhaWxzIG9mIHRoZSBzZWN1cml0eSBjaGFuZ2UgZHVlIHRvIGEgY29ycG9yYXRlIGFjdGlvbiwgZm9yIGV4YW1wbGUsIGluIHRoZSBldmVudCBvZiBhIHRpY2tlciBzeW1ib2wgY2hhbmdlIG9yIENVU0lQIGNoYW5nZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudCwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGhvbGRpbmcsIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29zdCBiYXNpcyBvZiB0aGUgaG9sZGluZyAoZS5nLiwgdGhlIHRvdGFsIGFtb3VudCBzcGVudCB0byBhY3F1aXJlIGFsbCBhc3NldHMgY3VycmVudGx5IGluIHRoZSBob2xkaW5nKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgY29zdF9iYXNpczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBzZWN1cml0eSBpcyBhbiBvcHRpb24sIGBxdWFudGl0eWAgd2lsbCByZWZsZWN0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3B0aW9ucyAodHlwaWNhbGx5IHRoZSBudW1iZXIgb2YgY29udHJhY3RzIG11bHRpcGxpZWQgYnkgMTAwKSwgbm90IHRoZSBudW1iZXIgb2YgY29udHJhY3RzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHZlc3RlZCBhc3NldHMgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVmVzdGVkIGFzc2V0cyBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggW2VxdWl0aWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHMtaG9sZGluZ3MtZ2V0LXJlc3BvbnNlLXNlY3VyaXRpZXMtdHlwZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHZlc3RlZF9xdWFudGl0eT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB2ZXN0ZWQgaG9sZGluZ3MgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB2ZXN0ZWRfdmFsdWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlci1sb3QgYWNxdWlzaXRpb24gZGF0YSBmb3IgdGhpcyBob2xkaW5nLiBBbiBlbXB0eSBhcnJheSBpbmRpY2F0ZXMgdGhlIGluc3RpdHV0aW9uIGRvZXMgbm90IHByb3ZpZGUgbG90LWxldmVsIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmdUYXhMb3Q+fVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdGF4X2xvdHM/OiBBcnJheTxIb2xkaW5nVGF4TG90Pjtcbn1cbi8qKlxuICogQSBzaW5nbGUgYWNxdWlzaXRpb24gbG90IHdpdGhpbiBhIGhvbGRpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdUYXhMb3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nVGF4TG90IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXFwncyBpZGVudGlmaWVyIGZvciB0aGlzIGxvdC4gTnVsbCBpZiB0aGUgaW5zdGl0dXRpb24gZG9lcyBub3QgcHJvdmlkZSBhIGxvdCBpZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdUYXhMb3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9sb3RfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhpcyBsb3Qgd2FzIGFjcXVpcmVkLCBpbiBJU08gODYwMSBmb3JtYXQuIE51bGwgaWYgdGhlIGluc3RpdHV0aW9uIGRvZXMgbm90IHByb3ZpZGUgYWNxdWlzaXRpb24gZGF0ZXRpbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nVGF4TG90XG4gICAgICovXG4gICAgb3JpZ2luYWxfcHVyY2hhc2VfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW4gdGhpcyBsb3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1RheExvdFxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBwZXIgdW5pdCBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIHRpbWUgdGhpcyBsb3Qgd2FzIGFjcXVpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdUYXhMb3RcbiAgICAgKi9cbiAgICBwdXJjaGFzZV9wcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29zdCBiYXNpcyBvZiB0aGlzIGxvdCwgaW5jbHVzaXZlIG9mIGFueSBmZWVzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdUYXhMb3RcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG1hcmtldCB2YWx1ZSBvZiB0aGlzIGxvdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nVGF4TG90XG4gICAgICovXG4gICAgY3VycmVudF92YWx1ZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ1RheExvdFBvc2l0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1RheExvdFxuICAgICAqL1xuICAgIHBvc2l0aW9uX3R5cGU6IEhvbGRpbmdUYXhMb3RQb3NpdGlvblR5cGUgfCBudWxsO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciBhIGhvbGRpbmcgbG90IHBvc2l0aW9uIGlzIGxvbmcgb3Igc2hvcnQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYExPTkdgIGFuZCBgU0hPUlRgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSG9sZGluZ1RheExvdFBvc2l0aW9uVHlwZSB7XG4gICAgTG9uZyA9ICdMT05HJyxcbiAgICBTaG9ydCA9ICdTSE9SVCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGhvbGRpbmdzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhbiBpbnZlc3RtZW50IGFjY291bnQuIFRoZSB3ZWJob29rIHR5cGljYWxseSBmaXJlcyBpbiByZXNwb25zZSB0byBhbnkgbmV3bHkgYWRkZWQgaG9sZGluZ3Mgb3IgcHJpY2UgY2hhbmdlcyB0byBleGlzdGluZyBob2xkaW5ncywgbW9zdCBjb21tb25seSBhZnRlciBtYXJrZXQgY2xvc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSE9MRElOR1NgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgaG9sZGluZ3MgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaG9sZGluZ3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVwZGF0ZWQgaG9sZGluZ3MgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1cGRhdGVkX2hvbGRpbmdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGhvbGRpbmdzIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC4gTXVzdCBiZSBmb3JtYXR0ZWQgYXMgYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNvc3QgYmFzaXMgb2YgdGhlIGhvbGRpbmcgKGUuZy4sIHRoZSB0b3RhbCBhbW91bnQgc3BlbnQgdG8gYWNxdWlyZSBhbGwgYXNzZXRzIGN1cnJlbnRseSBpbiB0aGUgaG9sZGluZykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGNvc3RfYmFzaXM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHRoZSBhc3NldCBoZWxkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIHZhbGlkIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VjdXJpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHNlY3VyaXR5OiBTZWN1cml0eU92ZXJyaWRlO1xufVxuLyoqXG4gKiBIb3cgUGxhaWQgc2hvdWxkIGRlbGl2ZXIgdGhlIFBsYWlkIExpbmsgc2Vzc2lvbiB0byB0aGUgY3VzdG9tZXIuIE9ubHkgYXZhaWxhYmxlIHRvIGN1c3RvbWVycyBlbmFibGVkIGZvciBMaW5rIERlbGl2ZXJ5IChiZXRhKS4gVG8gcmVxdWVzdCBMaW5rIERlbGl2ZXJ5IGFjY2VzcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci4gXFwnc21zXFwnIHdpbGwgZGVsaXZlciB2aWEgU01TLiBNdXN0IHBhc3MgYHVzZXIucGhvbmVfbnVtYmVyYC4gXFwnZW1haWxcXCcgd2lsbCBkZWxpdmVyIHZpYSBlbWFpbC4gTXVzdCBwYXNzIGB1c2VyLmVtYWlsX2FkZHJlc3NgLiBJbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGlnbm9yZWQ7IHVzZSB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudCB0byB0ZXN0IExpbmsgRGVsaXZlcnkgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2Qge1xuICAgIFNtcyA9ICdzbXMnLFxuICAgIEVtYWlsID0gJ2VtYWlsJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhbiBTTVMgU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMgdmVyaWZpY2F0aW9uIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmFsIHN0YXR1cyBvZiB0aGUgU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMgdmVyaWZpY2F0aW9uLiBXaWxsIGFsd2F5cyBiZSBgTUFOVUFMTFlfVkVSSUZJRURgIG9yIGBWRVJJRklDQVRJT05fRkFJTEVEYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgb2YgdGhlIGFmZmVjdGVkIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgaHVtYW4gcmV2aWV3IGNoZWNrLCB3aGljaCByZWZlcnMgdG8gYSBjaGVjayB0aGF0IGlzIHBlcmZvcm1lZCBieSBhIGRvY3VtZW50IHNwZWNpYWxpc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEh1bWFuUmV2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHVtYW5SZXZpZXcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIdW1hblJldmlld1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSHVtYW5SZXZpZXdcbiAgICAgKi9cbiAgICBzdGF0dXM6IEh1bWFuUmV2aWV3U3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgaHVtYW4gcmV2aWV3IGNoZWNrLCB3aGVuIGF2YWlsYWJsZS4gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHBvc3NpYmxlOiAgIGBzdWNjZXNzYCAtIFRoZSBkb2N1bWVudCBwYXNzZWQgdGhlIGNoZWNrLiAgYGZhaWxlZGAgLSBUaGUgZG9jdW1lbnQgZmFpbGVkIHRoZSBjaGVjay4gIGBub19kYXRhYCAtIFRoZSBkb2N1bWVudCB3YXMgc3VibWl0dGVkLCBidXQgdGhlIGRvY3VtZW50IHNwZWNpYWxpc3QgcmV2aWV3IHdhcyBub3QgY29tcGxldGVkIGluIHRpbWUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBIdW1hblJldmlld1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIGdsb2JhbGx5IHVuaXF1ZSBhbmQgaHVtYW4gcmVhZGFibGUgSUQgdHlwZSwgc3BlY2lmaWMgdG8gdGhlIGNvdW50cnkgYW5kIGRvY3VtZW50IGNhdGVnb3J5LiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24vI2lkLW51bWJlcnMpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSUROdW1iZXJUeXBlIHtcbiAgICBBckRuaSA9ICdhcl9kbmknLFxuICAgIEF1RHJpdmVyc0xpY2Vuc2UgPSAnYXVfZHJpdmVyc19saWNlbnNlJyxcbiAgICBBdVBhc3Nwb3J0ID0gJ2F1X3Bhc3Nwb3J0JyxcbiAgICBCckNwZiA9ICdicl9jcGYnLFxuICAgIENhU2luID0gJ2NhX3NpbicsXG4gICAgQ2xSdW4gPSAnY2xfcnVuJyxcbiAgICBDblJlc2lkZW50Q2FyZCA9ICdjbl9yZXNpZGVudF9jYXJkJyxcbiAgICBDb05pdCA9ICdjb19uaXQnLFxuICAgIERrQ3ByID0gJ2RrX2NwcicsXG4gICAgRWdOYXRpb25hbElkID0gJ2VnX25hdGlvbmFsX2lkJyxcbiAgICBFc0RuaSA9ICdlc19kbmknLFxuICAgIEVzTmllID0gJ2VzX25pZScsXG4gICAgSGtIa2lkID0gJ2hrX2hraWQnLFxuICAgIEluUGFuID0gJ2luX3BhbicsXG4gICAgSW5FcGljID0gJ2luX2VwaWMnLFxuICAgIEl0Q2YgPSAnaXRfY2YnLFxuICAgIEpvQ2l2aWxJZCA9ICdqb19jaXZpbF9pZCcsXG4gICAgSnBNeU51bWJlciA9ICdqcF9teV9udW1iZXInLFxuICAgIEtlSHVkdW1hTmFtYmEgPSAna2VfaHVkdW1hX25hbWJhJyxcbiAgICBLd0NpdmlsSWQgPSAna3dfY2l2aWxfaWQnLFxuICAgIE14Q3VycCA9ICdteF9jdXJwJyxcbiAgICBNeFJmYyA9ICdteF9yZmMnLFxuICAgIE15TnJpYyA9ICdteV9ucmljJyxcbiAgICBOZ05pbiA9ICduZ19uaW4nLFxuICAgIE56RHJpdmVyc0xpY2Vuc2UgPSAnbnpfZHJpdmVyc19saWNlbnNlJyxcbiAgICBPbUNpdmlsSWQgPSAnb21fY2l2aWxfaWQnLFxuICAgIFBoUHNuID0gJ3BoX3BzbicsXG4gICAgUGxQZXNlbCA9ICdwbF9wZXNlbCcsXG4gICAgUm9DbnAgPSAncm9fY25wJyxcbiAgICBTYU5hdGlvbmFsSWQgPSAnc2FfbmF0aW9uYWxfaWQnLFxuICAgIFNlUGluID0gJ3NlX3BpbicsXG4gICAgU2dOcmljID0gJ3NnX25yaWMnLFxuICAgIFRyVGNLaW1saWsgPSAndHJfdGNfa2ltbGlrJyxcbiAgICBVc1NzbiA9ICd1c19zc24nLFxuICAgIFVzU3NuTGFzdDQgPSAndXNfc3NuX2xhc3RfNCcsXG4gICAgWmFTbWFydElkID0gJ3phX3NtYXJ0X2lkJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgUHJvdGVjdCBldmVudCBpbmNsdWRpbmcgVHJ1c3QgSW5kZXggc2NvcmUgYW5kIGZyYXVkIGF0dHJpYnV0ZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElEVlByb3RlY3RFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEVlByb3RlY3RFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElEVlByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgZXZlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSURWUHJvdGVjdEV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RydXN0SW5kZXh9XG4gICAgICogQG1lbWJlcm9mIElEVlByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIHRydXN0X2luZGV4OiBUcnVzdEluZGV4IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFdmVudCBmcmF1ZCBhdHRyaWJ1dGVzIGFzIGFuIGFyYml0cmFyeSBzZXQgb2Yga2V5LXZhbHVlIHBhaXJzLiBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgcmV0dXJuZWQgdmFyaWVzIGJ5IG1vZGVsLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgSURWUHJvdGVjdEV2ZW50XG4gICAgICovXG4gICAgZnJhdWRfYXR0cmlidXRlczogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSVNPQ3VycmVuY3lDb2RlIHtcbiAgICBVc2QgPSAnVVNEJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBjaGFuZ2UgdG8gaWRlbnRpdHkgZGF0YSBoYXMgYmVlbiBkZXRlY3RlZCBvbiBhbiBJdGVtLiBJdGVtcyBhcmUgY2hlY2tlZCBmb3IgaWRlbnRpdHkgdXBkYXRlcyBldmVyeSAzMC05MCBkYXlzLiBXZSByZWNvbW1lbmQgdGhhdCB1cG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2sgeW91IG1ha2UgYW5vdGhlciBjYWxsIHRvIGAvaWRlbnRpdHkvZ2V0YCB0byBmZXRjaCB0aGUgdXNlclxcJ3MgbGF0ZXN0IGlkZW50aXR5IGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGgga2V5cyBvZiBgYWNjb3VudF9pZGBcXCdzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIGlkZW50aXR5IGF0dHJpYnV0ZXMgdGhhdCBjaGFuZ2VkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcIlBIT05FU1xcXCJdIH1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IEFycmF5PElkZW50aXR5VXBkYXRlVHlwZXM+OyB9fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2lkZW50aXR5OiB7IFtrZXk6IHN0cmluZ106IEFycmF5PElkZW50aXR5VXBkYXRlVHlwZXM+OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbiBjbG9zZWQgYmV0YS4gT2JqZWN0IHJlcHJlc2VudGluZyBtZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBCb29sZWFuIGZpZWxkIGluZGljYXRpbmcgaWYgdGhlIHVwbG9hZGVkIGRvY3VtZW50XFwncyBhY2NvdW50IG51bWJlciBtYXRjaGVzIHRoZSBhY2NvdW50IG51bWJlciB3ZSBoYXZlIG9uIGZpbGVcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9udW1iZXJfbWF0Y2g/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB1cGxvYWRlZF9hdD86IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnQgb2JqZWN0IHdpdGggbWV0YWRhdGEgb2YgdGhlIHVwbG9hZGVkIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkIHtcbiAgICAvKipcbiAgICAgKiBBIFVVSUQgaWRlbnRpZnlpbmcgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICByaXNrX2luc2lnaHRzPzogSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0cztcbn1cbi8qKlxuICogTWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN1Ym1pdHRlZCBkb2N1bWVudCB0eXBlLiBDdXJyZW50bHksIHRoaXMgd2lsbCBhbHdheXMgYmUgYEJBTktfU1RBVEVNRU5UYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCb29sZWFuIGZpZWxkIGluZGljYXRpbmcgd2hldGhlciB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZS4gSWYgYGZhbHNlYCwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VwdCB0aGUgdXBsb2FkZWQgaWRlbnRpdHkgZGF0YSBhcyBhY2N1cmF0ZSB3aXRob3V0IGZ1cnRoZXIgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIHBhZ2VfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgZG9jdW1lbnQgd2FzIGxhc3QgdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBkb2N1bWVudCB3YXMgb3JpZ2luYWxseSB1cGxvYWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGFcbiAgICAgKi9cbiAgICB1cGxvYWRlZF9hdD86IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IHJlcHJlc2VudGluZyBmcmF1ZCByaXNrIGRhdGEgb2YgdGhlIHVwbG9hZGVkIGRvY3VtZW50LiBPbmx5IHByb3ZpZGVkIHdoZW4gdXNpbmcgSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkIHdpdGggRnJhdWQgUmlzayBlbmFibGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJpc2tfc3VtbWFyeT86IElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiByaXNrIHNpZ25hbHMuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJpc2tfc2lnbmFscz86IEFycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogUmlzayBzaWduYWxzIHRpZWQgdG8gdGhlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHJpc2sgZm91bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBmcmF1ZCByaXNrIHdhcyBkZXRlY3RlZCBmb3IgdGhpcyByaXNrIHNpZ25hbC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBoYXNfZnJhdWRfcmlzaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gcHJvdmlkaW5nIG1vcmUgZGV0YWlsIGFib3V0IHRoZSBzcGVjaWZpYyByaXNrIHNpZ25hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIHNpZ25hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByaXNrIHNpZ25hbC4gSWYgdGhlIHJpc2sgc2lnbmFsIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwYWdlLCB0aGUgdmFsdWUgd2lsbCBiZSAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcGFnZV9udW1iZXI/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBSaXNrIHN1bW1hcnkgb2YgYW4gdXBsb2FkZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZSwgd2hlcmUgYSBzY29yZSBjbG9zZXIgdG8gMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgdHJ1c3R3b3J0aHkgYW5kIGEgc2NvcmUgY2xvc2VyIHRvIDEwMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgZnJhdWR1bGVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1N1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX3Njb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9tYXRjaGAgcmVzdWx0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aXR5TWF0Y2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBtYXRjaCBoYXMgYmVlbiByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZSwgcGhvbmUgbnVtYmVyLCBlbWFpbCBhZGRyZXNzIGFuZCBhZGRyZXNzIHVzZWQgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaC4gSWYgRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgaXMgZW5hYmxlZCBpbiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QsIGxlYXZlIHRoaXMgZmllbGQgZW1wdHkgdG8gYXV0b21hdGljYWxseSBtYXRjaCBhZ2FpbnN0IFBJSSBjb2xsZWN0ZWQgZnJvbSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGNoZWNrcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoVXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTc0NTIxMzBcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4gUGhvbmUgbnVtYmVyIGlucHV0IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHZhbGlkIG51bWJlciByYW5nZXM7IG51bWJlciBzdHJpbmdzIHRoYXQgZG8gbm90IG1hdGNoIGEgcmVhbC13b3JsZCBwaG9uZSBudW1iZXJpbmcgc2NoZW1lIG1heSBjYXVzZSB0aGUgcmVxdWVzdCB0byBmYWlsLCBldmVuIGluIHRoZSBTYW5kYm94IHRlc3QgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkcyB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aXR5UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcG9zc2libGUgdHlwZXMgb2YgaWRlbnRpdHkgZGF0YSB0aGF0IG1heSBoYXZlIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVVwZGF0ZVR5cGVzIHtcbiAgICBQaG9uZXMgPSAnUEhPTkVTJyxcbiAgICBBZGRyZXNzZXMgPSAnQUREUkVTU0VTJyxcbiAgICBFbWFpbHMgPSAnRU1BSUxTJyxcbiAgICBOYW1lcyA9ICdOQU1FUydcbn1cblxuLyoqXG4gKiBBbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHNoYXJlYWJsZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogU2VsZmllQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHZlcmlmeV9zbXM6IFZlcmlmeVNNU0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQmVhY29uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgUGxhaWQgUHJvdGVjdC4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgdXNlcnMgb2YgdGhlIGRlcHJlY2F0ZWQgQmVhY29uIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBgdXNlcl9pZGAgbWF5IG9ubHkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X3VzZXJfaWRgIGlmIHlvdSB3ZXJlIG5vdCBhIHByZS1leGlzdGluZyB1c2VyIG9mIGAvdXNlci9jcmVhdGVgIGFzIG9mIERlY2VtYmVyIDEwLCAyMDI1LCBvciBpZiB5b3UgaGF2ZSBzaW5jZSBbbWlncmF0ZWQgdG8gdGhlIG5ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL21pZ3JhdGUtdG8tbmV3LXVzZXItYXBpcyk7IGZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS4gSWYgYm90aCB0aGlzIGZpZWxkIGFuZCBhIGBjbGllbnRfdXNlcl9pZGAgYXJlIHByZXNlbnQgaW4gYSByZXF1ZXN0LCB0aGUgYHVzZXJfaWRgIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lEVlByb3RlY3RFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBsYXRlc3Rfc2NvcmVkX3Byb3RlY3RfZXZlbnQ/OiBJRFZQcm90ZWN0RXZlbnQgfCBudWxsO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gYXV0b2ZpbGxlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN1YmRpdmlzaW9uIGNvZGUuIFxcXCJTdWJkaXZpc2lvblxcXCIgaXMgYSBnZW5lcmljIHRlcm0gZm9yIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBldGMuIEZvciB0aGUgbGlzdCBvZiB2YWxpZCBjb2Rlcywgc2VlIFtjb3VudHJ5IHN1YmRpdmlzaW9uIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY291bnRyeV9zdWJkaXZpc2lvbl9jb2Rlcy5qc29uKS4gQ291bnRyeSBwcmVmaXhlcyBhcmUgb21pdHRlZCwgc2luY2UgdGhleSBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYGNvdW50cnlgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BPQm94U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgdHlwZTogQWRkcmVzc1B1cnBvc2VMYWJlbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXV0b2ZpbGwgcmVwcmVzZW50cyB1bnZlcmlmaWVkIGN1c3RvbWVyIGluZm9ybWF0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNvbmZpcm1lZCBieSB0aGUgY3VzdG9tZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhdXRvZmlsbCBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXV0b2ZpbGxlZC4gQWxsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBieSB0aGUgdXNlciBiZWZvcmUgdXNpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBjYWxsaW5nIGAvdXNlci9jcmVhdGVgLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhlIGB1c2VyX2lkYCBtYXkgb25seSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfdXNlcl9pZGAgaWYgeW91IHdlcmUgbm90IGEgcHJlLWV4aXN0aW5nIHVzZXIgb2YgYC91c2VyL2NyZWF0ZWAgYXMgb2YgRGVjZW1iZXIgMTAsIDIwMjUsIG9yIGlmIHlvdSBoYXZlIHNpbmNlIFttaWdyYXRlZCB0byB0aGUgbmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvbWlncmF0ZS10by1uZXctdXNlci1hcGlzKTsgZm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLiBJZiBib3RoIHRoaXMgZmllbGQgYW5kIGEgYGNsaWVudF91c2VyX2lkYCBhcmUgcHJlc2VudCBpbiBhIHJlcXVlc3QsIHRoZSBgdXNlcl9pZGAgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3NoYXJlYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgYWdyZWVkIHRvIGEgcHJpdmFjeSBwb2xpY3kgc3BlY2lmeWluZyB0aGF0IHRoZWlyIGRhdGEgd2lsbCBiZSBzaGFyZWQgd2l0aCBQbGFpZCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzLiAgSWYgYGdhdmVfY29uc2VudGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIGBhY2NlcHRfdG9zYCBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBza2lwcGVkYCBhbmQgdGhlIGVuZCB1c2VyXFwncyBzZXNzaW9uIHdpbGwgc3RhcnQgYXQgdGhlIG5leHQgc3RlcCByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZ2F2ZV9jb25zZW50OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmbGFnIHNwZWNpZnlpbmcgaG93IHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGhhbmRsZSBhdHRlbXB0cyB0byBjcmVhdGUgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdoZW4gYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgcHJvdmlkZWQgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgLCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgaWRlbXBvdGVuY3kgaXMgZW5hYmxlZCwgUGxhaWQgd2lsbCByZXR1cm4gdGhlIGV4aXN0aW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbi4gSWYgaWRlbXBvdGVuY3kgaXMgZGlzYWJsZWQsIFBsYWlkIHdpbGwgcmVqZWN0IHRoZSByZXF1ZXN0IHdpdGggYSBgNDAwIEJhZCBSZXF1ZXN0YCBzdGF0dXMgY29kZSBpZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBzdXBwbGllZCBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIGFuZCBgdGVtcGxhdGVfaWRgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19pZGVtcG90ZW50PzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gY29sbGVjdGVkIG91dHNpZGUgb2YgTGluaywgbW9zdCBsaWtlbHkgdmlhIHlvdXIgb3duIG9uYm9hcmRpbmcgcHJvY2Vzcy4gIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBpZGVudGl0eSBmaWVsZHMgYXJlIG9wdGlvbmFsOiAgYGVtYWlsX2FkZHJlc3NgICBgcGhvbmVfbnVtYmVyYCAgYGRhdGVfb2ZfYmlydGhgICBgbmFtZWAgIGBhZGRyZXNzYCAgYGlkX251bWJlcmAgIFNwZWNpZmljYWxseSwgdGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCBpbiB0aGF0IHRoZXkgY2FuIGVpdGhlciBiZSBmdWxseSBwcm92aWRlZCAoc2F0aXNmeWluZyBldmVyeSByZXF1aXJlZCBmaWVsZCBpbiB0aGVpciBzdWJzY2hlbWEpIG9yIG9taXR0ZWQgZnJvbSB0aGUgcmVxdWVzdCBlbnRpcmVseSBieSBub3QgcHJvdmlkaW5nIHRoZSBrZXkgb3IgdmFsdWUuIFByb3ZpZGluZyB0aGVzZSBmaWVsZHMgdmlhIHRoZSBBUEkgd2lsbCByZXN1bHQgaW4gTGluayBza2lwcGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEFsbCB2ZXJpZmljYXRpb24gc3RlcHMgZW5hYmxlZCBpbiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gVGVtcGxhdGUgd2lsbCBzdGlsbCBiZSBydW4uIFZlcmlmaWNhdGlvbiBzdGVwcyB3aWxsIGVpdGhlciBiZSBydW4gaW1tZWRpYXRlbHksIG9yIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYGdhdmVfY29uc2VudGAgZmllbGQuIElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzaGFyZWFibGUgVVJMIGZlYXR1cmUsIHlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIHRoZXNlIGZpZWxkcyB2aWEgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaW5zdGVhZDsgYm90aCBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGFuZCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhcmUgdmFsaWQgd2F5cyB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24uIE5vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSBhIG5vbi1gbnVsbGAgdXNlciBkYXRhIG9iamVjdCB2aWEgYC9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlYCwgYW55IHVzZXIgZGF0YSBmaWVsZHMgZW50ZXJlZCB2aWEgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZm9yIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAgd2lsbCBiZSBpZ25vcmVkIHdoZW4gcHJlZmlsbGluZyBMaW5rLiAgVGhlIGBpcF9hZGRyZXNzYCBmaWVsZCBpcyBvcHRpb25hbC4gUHJvdmlkZSB0aGUgZW5kIHVzZXJcXCdzIElQIGFkZHJlc3MgdG8gZW5hYmxlIElQLWJhc2VkIHJpc2sgY2hlY2tzIGZvciBiYWNrZW5kLW9ubHkgaW50ZWdyYXRpb25zIHRoYXQgZG8gbm90IHVzZSB0aGUgTGluayBTREs7IHdoZW4gdGhlIExpbmsgU0RLIGlzIHVzZWQsIHRoZSBJUCBhZGRyZXNzIGlzIGNvbGxlY3RlZCBhdXRvbWF0aWNhbGx5LiBVbmxpa2UgdGhlIGlkZW50aXR5IGZpZWxkcyBhYm92ZSwgYGlwX2FkZHJlc3NgIGNhbm5vdCBiZSBwcm92aWRlZCB2aWEgYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5aW5nIGB1c2VyLmNsaWVudF91c2VyX2lkYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcHJvdmlkZSBgY2xpZW50X3VzZXJfaWRgIGF0IHRoZSByb290IGxldmVsIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVB2NiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEJlYWNvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFBsYWlkIFByb3RlY3QuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIHVzZXJzIG9mIHRoZSBkZXByZWNhdGVkIEJlYWNvbiBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgY2FsbGluZyBgL3VzZXIvY3JlYXRlYC4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBgdXNlcl9pZGAgbWF5IG9ubHkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X3VzZXJfaWRgIGlmIHlvdSB3ZXJlIG5vdCBhIHByZS1leGlzdGluZyB1c2VyIG9mIGAvdXNlci9jcmVhdGVgIGFzIG9mIERlY2VtYmVyIDEwLCAyMDI1LCBvciBpZiB5b3UgaGF2ZSBzaW5jZSBbbWlncmF0ZWQgdG8gdGhlIG5ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL21pZ3JhdGUtdG8tbmV3LXVzZXItYXBpcyk7IGZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS4gSWYgYm90aCB0aGlzIGZpZWxkIGFuZCBhIGBjbGllbnRfdXNlcl9pZGAgYXJlIHByZXNlbnQgaW4gYSByZXF1ZXN0LCB0aGUgYHVzZXJfaWRgIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRFZQcm90ZWN0RXZlbnR9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXRlc3Rfc2NvcmVkX3Byb3RlY3RfZXZlbnQ/OiBJRFZQcm90ZWN0RXZlbnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIFRoZSBhZGRyZXNzIG11c3QgYXQgbGVhc3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB0byBiZSBhIHZhbGlkIGFkZHJlc3M6IGBzdHJlZXRgLCBgY2l0eWAsIGBjb3VudHJ5YC4gSWYgYW55IGFyZSBtaXNzaW5nIG9yIHVuYWJsZSB0byBiZSBleHRyYWN0ZWQsIHRoZSBhZGRyZXNzIHdpbGwgYmUgbnVsbC4gIGByZWdpb25gLCBhbmQgYHBvc3RhbF9jb2RlYCBtYXkgYmUgbnVsbCBiYXNlZCBvbiB0aGUgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlICBOb3RlOiBPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiAoT0NSKSB0ZWNobm9sb2d5IG1heSBzb21ldGltZXMgZXh0cmFjdCBpbmNvcnJlY3QgZGF0YSBmcm9tIGEgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENpdHkgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpbmRpdmlkdWFsXFwncyBuYW1lIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQmVhY29uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgUGxhaWQgUHJvdGVjdC4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgdXNlcnMgb2YgdGhlIGRlcHJlY2F0ZWQgQmVhY29uIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBjYWxsaW5nIGAvdXNlci9jcmVhdGVgLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhlIGB1c2VyX2lkYCBtYXkgb25seSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfdXNlcl9pZGAgaWYgeW91IHdlcmUgbm90IGEgcHJlLWV4aXN0aW5nIHVzZXIgb2YgYC91c2VyL2NyZWF0ZWAgYXMgb2YgRGVjZW1iZXIgMTAsIDIwMjUsIG9yIGlmIHlvdSBoYXZlIHNpbmNlIFttaWdyYXRlZCB0byB0aGUgbmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvbWlncmF0ZS10by1uZXctdXNlci1hcGlzKTsgZm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLiBJZiBib3RoIHRoaXMgZmllbGQgYW5kIGEgYGNsaWVudF91c2VyX2lkYCBhcmUgcHJlc2VudCBpbiBhIHJlcXVlc3QsIHRoZSBgdXNlcl9pZGAgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lEVlByb3RlY3RFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxhdGVzdF9zY29yZWRfcHJvdGVjdF9ldmVudD86IElEVlByb3RlY3RFdmVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBjYWxsaW5nIGAvdXNlci9jcmVhdGVgLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhlIGB1c2VyX2lkYCBtYXkgb25seSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfdXNlcl9pZGAgaWYgeW91IHdlcmUgbm90IGEgcHJlLWV4aXN0aW5nIHVzZXIgb2YgYC91c2VyL2NyZWF0ZWAgYXMgb2YgRGVjZW1iZXIgMTAsIDIwMjUsIG9yIGlmIHlvdSBoYXZlIHNpbmNlIFttaWdyYXRlZCB0byB0aGUgbmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvbWlncmF0ZS10by1uZXctdXNlci1hcGlzKTsgZm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLiBJZiBib3RoIHRoaXMgZmllbGQgYW5kIHRoZSBgY2xpZW50X3VzZXJfaWRgIGFyZSBwcmVzZW50IGluIHRoZSByZXF1ZXN0LCB0aGUgYHVzZXJfaWRgIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBQbGFpZCBzZXNzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBzZXNzaW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxJZGVudGl0eVZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczogQXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXIge1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBZb3UgY2FuIHVzZSB0aGlzIGZpZWxkIHRvIHByZS1wb3B1bGF0ZSB0aGUgdXNlclxcJ3MgbGVnYWwgbmFtZTsgaWYgaXQgaXMgcHJvdmlkZWQgaGVyZSwgdGhleSB3aWxsIG5vdCBiZSBwcm9tcHRlZCB0byBlbnRlciB0aGVpciBuYW1lIGluIHRoZSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBwcm92aWRlZCBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhlaXIgbmFtZSwgdGhpcyBmaWVsZCB3aWxsIGJlIG51bGwuIE90aGVyd2lzZSwgYm90aCBmaWVsZHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gcmV0cmllZCwgd2hpY2ggY2FuIGJlIHRyaWdnZXJlZCB2aWEgdGhlIGRhc2hib2FyZCBvciB0aGUgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElERU5USVRZX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFVFJJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHJldHJ5aW5nIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RyYXRlZ3l9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc3RyYXRlZ3k6IFN0cmF0ZWd5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGVwcz86IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gZXhwb3NlIGEgc2hhcmVhYmxlIFVSTCBmb3IgdGhlIHZlcmlmaWNhdGlvbiBiZWluZyByZXRyaWVkLiBJZiBhIHZhbHVlIGZvciB0aGlzIGZsYWcgaXMgbm90IHNwZWNpZmllZCwgdGhlIGBpc19zaGFyZWFibGVgIHNldHRpbmcgZnJvbSB0aGUgb3JpZ2luYWwgdmVyaWZpY2F0aW9uIGF0dGVtcHQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3NoYXJlYWJsZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0cnVjdGlvbnMgZm9yIHRoZSBgY3VzdG9tYCByZXRyeSBzdHJhdGVneSBzcGVjaWZ5aW5nIHdoaWNoIHN0ZXBzIHNob3VsZCBiZSByZXF1aXJlZCBvciBza2lwcGVkLiAgIE5vdGU6ICAgVGhpcyBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gdGhlIHJldHJ5IHN0cmF0ZWd5IGlzIGBjdXN0b21gIGFuZCBtdXN0IGJlIG9taXR0ZWQgb3RoZXJ3aXNlLiAgQ3VzdG9tIHJldHJpZXMgb3ZlcnJpZGUgc2V0dGluZ3MgaW4geW91ciBQbGFpZCBUZW1wbGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgUGxhaWQgVGVtcGxhdGUgaGFzIGB2ZXJpZnlfc21zYCBkaXNhYmxlZCwgYSBjdXN0b20gcmV0cnkgd2l0aCBgdmVyaWZ5X3Ntc2AgZW5hYmxlZCB3aWxsIHN0aWxsIHJlcXVpcmUgdGhlIHN0ZXAuICBUaGUgYHNlbGZpZV9jaGVja2Agc3RlcCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiB0aGUgc2FuZGJveCBzZXJ2ZXIuIFNhbmRib3ggcmVxdWVzdHMgd2lsbCBzaWxlbnRseSBkaXNhYmxlIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIHdoZW4gcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBgdmVyaWZ5X3Ntc2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHZlcmlmeV9zbXM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYGt5Y19jaGVja2AgKERhdGEgU291cmNlIFZlcmlmaWNhdGlvbikgc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIGt5Y19jaGVjazogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAuIElmIGEgcHJldmlvdXMgc2Vzc2lvbiBoYXMgYWxyZWFkeSBwYXNzZWQgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAsIHRoZSBuZXcgc2VsZmllIGNoZWNrIHdpbGwgYmUgYSBTZWxmaWUgUmVhdXRoZW50aWNhdGlvbiBjaGVjaywgaW4gd2hpY2ggdGhlIHNlbGZpZSBpcyB0ZXN0ZWQgZm9yIGxpdmVuZXNzIGFuZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgcHJldmlvdXMgc2VsZmllLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHByZXZpb3VzX2F0dGVtcHRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaGFyZWFibGUgVVJMIHRoYXQgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIHVzZXIgdG8gY29tcGxldGUgdmVyaWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogRG9jdW1lbnRhcnlWZXJpZmljYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBSaXNrQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZ5U01TRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQmVhY29uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgUGxhaWQgUHJvdGVjdC4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgdXNlcnMgb2YgdGhlIGRlcHJlY2F0ZWQgQmVhY29uIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGNhbGxpbmcgYC91c2VyL2NyZWF0ZWAuIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgYHVzZXJfaWRgIG1heSBvbmx5IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF91c2VyX2lkYCBpZiB5b3Ugd2VyZSBub3QgYSBwcmUtZXhpc3RpbmcgdXNlciBvZiBgL3VzZXIvY3JlYXRlYCBhcyBvZiBEZWNlbWJlciAxMCwgMjAyNSwgb3IgaWYgeW91IGhhdmUgc2luY2UgW21pZ3JhdGVkIHRvIHRoZSBuZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy9taWdyYXRlLXRvLW5ldy11c2VyLWFwaXMpOyBmb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIElmIGJvdGggdGhpcyBmaWVsZCBhbmQgYSBgY2xpZW50X3VzZXJfaWRgIGFyZSBwcmVzZW50IGluIGEgcmVxdWVzdCwgdGhlIGB1c2VyX2lkYCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lEVlByb3RlY3RFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgbGF0ZXN0X3Njb3JlZF9wcm90ZWN0X2V2ZW50PzogSURWUHJvdGVjdEV2ZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoaXMgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuICAgYGFjdGl2ZWAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaXMgaW5jb21wbGV0ZS4gVGhlIHVzZXIgbWF5IGhhdmUgY29tcGxldGVkIHBhcnQgb2YgdGhlIHNlc3Npb24sIGJ1dCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHBhc3NlZC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkLCBwYXNzaW5nIGFsbCBzdGVwcyBkZWZpbmVkIHRvIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS4gIGBmYWlsZWRgIC0gVGhlIHVzZXIgZmFpbGVkIG9uZSBvciBtb3JlIHN0ZXBzIGluIHRoZSBzZXNzaW9uIGFuZCB3YXMgdG9sZCB0byBjb250YWN0IHN1cHBvcnQuICBgZXhwaXJlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGFjdGl2ZSBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lIHdpdGhvdXQgYmVpbmcgY29tcGxldGVkIGFuZCB3YXMgYXV0b21hdGljYWxseSBtYXJrZWQgYXMgZXhwaXJlZC4gTm90ZSB0aGF0IHNlc3Npb25zIGN1cnJlbnRseSBkbyBub3QgZXhwaXJlLiBBdXRvbWF0aWMgZXhwaXJhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBlbmFibGVkIGluIHRoZSBmdXR1cmUuICBgY2FuY2VsZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBjYW5jZWxlZCwgZWl0aGVyIHZpYSB0aGUgZGFzaGJvYXJkIGJ5IGEgdXNlciwgb3IgdmlhIEFQSS4gVGhlIHVzZXIgbWF5IGhhdmUgY29tcGxldGVkIHBhcnQgb2YgdGhlIHNlc3Npb24sIGJ1dCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHBhc3NlZC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBDYW5jZWxlZCA9ICdjYW5jZWxlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3Jldmlldydcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHN0ZXAgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFdhaXRpbmdGb3JQcmVyZXF1aXNpdGUgPSAnd2FpdGluZ19mb3JfcHJlcmVxdWlzaXRlJyxcbiAgICBOb3RBcHBsaWNhYmxlID0gJ25vdF9hcHBsaWNhYmxlJyxcbiAgICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnLFxuICAgIE1hbnVhbGx5UmVqZWN0ZWQgPSAnbWFudWFsbHlfcmVqZWN0ZWQnXG59XG5cbi8qKlxuICogRWFjaCBzdGVwIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgIGBhY3RpdmVgIC0gVGhpcyBzdGVwIGlzIHRoZSB1c2VyXFwncyBjdXJyZW50IHN0ZXAuIFRoZXkgYXJlIGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBjb21wbGV0aW5nIHRoaXMgc3RlcCwgb3IgdGhleSByZWNlbnRseSBjbG9zZWQgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIHN0ZXAuIE9ubHkgb25lIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYGFjdGl2ZWAgYXQgYW55IGdpdmVuIHBvaW50LiAgYHN1Y2Nlc3NgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGhhcyBjb21wbGV0ZWQgdGhpcyBzdGVwLiAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgdGhpcyBzdGVwLiBUaGlzIGNhbiBlaXRoZXIgY2F1c2UgdGhlIHVzZXIgdG8gZmFpbCB0aGUgc2Vzc2lvbiBhcyBhIHdob2xlLCBvciBjYXVzZSB0aGVtIHRvIGZhbGwgYmFjayB0byBhbm90aGVyIHN0ZXAgZGVwZW5kaW5nIG9uIGhvdyB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlIGlzIGNvbmZpZ3VyZWQuIEEgZmFpbGVkIHN0ZXAgZG9lcyBub3QgaW1wbHkgYSBmYWlsZWQgc2Vzc2lvbi4gIGB3YWl0aW5nX2Zvcl9wcmVyZXF1aXNpdGVgIC0gVGhlIHVzZXIgbmVlZHMgdG8gY29tcGxldGUgYW5vdGhlciBzdGVwIGZpcnN0LCBiZWZvcmUgdGhleSBwcm9ncmVzcyB0byB0aGlzIHN0ZXAuIFRoaXMgc3RlcCBtYXkgbmV2ZXIgcnVuLCBkZXBlbmRpbmcgb24gaWYgdGhlIHVzZXIgZmFpbHMgYW4gZWFybGllciBzdGVwIG9yIGlmIHRoZSBzdGVwIGlzIG9ubHkgcnVuIGFzIGEgZmFsbGJhY2suICBgbm90X2FwcGxpY2FibGVgIC0gVGhpcyBzdGVwIHdpbGwgbm90IGJlIHJ1biBmb3IgdGhpcyBzZXNzaW9uLiAgYHNraXBwZWRgIC0gVGhlIHJldHJ5IGluc3RydWN0aW9ucyB0aGF0IGNyZWF0ZWQgdGhpcyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzcGVjaWZpZWQgdGhhdCB0aGlzIHN0ZXAgc2hvdWxkIGJlIHNraXBwZWQuICBgZXhwaXJlZGAgLSBUaGlzIHN0ZXAgaGFkIG5vdCB5ZXQgYmVlbiBjb21wbGV0ZWQgd2hlbiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgYXMgYSB3aG9sZSBleHBpcmVkLiAgYGNhbmNlbGVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgY2FuY2VsZWQgYmVmb3JlIHRoZSB1c2VyIGNvbXBsZXRlZCB0aGlzIHN0ZXAuICBgcGVuZGluZ19yZXZpZXdgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHRlbXBsYXRlIHdhcyBjb25maWd1cmVkIHRvIHBlcmZvcm0gYSBzY3JlZW5pbmcgdGhhdCBoYWQgb25lIG9yIG1vcmUgaGl0cyBuZWVkaW5nIHJldmlldy4gIGBtYW51YWxseV9hcHByb3ZlZGAgLSBUaGUgc3RlcCB3YXMgbWFudWFsbHkgb3ZlcnJpZGRlbiB0byBwYXNzIGJ5IGEgdGVhbSBtZW1iZXIgaW4gdGhlIGRhc2hib2FyZC4gIGBtYW51YWxseV9yZWplY3RlZGAgLSBUaGUgc3RlcCB3YXMgbWFudWFsbHkgb3ZlcnJpZGRlbiB0byBmYWlsIGJ5IGEgdGVhbSBtZW1iZXIgaW4gdGhlIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBhY2NlcHRfdG9zOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmeV9zbXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZzogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIGNvbXBsZXRlZCBhIHN0ZXAgb2YgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNURVBfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHJlc291cmNlIElEIGFuZCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdGVtcGxhdGUgY29uZmlndXJpbmcgdGhlIGJlaGF2aW9yIG9mIGEgZ2l2ZW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gY29sbGVjdGVkLCBzb21lIGZpZWxkcyBtYXkgYmUgbnVsbCBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvblxcJ3MgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdWJkaXZpc2lvbiBjb2RlLiBcXFwiU3ViZGl2aXNpb25cXFwiIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgZXRjLiBGb3IgdGhlIGxpc3Qgb2YgdmFsaWQgY29kZXMsIHNlZSBbY291bnRyeSBzdWJkaXZpc2lvbiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NvdW50cnlfc3ViZGl2aXNpb25fY29kZXMuanNvbikuIENvdW50cnkgcHJlZml4ZXMgYXJlIG9taXR0ZWQsIHNpbmNlIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIGBjb3VudHJ5YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZGF0YSB0aGF0IHdhcyBlaXRoZXIgY29sbGVjdGVkIGZyb20gdGhlIHVzZXIgb3IgcHJvdmlkZWQgdmlhIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIG5hbWU6IElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBVc2VySUROdW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBIGhpZ2ggbGV2ZWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1YWxpdHkgb2YgdGhlIGltYWdlIHRoZSB1c2VyIHN1Ym1pdHRlZC4gIEZvciBleGFtcGxlLCBhbiBpbWFnZSB0aGF0IGlzIGJsdXJyeSwgZGlzdG9ydGVkIGJ5IGdsYXJlIGZyb20gYSBuZWFyYnkgbGlnaHQgc291cmNlLCBvciBpbXByb3Blcmx5IGZyYW1lZCBtaWdodCBiZSBtYXJrZWQgYXMgbG93IG9yIG1lZGl1bSBxdWFsaXR5LiBQb29yIHF1YWxpdHkgaW1hZ2VzIGFyZSBtb3JlIGxpa2VseSB0byBmYWlsIE9DUiBhbmQvb3IgdGVtcGxhdGUgY29uZm9ybWl0eSBjaGVja3MuICBOb3RlOiBCeSBkZWZhdWx0LCBQbGFpZCB3aWxsIGxldCBhIHVzZXIgcmVjYXB0dXJlIGRvY3VtZW50IGltYWdlcyB0d2ljZSBiZWZvcmUgZmFpbGluZyB0aGUgZW50aXJlIHNlc3Npb24gaWYgd2UgYXR0cmlidXRlIHRoZSBmYWlsdXJlIHRvIGxvdyBpbWFnZSBxdWFsaXR5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VRdWFsaXR5IHtcbiAgICBIaWdoID0gJ2hpZ2gnLFxuICAgIE1lZGl1bSA9ICdtZWRpdW0nLFxuICAgIExvdyA9ICdsb3cnXG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgaW1hZ2UgcXVhbGl0eSBvZiB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEltYWdlUXVhbGl0eURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVF1YWxpdHlEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgZ2xhcmUgY2hlY2suICBgc3VjY2Vzc2AgLSBUaGUgaW1hZ2UgaXMgZnJlZSBvZiBnbGFyZS4gIGBmYWlsZWRgIC0gVGhlIGltYWdlIGNvbnRhaW5zIGdsYXJlIHRoYXQgbWF5IG9ic2N1cmUgZG9jdW1lbnQgZGV0YWlscy5cbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5T3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgSW1hZ2VRdWFsaXR5RGV0YWlsc1xuICAgICAqL1xuICAgIGdsYXJlX2NoZWNrOiBJbWFnZVF1YWxpdHlPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIG9mIHRoZSBkaW1lbnNpb25zIGNoZWNrLiAgYHN1Y2Nlc3NgIC0gVGhlIGltYWdlIG1lZXRzIHRoZSBtaW5pbXVtIHNpemUgYW5kIHJlc29sdXRpb24gcmVxdWlyZW1lbnRzLiAgYGZhaWxlZGAgLSBUaGUgaW1hZ2UgZG9lcyBub3QgbWVldCB0aGUgbWluaW11bSBzaXplIG9yIHJlc29sdXRpb24gcmVxdWlyZW1lbnRzLlxuICAgICAqIEB0eXBlIHtJbWFnZVF1YWxpdHlPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBJbWFnZVF1YWxpdHlEZXRhaWxzXG4gICAgICovXG4gICAgZGltZW5zaW9uc19jaGVjazogSW1hZ2VRdWFsaXR5T3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBvZiB0aGUgYmx1ciBjaGVjay4gIGBzdWNjZXNzYCAtIFRoZSBpbWFnZSBpcyBzdWZmaWNpZW50bHkgc2hhcnAuICBgZmFpbGVkYCAtIFRoZSBpbWFnZSBpcyB0b28gYmx1cnJ5IGZvciBhbmFseXNpcy5cbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5T3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgSW1hZ2VRdWFsaXR5RGV0YWlsc1xuICAgICAqL1xuICAgIGJsdXJfY2hlY2s6IEltYWdlUXVhbGl0eU91dGNvbWU7XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHRoZSBpbWFnZSBxdWFsaXR5IGNoZWNrLiAgIGBzdWNjZXNzYCAtIFRoZSBjaGVjayBwYXNzZWQuICBgZmFpbGVkYCAtIFRoZSBjaGVjayBkaWQgbm90IHBhc3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbWFnZVF1YWxpdHlPdXRjb21lIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQW4gdXBkYXRlIG9uIHRoZSBoZWFsdGggaW5jaWRlbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jaWRlbnRVcGRhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNpZGVudFVwZGF0ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzPzogSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHVwZGF0ZSB3YXMgcHVibGlzaGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDIwLTEwLTMwVDE1OjI2OjQ4WlxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgdXBkYXRlZF9kYXRlPzogc3RyaW5nO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEluY2lkZW50VXBkYXRlU3RhdHVzRW51bSB7XG4gICAgSW52ZXN0aWdhdGluZyA9ICdJTlZFU1RJR0FUSU5HJyxcbiAgICBJZGVudGlmaWVkID0gJ0lERU5USUZJRUQnLFxuICAgIFNjaGVkdWxlZCA9ICdTQ0hFRFVMRUQnLFxuICAgIFJlc29sdmVkID0gJ1JFU09MVkVEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJyZWFrZG93biBvZiB0aGUgZGlmZmVyZW50IGluY29tZSB0eXBlcyBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lQnJlYWtkb3duVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgdHlwZTogSW5jb21lQnJlYWtkb3duVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGhvdXJseSByYXRlIGF0IHdoaWNoIHRoZSBpbmNvbWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaG91cnMgbG9nZ2VkIGZvciB0aGlzIGluY29tZSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBwYXkgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgaW5jb21lLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogICBgXFxcInJlZ3VsYXJcXFwiYDogcmVndWxhciBpbmNvbWUgICBgXFxcIm92ZXJ0aW1lXFxcImA6IG92ZXJ0aW1lIGluY29tZSAgIGBcXFwiYm9udXNcXFwiYDogYm9udXMgaW5jb21lXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVCcmVha2Rvd25UeXBlIHtcbiAgICBCb251cyA9ICdib251cycsXG4gICAgT3ZlcnRpbWUgPSAnb3ZlcnRpbWUnLFxuICAgIFJlZ3VsYXIgPSAncmVndWxhcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIENvbXByZWhlbnNpdmUgaW5jb21lIGFuYWx5c2lzIGluY2x1ZGluZyB0b3RhbCBpbmNvbWUsIGluY29tZSBleGNsdWRpbmcgdHJhbnNmZXJzLCBhbmQgaW5ib3VuZCB0cmFuc2ZlciBhbW91bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGFsbCBpbmNvbWUgdHJhbnNhY3Rpb25zIGluIHRoZSBnaXZlbiB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7QW1vdW50V2l0aEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX2luY29tZT86IEFtb3VudFdpdGhDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgZXhjbHVkaW5nIGFjY291bnQgdHJhbnNmZXIgdHJhbnNhY3Rpb25zIGZvciB0aGUgcGVyaW9kLCBpbmNsdWRpbmcgYSBtb250aGx5IGF2ZXJhZ2UuXG4gICAgICogQHR5cGUge0Ftb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfZXhjbHVkaW5nX3RyYW5zZmVycz86IEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZTtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5ib3VuZCB0cmFuc2ZlciB0cmFuc2FjdGlvbnMgZm9yIHRoZSBwZXJpb2QsIGluY2x1ZGluZyBhIG1vbnRobHkgYXZlcmFnZS5cbiAgICAgKiBAdHlwZSB7QW1vdW50V2l0aEN1cnJlbmN5V2l0aE1vbnRobHlBdmVyYWdlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zZmVyc19pbj86IEFtb3VudFdpdGhDdXJyZW5jeVdpdGhNb250aGx5QXZlcmFnZTtcbn1cbi8qKlxuICogRmlsdGVycyB0aGUgcmV0dXJuZWQgaW5jb21lIHN0cmVhbXMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmNvbWUgY2F0ZWdvcmllcy4gSWYgbm8gZmlsdGVycyBhcmUgcmVxdWVzdGVkLCBzdHJlYW1zIGZyb20gdGhlIGZvbGxvd2luZyBkZWZhdWx0IHNldCBvZiBjYXRlZ29yaWVzIGFyZSByZXR1cm5lZDogLSBgRUFSTkVEX0lOQ09NRS4qYCAoYEVBUk5FRF9JTkNPTUUuU0FMQVJZYCwgYEVBUk5FRF9JTkNPTUUuR0lHX0VDT05PTVlgLCBgRUFSTkVEX0lOQ09NRS5TRUxGX0VNUExPWUVEYCkgLSBgQkVORUZJVFMuRElTQUJJTElUWWAgLSBgUkVUSVJFTUVOVC4qYCAoYFJFVElSRU1FTlQuR09WRVJOTUVOVF9ERVJJVkVEYCwgYFJFVElSRU1FTlQuUFJJVkFURV9SRVRJUkVNRU5UYCwgYFJFVElSRU1FTlQuUExBTl9ESVNUUklCVVRJT05gKSAgVGhlIGZpbmFsIGxpc3Qgb2YgaW5jb21lIGNhdGVnb3JpZXMgaXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyB0aGUgYGluY2x1ZGVkX2NhdGVnb3JpZXNgLCB0aGVuIHJlbW92aW5nIHRoZSBgZXhjbHVkZWRfY2F0ZWdvcmllc2AuIFByaW9yaXR5IGlzIGdpdmVuIHRvIGBleGNsdWRlZF9jYXRlZ29yaWVzYCBpbiB0aGUgY2FzZSBvZiBjb2xsaXNpb25zLiAgRmlsdGVyIHBhdHRlcm5zIHN1cHBvcnRlZDogLSBgKmA6IEFsbCBjYXRlZ29yaWVzIC0gYFBSSU1BUlkuKmA6IEFsbCBjYXRlZ29yaWVzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHByaW1hcnkgY2F0ZWdvcnkgLSBgUFJJTUFSWS5TRUNPTkRBUllgOiBBIHNwZWNpZmljIGluY29tZSBjYXRlZ29yeSAgRm9yIGEgbGlzdCBvZiBpbmNvbWUgY2F0ZWdvcmllcywgc2VlIHRoZSBbSW5jb21lIFYyIENhdGVnb3J5IFRheG9ub215XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvaW5jb21lLXYyLWNhdGVnb3J5LXRheG9ub215LmNzdikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZUluc2lnaHRzRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lSW5zaWdodHNGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGVzIGluY29tZSBzdHJlYW1zIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lSW5zaWdodHNGaWx0ZXJcbiAgICAgKi9cbiAgICBpbmNsdWRlZF9jYXRlZ29yaWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEV4Y2x1ZGVzIGluY29tZSBzdHJlYW1zIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lSW5zaWdodHNGaWx0ZXJcbiAgICAgKi9cbiAgICBleGNsdWRlZF9jYXRlZ29yaWVzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgSW5jb21lIEluc2lnaHRzIHRvIHVzZS4gVGhpcyB2YWx1ZSBpcyBub3Qgc2hhcmVkIGFjcm9zcyBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIHJlc291cmNlLiBJZiBpdCBpcyBvbWl0dGVkIGZyb20gYSByZXF1ZXN0LCB0aGUgZGVmYXVsdCB2ZXJzaW9uIGlzIHVzZWQsIGV2ZW4gaWYgYSB2ZXJzaW9uIHdhcyBzZXQgaW4gYW4gZWFybGllciBjYWxsIHN1Y2ggYXMgYC9saW5rL3Rva2VuL2NyZWF0ZWAgb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVJbnNpZ2h0c1ZlcnNpb24ge1xuICAgIElpMiA9ICdJSTInXG59XG5cbi8qKlxuICogU3BlY2lmeSBwYXlyb2xsIGRhdGEgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwYXlzdHVicyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5c3R1YnM/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB3MnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxXMk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB3MnM/OiBBcnJheTxXMk92ZXJyaWRlPjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVNvdXJjZXNDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTb3VyY2VzQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIGRldGVjdGVkIGF0IHRoZSBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVNvdXJjZXNDb3VudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGJhc2VsaW5lX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIGN1cnJlbnRseSBkZXRlY3RlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVNvdXJjZXNDb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW50X2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSB2ZXJpZmllZCBmaWVsZHMgZnJvbSBhIHBheXN0dWIgdmVyaWZpY2F0aW9uLiBBbGwgZmllbGRzIGFyZSBwcm92aWRlZCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU6IEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVtcGxveWVlX25hbWU6IEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9ncm9zc19pbmNvbWU6IFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB5dGRfbmV0X2luY29tZTogWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBwcm9qZWN0ZWRfd2FnZTogUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB2ZXJpZmllZF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25EYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRmllbGQgbnVtYmVyIGZvciBpbmNvbWUgc3VtbWFyeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGVuZHBvaW50IHRvIHdoaWNoIFBsYWlkIHNob3VsZCBzZW5kIHdlYmhvb2tzIHJlbGF0ZWQgdG8gdGhlIHByb2dyZXNzIG9mIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwcmVjaGVjayBjcmVhdGVkIHdpdGggYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYC4gV2lsbCBiZSB1c2VkIHRvIGltcHJvdmUgY29udmVyc2lvbiBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcmVjaGVja19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBJdGVtcyB0aGF0IHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZSBwcm9kdWN0IGRhdGEuIFBsYWlkIHdpbGwgYXR0ZW1wdCB0byBjb3JyZWxhdGUgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIHRoZXNlIEl0ZW1zIHdpdGggZGF0YSBmcm9tIHRoZSB1c2VyXFwncyBwYXlzdHViLCBzdWNoIGFzIGRhdGUgYW5kIGFtb3VudC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIHByb2R1Y3Qgd2FzIG5vdCBpbml0aWFsaXplZCBmb3IgdGhlIEl0ZW1zIGR1cmluZyBMaW5rLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIHRoaXMgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHlzaXMgb3B0aW9ucyB0byBlbmFibGUgZm9yIGRvY3VtZW50IHBhcnNpbmdcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWcge1xuICAgIE9jciA9ICdvY3InLFxuICAgIFJpc2tTaWduYWxzID0gJ3Jpc2tfc2lnbmFscydcbn1cblxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZG9jdW1lbnQgSUQgdG8gZG93bmxvYWQuIElmIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0aW5nIHppcCBmaWxlLCByYXRoZXIgdGhhbiBhbGwgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZsb3cgdHlwZXMgdG8gcmV0cmlldmUgcGF5cm9sbCBpbmNvbWUgZGF0YVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlIHtcbiAgICBEaWdpdGFsSW5jb21lID0gJ3BheXJvbGxfZGlnaXRhbF9pbmNvbWUnLFxuICAgIERvY3VtZW50SW5jb21lID0gJ3BheXJvbGxfZG9jdW1lbnRfaW5jb21lJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbiBmb3Igd2hpY2ggdG8gZ2V0IHBheXN0dWIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgZm9yIGFuIGluY29tZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YT86IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheXN0dWJzOiBBcnJheTxQYXlzdHViPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb25maWRlbmNlIHRoYXQgUGxhaWQgY2FuIHN1cHBvcnQgdGhlIHVzZXIgaW4gdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93IGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgbWFudWFsIHBheXN0dWIgdXBsb2FkLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiSElHSFxcXCJgOiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHRoaXMgdXNlciBjYW4gdXNlIHRoZSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gIFxcXCJgTE9XYFxcXCI6IEl0IGlzIHVubGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgYFxcXCJVTktOT1dOXFxcImA6IEl0IHdhcyBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSB1c2VyIGlzIHN1cHBvcnRhYmxlIHdpdGggdGhlIGluZm9ybWF0aW9uIHBhc3NlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBMb3cgPSAnTE9XJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBlbXBsb3llclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyXFwncyBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyXFwncyB0YXggaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdGF4X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgZW1wbG95ZXJcXCdzIHB1YmxpYyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IG1pbGl0YXJ5IGluZm8gaW4gdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJlY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8ge1xuICAgIC8qKlxuICAgICAqIElzIHRoZSB1c2VyIGN1cnJlbnRseSBhY3RpdmUgZHV0eSBpbiB0aGUgVVMgbWlsaXRhcnlcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAgICAgKi9cbiAgICBpc19hY3RpdmVfZHV0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBzZXJ2aW5nIGluIHRoZSBVUyBtaWxpdGFyeSwgdGhlIGJyYW5jaCBvZiB0aGUgbWlsaXRhcnkgaW4gd2hpY2ggdGhleSBhcmUgc2VydmluZyBWYWxpZCB2YWx1ZXM6IFxcJ0FJUiBGT1JDRVxcJywgXFwnQVJNWVxcJywgXFwnQ09BU1QgR1VBUkRcXCcsIFxcJ01BUklORVNcXCcsIFxcJ05BVllcXCcsIFxcJ1VOS05PV05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGJyYW5jaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlclxcJ3MgcGF5cm9sbCBpbnN0aXR1dGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiBwYXlyb2xsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHBheXJvbGxfaW5zdGl0dXRpb24/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyBiZWxvbmdpbmcgdG8gdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgY2hlY2tlZC4gTm90ZSB0aGF0IGlmIHRoZSBJdGVtcyBzcGVjaWZpZWQgaGVyZSBhcmUgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgcHJvdmlkaW5nIHRoZW0gaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIHRoZXNlIEl0ZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggKGFuZCBiaWxsZWQgZm9yKSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm99XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzX21pbGl0YXJ5X2luZm8/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mbyB8IG51bGw7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHByZWNoZWNrLiBQcm92aWRlIHRoaXMgdmFsdWUgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIGluIG9yZGVyIHRvIG9wdGltaXplIExpbmsgY29udmVyc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcHJlY2hlY2tfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlkZW5jZTogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBldmFsdWF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgaG9tZV9hZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBhdHRlbXB0IHRvIHJlZnJlc2ggUGF5cm9sbCBJbmNvbWUgZGF0YSBmb3IgYSB1c2VyIHZpYSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCBmYWlsZWQgYmVjYXVzZSB0aGUgdXNlciBtdXN0IHJlLWNvbm5lY3QgdGhlaXIgcGF5cm9sbCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUkVGUkVTSF9SRUNPTk5FQ1RfTkVFREVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHJpc2sgc2lnbmFscyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBkb2N1bWVudHMgdXBsb2FkZWQgdmlhIERvY3VtZW50IEluY29tZS4gSXQgd2lsbCB0eXBpY2FsbHkgdGFrZSBhIG1pbnV0ZSBvciB0d28gZm9yIHRoaXMgd2ViaG9vayB0byBmaXJlIGFmdGVyIHRoZSBlbmQgdXNlciBoYXMgdXBsb2FkZWQgdGhlaXIgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBtYXkgdGhlbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYW5kIHRvIHJldHJpZXZlIHJpc2sgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJJU0tfU0lHTkFMU19QUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGluY29tZSB2ZXJpZmljYXRpb24gZnJhdWQgZGV0ZWN0aW9uIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gSWYgdGhlIHVzZXIgdXBsb2FkZWQgbXVsdGlwbGUgZG9jdW1lbnRzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYWxsIGRvY3VtZW50cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIENhbGwgdGhlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGVuZHBvaW50IHRvIGdldCBhbGwgcmlzayBzaWduYWwgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHNfc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNoYXJlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSBoYXMgY2hhbmdlZC4gVGhpcyB3ZWJob29rIGlzIGZpcmVkIGZvciBib3RoIHRoZSBEb2N1bWVudCBhbmQgUGF5cm9sbCBJbmNvbWUgZmxvd3MsIGJ1dCBub3QgdGhlIEJhbmsgSW5jb21lIGZsb3cuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2Ugc2V2ZXJhbCBtaW51dGVzIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6ICBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSBvciB0aGF0IHRoZSBkb2N1bWVudHMgd2VyZSBub3QgcGFyc2FibGUuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGVuZHBvaW50IGFuZCBjaGVjayB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgdG8gc2VlIHdoaWNoIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRGA6IEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmb3Jtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VGF4Zm9ybT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXhmb3JtczogQXJyYXk8VGF4Zm9ybT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5kaXZpZHVhbE5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRpdmlkdWFsTmFtZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBGaXJzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogTmFtZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCwgaW5jbHVkaW5nIGFsbCBwYXJ0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBuYW1lcyBhcmUgdGhvc2UgbW9zdCBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgcGVyc29uLiBPbmx5IG9uZSBuYW1lIHdpbGwgZXZlciBiZSBtYXJrZWQgYXMgcHJpbWFyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2Vha0FsaWFzRGV0ZXJtaW5hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBTaG9ydGhhbmQgaWRlbnRpZmllciBmb3IgYSBzcGVjaWZpYyBzY3JlZW5pbmcgbGlzdCBmb3IgaW5kaXZpZHVhbHMuICBgQVVfQ09OYDogQXVzdHJhbGlhIERlcGFydG1lbnQgb2YgRm9yZWlnbiBBZmZhaXJzIGFuZCBUcmFkZSBDb25zb2xpZGF0ZWQgTGlzdCAgYENBX0NPTmA6IEdvdmVybm1lbnQgb2YgQ2FuYWRhIENvbnNvbGlkYXRlZCBMaXN0IG9mIFNhbmN0aW9ucyAgYEVVX0NPTmA6IEV1cm9wZWFuIEV4dGVybmFsIEFjdGlvbiBTZXJ2aWNlIENvbnNvbGlkYXRlZCBMaXN0ICBgSVpfQ0lBYDogQ0lBIExpc3Qgb2YgQ2hpZWZzIG9mIFN0YXRlIGFuZCBDYWJpbmV0IE1lbWJlcnMgIGBJWl9JUExgOiBJbnRlcnBvbCBSZWQgTm90aWNlcyBmb3IgV2FudGVkIFBlcnNvbnMgTGlzdCAgYElaX1BFUGA6IFBvbGl0aWNhbGx5IEV4cG9zZWQgUGVyc29ucyBMaXN0ICBgSVpfVU5DYDogVW5pdGVkIE5hdGlvbnMgQ29uc29saWRhdGVkIFNhbmN0aW9ucyAgYElaX1dCS2A6IFdvcmxkIEJhbmsgTGlzdGluZyBvZiBJbmVsaWdpYmxlIEZpcm1zIGFuZCBJbmRpdmlkdWFscyAgYFVLX0hNQ2A6IEZvcmVpZ24sIENvbW1vbndlYWx0aCAmIERldmVsb3BtZW50IE9mZmljZSBVSyBTYW5jdGlvbnMgTGlzdCAgYFVTX0RQTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgRGVuaWVkIFBlcnNvbnMgTGlzdCAgYFVTX0RUQ2A6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgQUVDQSBEZWJhcnJlZCAgYFVTX0ZCSWA6IFVTIERlcGFydG1lbnQgb2YgSnVzdGljZSBGQkkgV2FudGVkIExpc3QgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19JU05gOiBVUyBEZXBhcnRtZW50IG9mIFN0YXRlIE5vbnByb2xpZmVyYXRpb24gU2FuY3Rpb25zICBgVVNfTUJTYDogVVMgTm9uLVNETiBNZW51LUJhc2VkIFNhbmN0aW9ucyAgYFVTX1BMQ2A6IFVTIE9GQUMgUGFsZXN0aW5pYW4gTGVnaXNsYXRpdmUgQ291bmNpbCAgYFVTX1NBTWA6IFVTIFN5c3RlbSBmb3IgQXdhcmQgTWFuYWdlbWVudCBFeGNsdXNpb24gTGlzdCAgYFVTX1NETmA6IFVTIE9GQUMgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmF0aW9uYWxzIExpc3QgIGBVU19TU0lgOiBVUyBPRkFDIFNlY3RvcmFsIFNhbmN0aW9ucyBJZGVudGlmaWNhdGlvbnMgIGBTR19TT0ZgOiBHb3Zlcm5tZW50IG9mIFNpbmdhcG9yZSBUZXJyb3Jpc3RzIGFuZCBUZXJyb3Jpc3QgRW50aXRpZXMgIGBUUl9UV0xgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBUZXJyb3Jpc3QgV2FudGVkIExpc3QgIGBUUl9ERkRgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBEb21lc3RpYyBGcmVlemluZyBEZWNpc2lvbnMgIGBUUl9GT1JgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBGb3JlaWduIEZyZWV6aW5nIFJlcXVlc3RzICBgVFJfV01EYDogR292ZXJubWVudCBvZiBUdXJrZXkgV2VhcG9ucyBvZiBNYXNzIERlc3RydWN0aW9uICBgVFJfQ01CYDogR292ZXJubWVudCBvZiBUdXJrZXkgQ2FwaXRhbCBNYXJrZXRzIEJvYXJkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZSB7XG4gICAgQXVDb24gPSAnQVVfQ09OJyxcbiAgICBDYUNvbiA9ICdDQV9DT04nLFxuICAgIEV1Q29uID0gJ0VVX0NPTicsXG4gICAgSXpDaWEgPSAnSVpfQ0lBJyxcbiAgICBJeklwbCA9ICdJWl9JUEwnLFxuICAgIEl6UGVwID0gJ0laX1BFUCcsXG4gICAgSXpVbmMgPSAnSVpfVU5DJyxcbiAgICBJeldiayA9ICdJWl9XQksnLFxuICAgIFVrSG1jID0gJ1VLX0hNQycsXG4gICAgVXNEcGwgPSAnVVNfRFBMJyxcbiAgICBVc0R0YyA9ICdVU19EVEMnLFxuICAgIFVzRmJpID0gJ1VTX0ZCSScsXG4gICAgVXNGc2UgPSAnVVNfRlNFJyxcbiAgICBVc0lzbiA9ICdVU19JU04nLFxuICAgIFVzTWJzID0gJ1VTX01CUycsXG4gICAgVXNQbGMgPSAnVVNfUExDJyxcbiAgICBVc1NhbSA9ICdVU19TQU0nLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBTZ1NvZiA9ICdTR19TT0YnLFxuICAgIFRyVHdsID0gJ1RSX1RXTCcsXG4gICAgVHJEZmQgPSAnVFJfREZEJyxcbiAgICBUckZvciA9ICdUUl9GT1InLFxuICAgIFRyV21kID0gJ1RSX1dNRCcsXG4gICAgVHJDbWIgPSAnVFJfQ01CJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgYGluZmxvd19tb2RlbGAgYWxsb3dzIHlvdSB0byBtb2RlbCBhIHRlc3QgYWNjb3VudCB0aGF0IHJlY2VpdmVzIHJlZ3VsYXIgaW5jb21lIG9yIG1ha2VzIHJlZ3VsYXIgcGF5bWVudHMgb24gYSBsb2FuLiBBbnkgdHJhbnNhY3Rpb25zIGdlbmVyYXRlZCBieSB0aGUgYGluZmxvd19tb2RlbGAgd2lsbCBhcHBlYXIgaW4gYWRkaXRpb24gdG8gcmFuZG9tbHkgZ2VuZXJhdGVkIHRlc3QgZGF0YSBvciB0cmFuc2FjdGlvbnMgc3BlY2lmaWVkIGJ5IGBvdmVycmlkZV9hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZmxvd01vZGVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5mbG93TW9kZWwge1xuICAgIC8qKlxuICAgICAqIEluZmxvdyBtb2RlbC4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgbm9uZWA6IE5vIGluY29tZSAgYG1vbnRobHktaW5jb21lYDogSW5jb21lIG9jY3VycyBvbmNlIHBlciBtb250aCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgOiBQYXlzIG9mZiB0aGUgYmFsYW5jZSBvbiBhIGxpYWJpbGl0eSBhY2NvdW50IGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnQgZGF5IG9mIG1vbnRoLiAgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YDogTWFrZXMgYW4gaW50ZXJlc3Qtb25seSBwYXltZW50IG9uIGEgbGlhYmlsaXR5IGFjY291bnQgYXQgdGhlIGdpdmVuIHN0YXRlbWVudCBkYXkgb2YgbW9udGguICBOb3RlIHRoYXQgYWNjb3VudCB0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMgd2lsbCBhY2NydWUgaW50ZXJlc3QgaW4gdGhlIFNhbmRib3guIFRoZSB0eXBlcyBpbXBhY3RlZCBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggc3VidHlwZSBgY3JlZGl0YCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBpbmNvbWUgcGVyIG1vbnRoLiBUaGlzIHZhbHVlIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgaW5jb21lX2Ftb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgaW5jb21lIHRyYW5zYWN0aW9uIHdpbGwgYXBwZWFyLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBwYXltZW50X2RheV9vZl9tb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgYmV0d2VlbiAxIGFuZCAyOCwgb3IgYGxhc3RgIG1lYW5pbmcgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggdGhlIGJhbGFuY2UgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgc3RhdGVtZW50X2RheV9vZl9tb250aDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlbGF0aW5nIHRvIGEgc3BlY2lmaWMgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgaW5zdGl0dXRpb24uIE5vdGUgdGhhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiBtYXkgaGF2ZSBtdWx0aXBsZSByZWNvcmRzLCBlYWNoIHdpdGggZGlmZmVyZW50IGluc3RpdHV0aW9uIElEczsgZm9yIGV4YW1wbGUsIGlmIHRoZSBpbnN0aXR1dGlvbiBoYXMgbWlncmF0ZWQgdG8gT0F1dGgsIHRoZXJlIG1heSBiZSBzZXBhcmF0ZSBgaW5zdGl0dXRpb25faWRgcyBmb3IgdGhlIE9BdXRoIGFuZCBub24tT0F1dGggdmVyc2lvbnMgb2YgdGhlIGluc3RpdHV0aW9uLiBJbnN0aXR1dGlvbnMgdGhhdCBvcGVyYXRlIGluIGRpZmZlcmVudCBjb3VudHJpZXMgb3Igd2l0aCBtdWx0aXBsZSBsb2dpbiBwb3J0YWxzIG1heSBhbHNvIGhhdmUgc2VwYXJhdGUgYGluc3RpdHV0aW9uX2lkYHMgZm9yIGVhY2ggY291bnRyeSBvciBwb3J0YWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIFBsYWlkIHByb2R1Y3RzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uIE5vdGUgdGhhdCBvbmx5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgSW5zdGFudCBBdXRoIHdpbGwgcmV0dXJuIGBhdXRoYCBpbiB0aGUgcHJvZHVjdCBhcnJheTsgaW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IGxpc3QgYGF1dGhgIG1heSBzdGlsbCBzdXBwb3J0IG90aGVyIEF1dGggbWV0aG9kcyBzdWNoIGFzIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgVmVyaWZpY2F0aW9uLiBUbyBpZGVudGlmeSBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIG1ldGhvZHMsIHVzZSB0aGUgYGF1dGhfbWV0YWRhdGFgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtGdWxsIEF1dGggY292ZXJhZ2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS8pLiBUaGUgYGluY29tZV92ZXJpZmljYXRpb25gIHByb2R1Y3QgaGVyZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgQmFuayBJbmNvbWUuIE5vdGU6IEZvciBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGFuZCBUcmFuc2ZlciwgbGlzdGVkIGluc3RpdHV0aW9ucyBtYXkgYmUgaW5jb21wbGV0ZSBvciBpbmNvcnJlY3QuIEluc3RlYWQsIHVzZSB0aGUgZm9sbG93aW5nOiBgYmFsYW5jZWAgc3VwcG9ydCBhbHNvIGluZGljYXRlcyBjb3ZlcmFnZSBvZiBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzOyBgYXV0aGAgc3VwcG9ydCBhbHNvIGluZGljYXRlcyBjb3ZlcmFnZSBvZiBUcmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJZiBQbGFpZCBkb2VzIG5vdCBoYXZlIHByaW1hcnkgY29sb3IgZGF0YSBmb3IgdGhlIGluc3RpdHV0aW9uLCB0aGlzIGZpZWxkIHdpbGwgYmUgYSBkZXRlcm1pbmlzdGljYWxseSBnZW5lcmF0ZWQgZmFsbGJhY2sgY29sb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ28sIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGtub3duIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uIFRoaXMgbGlzdCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9va2luZyB1cCBpbnN0aXR1dGlvbnMgYnkgcm91dGluZyBudW1iZXIuIEl0IGlzIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2YgRFRDIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBkdGNfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIHdpbGwgYmUgYHRydWVgIGlmIE9BdXRoIGlzIHN1cHBvcnRlZCBmb3IgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24sIGV2ZW4gaWYgdGhlIGluc3RpdHV0aW9uIGFsc28gc3VwcG9ydHMgbm9uLU9BdXRoIGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBhdXRoX21ldGFkYXRhPzogQXV0aE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBvcHRpb25zLmluY2x1ZGVfc3RhdHVzYCBvcHRpb24gc2V0IHRvIHRydWUuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbiBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGl0ZW1fbG9naW5zPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBhdXRoPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50c191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9mIHJlY2VudCBoZWFsdGggaW5jaWRlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEhlYWx0aEluY2lkZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBoZWFsdGhfaW5jaWRlbnRzPzogQXJyYXk8SGVhbHRoSW5jaWRlbnQ+IHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBpbnN0aXR1dGlvbiBzdGF0dXMgbWVldHMgdGhlIGNvbmRpdGlvbnMgY29uZmlndXJlZCBpbiB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYERBU0hCT0FSRF9DT05GSUdVUkVEX0FMRVJUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOU1RJVFVUSU9OX1NUQVRVU19BTEVSVF9UUklHR0VSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBnbG9iYWwgc3VjY2VzcyByYXRlIG9mIHRoZSBpbnN0aXR1dGlvbiwgY2FsY3VsYXRlZCBiYXNlZCBvbiBpdGVtIGFkZCBoZWFsdGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9vdmVyYWxsX3N1Y2Nlc3NfcmF0ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIFJUUCBhbmQgUmZQIG5ldHdvcmsgYW5kIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgbGlua2VkIEl0ZW1cXCdzIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3JrcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzXG4gICAgICovXG4gICAgcnRwOiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZlB9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAgICAgKi9cbiAgICByZnA6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHRvIGdldCBkZXRhaWxzIGFib3V0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYC4gSWYgcHJvdmlkZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIGFuIGluc3RpdHV0aW9uXFwncyBsb2dvLCBicmFuZCBjb2xvciwgYW5kIFVSTC4gV2hlbiBhdmFpbGFibGUsIHRoZSBiYW5rXFwncyBsb2dvIGlzIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcsIHRoZSBicmFuZCBjb2xvciBpcyBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEkgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGl0dXRpb24uIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9zdGF0dXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHNraXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuICBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW5zdGl0dXRpb25zL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRoZSBJbnN0aXR1dGlvbnMgYmFzZWQgb24gd2hpY2ggcHJvZHVjdHMgdGhleSBzdXBwb3J0LiBXaWxsIG9ubHkgcmV0dXJuIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgYWxsIGxpc3RlZCBwcm9kdWN0cy4gV2hlbiBmaWx0ZXJpbmcgYmFzZWQgb24gYGF1dGhgLCBhbiBpbnN0aXR1dGlvbiBtdXN0IHN1cHBvcnQgSW5zdGFudCBBdXRoIHRvIG1hdGNoIHRoZSBjcml0ZXJpb24uIFRvIGZpbHRlciBmb3IgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBzdXBwb3J0LCB1c2UgYGJhbGFuY2VgLiBUbyBmaWx0ZXIgZm9yIFRyYW5zZmVyIHN1cHBvcnQsIHVzZSBgYXV0aGAuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiByb3V0aW5nIG51bWJlcnMgdG8gZmlsdGVyIGluc3RpdHV0aW9ucy4gVGhlIHJlc3BvbnNlIHdpbGwgb25seSByZXR1cm4gaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggYWxsIG9mIHRoZSByb3V0aW5nIG51bWJlcnMgaW4gdGhlIGFycmF5LiBSb3V0aW5nIG51bWJlciByZWNvcmRzIHVzZWQgZm9yIHRoaXMgbWF0Y2hpbmcgYXJlIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlOyBob3dldmVyLCBmYWlsdXJlIHRvIG1hdGNoIGEgZ2l2ZW4gcm91dGluZyBudW1iZXIgdG8gYW4gaW5zdGl0dXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZSBpbnN0aXR1dGlvbiBpcyB1bnN1cHBvcnRlZCBieSBQbGFpZC4gSW52YWxpZCByb3V0aW5nIG51bWJlcnMgKG51bWJlcnMgdGhhdCBhcmUgbm90IDkgZGlnaXRzIGluIGxlbmd0aCBvciBkbyBub3QgaGF2ZSBhIHZhbGlkIGNoZWNrc3VtKSB3aWxsIGJlIGZpbHRlcmVkIGZyb20gdGhlIGFycmF5IGJlZm9yZSB0aGUgcmVzcG9uc2UgaXMgcHJvY2Vzc2VkLiBJZiBhbGwgcHJvdmlkZWQgcm91dGluZyBudW1iZXJzIGFyZSBpbnZhbGlkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVycz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gTm90ZSB0aGF0IGluc3RpdHV0aW9ucyB3aWxsIGhhdmUgYG9hdXRoYCBzZXQgdG8gYHRydWVgIGlmIHNvbWUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW5zdGl0dXRpb24gYXJlIHJlcXVpcmVkIHRvIHVzZSBPQXV0aCBmbG93czsgaW5zdGl0dXRpb25zIGluIGEgc3RhdGUgb2YgbWlncmF0aW9uIHRvIE9BdXRoIHdpbGwgaGF2ZSB0aGUgYG9hdXRoYCBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm4gdGhlIGluc3RpdHV0aW9uXFwncyBob21lcGFnZSBVUkwsIGxvZ28gYW5kIHByaW1hcnkgYnJhbmQgY29sb3IuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEksIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgQXV0aCBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggYXV0aCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgUGxhaWQgaW5zdGl0dXRpb25zXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBhY2NvdW50IGZpbHRlciB0byBhcHBseSB0byBpbnN0aXR1dGlvbnMgc2VhcmNoIHJlcXVlc3RzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgbG9hbj86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIGluc3RpdHV0aW9ucyBieSB2YXJpb3VzIFBheW1lbnQgSW5pdGlhdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnkuIEluc3RpdHV0aW9ucyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBxdWVyeSBhcmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgc3VwcG9ydCBhbGwgcHJvZHVjdHMgbGlzdGVkIGluIGBwcm9kdWN0c2AuIFByb3ZpZGUgYG51bGxgIHRvIGdldCBpbnN0aXR1dGlvbnMgcmVnYXJkbGVzcyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMuIE5vdGUgdGhhdCB3aGVuIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBpZiB5b3UgYXJlIGVuYWJsZWQgZm9yIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQgZXZlbiBpZiBgYXV0aGAgaXMgbm90IHByZXNlbnQgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS4gVG8gc2VhcmNoIGZvciBUcmFuc2ZlciBzdXBwb3J0LCB1c2UgYGF1dGhgOyB0byBzZWFyY2ggZm9yIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgc3VwcG9ydCwgdXNlIGBiYWxhbmNlYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBMaW1pdCByZXN1bHRzIHRvIGluc3RpdHV0aW9ucyB3aXRoIG9yIHdpdGhvdXQgT0F1dGggbG9naW4gZmxvd3MuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbnMgd2lsbCBoYXZlIGBvYXV0aGAgc2V0IHRvIGB0cnVlYCBpZiBzb21lIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGluc3RpdHV0aW9uIGFyZSByZXF1aXJlZCB0byB1c2UgT0F1dGggZmxvd3M7IGluc3RpdHV0aW9ucyBpbiBhIHN0YXRlIG9mIG1pZ3JhdGlvbiB0byBPQXV0aCB3aWxsIGhhdmUgdGhlIGBvYXV0aGAgYXR0cmlidXRlIHNldCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2F1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluc3RpdHV0aW9ucyBtYXRjaGluZyB0aGUgc2VhcmNoIGNyaXRlcmlhXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc2luZ2xlIGFjY291bnQgYXQgYSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHdpdGggYWRkaXRpb25hbCBpbnZlc3RtZW50LXNwZWNpZmljIGJhbGFuY2UgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBXaGVuIHVzaW5nIGEgQ1JBIGVuZHBvaW50IChhbiBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCBpLmUuIGFueSBlbmRwb2ludCBiZWdpbm5pbmcgd2l0aCBgL2NyYS9gKSwgdGhlIGBhY2NvdW50X2lkYCByZXR1cm5lZCB3aWxsIG5vdCBtYXRjaCB0aGUgYGFjY291bnRfaWRgIHJldHVybmVkIGJ5IGEgbm9uLUNSQSBlbmRwb2ludC4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgYmFsYW5jZXM6IEludmVzdG1lbnRBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBhbiBJdGVtXFwncyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgQXV0aCBhbmQgZmFsbGluZyBiYWNrIHRvIG1pY3JvLWRlcG9zaXQgb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbi4gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZC4gIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZC4gIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHVuc2VudGA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIGJ1dCBQbGFpZCBoYXMgbm90IHlldCBzZW50IHRoZSBtaWNyby1kZXBvc2l0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBJbnZlc3RtZW50QWNjb3VudFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UsIFBOQywgYW5kIFVTIEJhbmspLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIGlzIHBvcHVsYXRlZCBmb3IgVEFOLWJhc2VkIGluc3RpdHV0aW9ucyAoYGluc181NmAsIGBpbnNfMTNgLCBgaW5zXzEyNzk5MGApIGFzIHdlbGwgYXMgdGhlIE9BdXRoIFNhbmRib3ggaW5zdGl0dXRpb24gKGBpbnNfMTI3Mjg3YCk7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50XG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50QWNjb3VudFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIFVuc2VudCA9ICd1bnNlbnQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEFjY291bnRBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRBY2NvdW50QWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEFsbE9mXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRBbGxPZlxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QWxsT2ZcbiAgICAgKi9cbiAgICBiYWxhbmNlczogSW52ZXN0bWVudEFjY291bnRCYWxhbmNlO1xufVxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudCwgaW5jbHVkaW5nIG1hcmdpbiBsb2FuIGluZm9ybWF0aW9uIGZvciBpbnZlc3RtZW50IGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbC10aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBvciBieSBgL3NpZ25hbC9ldmFsdWF0ZWAgd2l0aCBhIEJhbGFuY2Utb25seSBydWxlc2V0LiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIGludG8gZW5hYmxpbmcgW2xpbWl0ZWQtcHVycG9zZSBjaGVja2luZyBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyNlbmFibGluZy1saW1pdGVkLXB1cnBvc2UtY2hlY2tpbmctYWNjb3VudHMtZm9yLXJlbnQtb3ItbW9ydGdhZ2UpLCB3aGljaCBhbHdheXMgaGF2ZSBgbnVsbGAgdmFsdWVzIGZvciBib3RoIGBhdmFpbGFibGVgIGFuZCBgY3VycmVudGAgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gU2ltaWxhciB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaXMgdHlwaWNhbGx5IGV4cGVjdGVkLCB3aGlsZSBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIG9yIGJ5IGAvc2lnbmFsL2V2YWx1YXRlYCB3aXRoIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQ7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgY2FsbGVkIHdpdGggYSBCYWxhbmNlLW9ubHkgYHJ1bGVzZXRfa2V5YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIGludG8gZW5hYmxpbmcgW2xpbWl0ZWQtcHVycG9zZSBjaGVja2luZyBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyNlbmFibGluZy1saW1pdGVkLXB1cnBvc2UtY2hlY2tpbmctYWNjb3VudHMtZm9yLXJlbnQtb3ItbW9ydGdhZ2UpLCB3aGljaCBhbHdheXMgaGF2ZSBgbnVsbGAgdmFsdWVzIGZvciBib3RoIGBhdmFpbGFibGVgIGFuZCBgY3VycmVudGAgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhlIGJhbGFuY2Ugd2FzIHVwZGF0ZWQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIG9ubHkgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGJvcnJvd2VkIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBpbnZlc3RtZW50LXR5cGUgYWNjb3VudHMsIHRoZSBtYXJnaW4gYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYm9ycm93ZWQgYXNzZXRzIGluIHRoZSBhY2NvdW50LCBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBUaGlzIGlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIG1hcmdpbiBvciBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbWFyZ2luX2xvYW5fYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEFjY291bnRCYWxhbmNlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50QWNjb3VudEJhbGFuY2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBib3Jyb3dlZCBmdW5kcyBpbiB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBGb3IgaW52ZXN0bWVudC10eXBlIGFjY291bnRzLCB0aGUgbWFyZ2luIGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGJvcnJvd2VkIGFzc2V0cyBpbiB0aGUgYWNjb3VudCwgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gVGhpcyBpcyBjb21tb25seSByZWZlcnJlZCB0byBhcyBtYXJnaW4gb3IgYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRBY2NvdW50QmFsYW5jZUFsbE9mXG4gICAgICovXG4gICAgbWFyZ2luX2xvYW5fYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtaW52ZXN0bWVudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50QWNjb3VudFN1YnR5cGUge1xuICAgIF81MjkgPSAnNTI5JyxcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEZoc2EgPSAnZmhzYScsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTXV0dWFsRnVuZCA9ICdtdXR1YWwgZnVuZCcsXG4gICAgTm9uQ3VzdG9kaWFsV2FsbGV0ID0gJ25vbi1jdXN0b2RpYWwgd2FsbGV0JyxcbiAgICBOb25UYXhhYmxlQnJva2VyYWdlQWNjb3VudCA9ICdub24tdGF4YWJsZSBicm9rZXJhZ2UgYWNjb3VudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIFBlbnNpb24gPSAncGVuc2lvbicsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBRc2hyID0gJ3FzaHInLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJsaWYgPSAncmxpZicsXG4gICAgUm90aCA9ICdyb3RoJyxcbiAgICBSb3RoNDAxayA9ICdyb3RoIDQwMWsnLFxuICAgIFJvdGg0MDNCID0gJ3JvdGggNDAzQicsXG4gICAgUm90aDQ1N2IgPSAncm90aCA0NTdiJyxcbiAgICBSb3RoUGVuc2lvbiA9ICdyb3RoIHBlbnNpb24nLFxuICAgIFJvdGhQcm9maXRTaGFyaW5nUGxhbiA9ICdyb3RoIHByb2ZpdCBzaGFyaW5nIHBsYW4nLFxuICAgIFJvdGhUaHJpZnRTYXZpbmdzUGxhbiA9ICdyb3RoIHRocmlmdCBzYXZpbmdzIHBsYW4nLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUnJzcCA9ICdycnNwJyxcbiAgICBTYXJzZXAgPSAnc2Fyc2VwJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFRocmlmdFNhdmluZ3NQbGFuID0gJ3RocmlmdCBzYXZpbmdzIHBsYW4nLFxuICAgIFRmc2EgPSAndGZzYScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFVnbWEgPSAndWdtYScsXG4gICAgVXRtYSA9ICd1dG1hJyxcbiAgICBWYXJpYWJsZUFubnVpdHkgPSAndmFyaWFibGUgYW5udWl0eScsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB3aXRoaW4gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsZWdhY3kgZmllbGQgZm9ybWVybHkgdXNlZCBpbnRlcm5hbGx5IGJ5IFBsYWlkIHRvIGlkZW50aWZ5IGNlcnRhaW4gY2FuY2VsZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2FuY2VsX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBzZXR0bGVtZW50IGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIHJlcHJlc2VudGluZyB3aGVuIHRoZSBvcmRlciB0eXBlIHdhcyBpbml0aWF0ZWQuIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCByZWZsZWN0cyB0aGUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuIEZvciB0cmFuc2FjdGlvbnMgcmVwcmVzZW50aW5nIGEgc2ltdWx0YW5lb3VzIGNhc2ggY29udHJpYnV0aW9uIGFuZCBwdXJjaGFzZSBvZiBhIHNlY3VyaXR5LCB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBwdXJjaGFzZSB0YWtlcyBwcmVjZWRlbmNlLCBhbmQgdGhlIGBhbW91bnRgIGlzIHJlcHJlc2VudGVkIGFzIHBvc2l0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21iaW5lZCB2YWx1ZSBvZiBhbGwgZmVlcyBhcHBsaWVkIHRvIHRoaXMgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmZWVzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZSB7XG4gICAgQWNjb3VudEZlZSA9ICdhY2NvdW50IGZlZScsXG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBc3NpZ25tZW50ID0gJ2Fzc2lnbm1lbnQnLFxuICAgIEJ1eSA9ICdidXknLFxuICAgIEJ1eVRvQ292ZXIgPSAnYnV5IHRvIGNvdmVyJyxcbiAgICBDb250cmlidXRpb24gPSAnY29udHJpYnV0aW9uJyxcbiAgICBEZXBvc2l0ID0gJ2RlcG9zaXQnLFxuICAgIERpc3RyaWJ1dGlvbiA9ICdkaXN0cmlidXRpb24nLFxuICAgIERpdmlkZW5kID0gJ2RpdmlkZW5kJyxcbiAgICBEaXZpZGVuZFJlaW52ZXN0bWVudCA9ICdkaXZpZGVuZCByZWludmVzdG1lbnQnLFxuICAgIEV4ZXJjaXNlID0gJ2V4ZXJjaXNlJyxcbiAgICBFeHBpcmUgPSAnZXhwaXJlJyxcbiAgICBGdW5kRmVlID0gJ2Z1bmQgZmVlJyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgSW50ZXJlc3RSZWNlaXZhYmxlID0gJ2ludGVyZXN0IHJlY2VpdmFibGUnLFxuICAgIEludGVyZXN0UmVpbnZlc3RtZW50ID0gJ2ludGVyZXN0IHJlaW52ZXN0bWVudCcsXG4gICAgTGVnYWxGZWUgPSAnbGVnYWwgZmVlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdsb2FuIHBheW1lbnQnLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW4gPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgTWFuYWdlbWVudEZlZSA9ICdtYW5hZ2VtZW50IGZlZScsXG4gICAgTWFyZ2luRXhwZW5zZSA9ICdtYXJnaW4gZXhwZW5zZScsXG4gICAgTWVyZ2VyID0gJ21lcmdlcicsXG4gICAgTWlzY2VsbGFuZW91c0ZlZSA9ICdtaXNjZWxsYW5lb3VzIGZlZScsXG4gICAgTm9uUXVhbGlmaWVkRGl2aWRlbmQgPSAnbm9uLXF1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgTm9uUmVzaWRlbnRUYXggPSAnbm9uLXJlc2lkZW50IHRheCcsXG4gICAgUGVuZGluZ0NyZWRpdCA9ICdwZW5kaW5nIGNyZWRpdCcsXG4gICAgUGVuZGluZ0RlYml0ID0gJ3BlbmRpbmcgZGViaXQnLFxuICAgIFF1YWxpZmllZERpdmlkZW5kID0gJ3F1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgUmViYWxhbmNlID0gJ3JlYmFsYW5jZScsXG4gICAgUmV0dXJuT2ZQcmluY2lwYWwgPSAncmV0dXJuIG9mIHByaW5jaXBhbCcsXG4gICAgUmVxdWVzdCA9ICdyZXF1ZXN0JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIFNlbGxTaG9ydCA9ICdzZWxsIHNob3J0JyxcbiAgICBTZW5kID0gJ3NlbmQnLFxuICAgIFNob3J0VGVybUNhcGl0YWxHYWluID0gJ3Nob3J0LXRlcm0gY2FwaXRhbCBnYWluJyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbiByZWludmVzdG1lbnQnLFxuICAgIFNwaW5PZmYgPSAnc3BpbiBvZmYnLFxuICAgIFNwbGl0ID0gJ3NwbGl0JyxcbiAgICBTdG9ja0Rpc3RyaWJ1dGlvbiA9ICdzdG9jayBkaXN0cmlidXRpb24nLFxuICAgIFRheCA9ICd0YXgnLFxuICAgIFRheFdpdGhoZWxkID0gJ3RheCB3aXRoaGVsZCcsXG4gICAgVHJhZGUgPSAndHJhZGUnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBUcmFuc2ZlckZlZSA9ICd0cmFuc2ZlciBmZWUnLFxuICAgIFRydXN0RmVlID0gJ3RydXN0IGZlZScsXG4gICAgVW5xdWFsaWZpZWRHYWluID0gJ3VucXVhbGlmaWVkIGdhaW4nLFxuICAgIFdpdGhkcmF3YWwgPSAnd2l0aGRyYXdhbCdcbn1cblxuLyoqXG4gKiBWYWx1ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYW5jZWxgOiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb24gYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgd2hpY2ggbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyICBGb3IgZGVzY3JpcHRpb25zIG9mIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbSW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNpbnZlc3RtZW50LXRyYW5zYWN0aW9uLXR5cGVzLXNjaGVtYSkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIENhbmNlbCA9ICdjYW5jZWwnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgRmVlID0gJ2ZlZScsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInXG59XG5cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBmb3IgdGhlIDQwMWsgYWNjb3VudC4gTm90ZSB0aGF0IHRoZSBzdW0gZmllbGRzIGluIHRoaXMgb2JqZWN0IHJlcHJlc2VudCB0aGUgdG90YWwgb2YgYWJzb2x1dGUgY29udHJpYnV0aW9uIHZhbHVlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBtb3N0IHJlY2VudCBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIGZvciB0aGUgNDAxayBhY2NvdW50LiBJbmNsdWRlcyBhbGwgY29udHJpYnV0aW9ucyBtYWRlIG9uIHRoZSBzYW1lIGRheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBsYXN0X2NvbnRyaWJ1dGlvbl90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fY291bnRfMW06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgdGhlIGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgbW9udGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fYW1vdW50XzFtOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgNiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fY291bnRfNm06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgdGhlIGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgNiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fYW1vdW50XzZtOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgY29udHJpYnV0aW9uX2NvdW50XzEybTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiB0aGUgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fYW1vdW50XzEybTogbnVtYmVyO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiBhY2NvdW50IGZlZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSA0MDFrIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aDQwMWtGZWVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBhY2NvdW50IGZlZSB0cmFuc2FjdGlvbnMgb24gdGhpcyBhY2NvdW50LCBmb3IgdGhlIHBhc3QgMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aDQwMWtGZWVEZXRhaWxzXG4gICAgICovXG4gICAgYWNjb3VudF9mZWVfY291bnRfMTJtOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGFjY291bnQgZmVlIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZlZV9hbW91bnRfMTJtOiBudW1iZXI7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgYWNjb3VudCBmZWUgYW5kIGNvbnRyaWJ1dGlvbiBpbmZvcm1hdGlvbiBmb3IgNDAxayB0eXBlIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWsge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgNDAxayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxa1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aDQwMWtGZWVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWtcbiAgICAgKi9cbiAgICBmZWVfZGV0YWlscz86IEludmVzdG1lbnRzQXV0aDQwMWtGZWVEZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrXG4gICAgICovXG4gICAgY29udHJpYnV0aW9uX2RldGFpbHM/OiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlscztcbn1cbi8qKlxuICogT2JqZWN0IHdpdGggbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgc291cmNlIG9mIGRhdGEgZm9yIHRoZSBhY2NvdW50IG51bWJlcnMsIG93bmVycywgYW5kIGhvbGRpbmdzIHRoYXQgYXJlIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGF0YVNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzXG4gICAgICovXG4gICAgbnVtYmVycz86IERhdGFTb3VyY2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRhU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXNcbiAgICAgKi9cbiAgICBvd25lcnM/OiBEYXRhU291cmNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGF0YVNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzXG4gICAgICovXG4gICAgaG9sZGluZ3M/OiBEYXRhU291cmNlcztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyB0byBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FDQVRTPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGFjYXRzPzogQXJyYXk8TnVtYmVyc0FDQVRTPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FUT04+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYXRvbj86IEFycmF5PE51bWJlcnNBVE9OPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc1JldGlyZW1lbnQ0MDFrPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIHJldGlyZW1lbnRfNDAxaz86IEFycmF5PE51bWJlcnNSZXRpcmVtZW50NDAxaz47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJldHJpZXZlZFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEludmVzdG1lbnRBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIGludmVzdG1lbnQgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lcnMgZm9yIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0YV9zb3VyY2VzOiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlcztcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhY2NvdW50cyBvZiA0MDFrIHN1YnR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxaz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9kZXRhaWxzXzQwMWs/OiBBcnJheTxJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWs+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiB0aGUgb3duZXJzaGlwIG9mIGFuIGludmVzdG1lbnQgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGlkZW50aXR5IGluZm9ybWF0aW9uIHBlcnRhaW5zIHRvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSW4gdGhlIGNhc2Ugb2YgYSBqb2ludCBhY2NvdW50LCBQbGFpZCB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byByZXBvcnQgdGhlIG5hbWVzIG9mIGFsbCBhY2NvdW50IGhvbGRlcnMuICBJZiBhbiBJdGVtIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHdpdGggZGlmZmVyZW50IG93bmVyIG5hbWVzLCBzb21lIGluc3RpdHV0aW9ucyB3aWxsIHJlcG9ydCBhbGwgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGluIGVhY2ggYWNjb3VudFxcJ3MgYG5hbWVzYCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjYW5jZWxsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCBhZnRlciBhbiBhc3luY2hyb25vdXMgZXh0cmFjdGlvbiBvbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNhbmNlbGxlZCB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjYW5jZWxsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxJbnZlc3RtZW50QWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgSXRlbVxcJ3MgcG9ydGZvbGlvIHdhcyBtYW51YWxseSBjcmVhdGVkIHdpdGggdGhlIEludmVzdG1lbnRzIEZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgcmVjZW50IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAgd2hlbiBmZXRjaGluZyB0cmFuc2FjdGlvbiBoaXN0b3J5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhlIGludmVzdG1lbnRzIHByb2R1Y3QgdmlhIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYG9wdGlvbmFsX3Byb2R1Y3RzYCBhcnJheSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGluaXRpYWwgSW52ZXN0bWVudHMgZXh0cmFjdGlvbiB3aWxsIGhhcHBlbiBhc3luY2hyb25vdXNseS4gUGxhaWQgd2lsbCBzdWJzZXF1ZW50bHkgZmlyZSBhIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vayB3aGVuIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy4gV2hlbiBgZmFsc2VgLCBQbGFpZCB3aWxsIHdhaXQgdG8gcmV0dXJuIGEgcmVzcG9uc2UgdW50aWwgZXh0cmFjdGlvbiBjb21wbGV0aW9uIGFuZCBubyBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2lsbCBmaXJlLiBOb3RlIHRoYXQgd2hpbGUgdGhlIGV4dHJhY3Rpb24gaXMgaGFwcGVuaW5nIGFzeW5jaHJvbm91c2x5LCBjYWxscyB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIHdpbGwgcmV0dXJuIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3JzIHVudGlsIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFzeW5jX3VwZGF0ZT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxJbnZlc3RtZW50QWNjb3VudD47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9ucyBiZWluZyBmZXRjaGVkXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgaW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogUG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIE11c3QgYmUgcG9zaXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBidXkgYW5kIG5lZ2F0aXZlIGlmIHRoZSB0eXBlIGlzIGEgc2VsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZmVlcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eT86IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIGFuIGlzc3VlIGVuY291bnRlcmVkIHdpdGggZmluYW5jaWFsIGluc3RpdHV0aW9uIGludGVyYWN0aW9ucyBkdXJpbmcgTGlua2luZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpc3N1ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGlzc3VlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhZmZlY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGlkcyBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhZmZlY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSByZWNvcmQgdHJhY2tpbmcgdGhpcyBpc3N1ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgc3VtbWFyeSBvZiB0aGUgZXJyb3IgZm9yIHRoZSBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIHN1bW1hcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGZvciB0aGUgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBkZXRhaWxlZF9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXNzdWVzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIHN0YXR1cz86IElzc3Vlc1N0YXR1cztcbn1cbi8qKlxuICogV2ViaG9vayBub3RpZmljYXRpb25zIGFyZSBzZW50IG9ubHkgd2hlbiBhIHN1YnNjcmliZWQgaXNzdWUgaXMgbWFya2VkIGFzIHJlc29sdmVkLiBUaGUgcGF5bG9hZCBjb250YWlucyBkZXRhaWxzIGFib3V0IHRoZSBpc3N1ZSBhdCB0aGUgdGltZSBvZiBpdHMgcmVzb2x1dGlvbiwgZm9jdXNpbmcgb24gdGhlIG1vc3QgZXNzZW50aWFsIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3VlUmVzb2x2ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVNTVUVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElTU1VFX1JFU09MVkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb25uZWN0aXZpdHkgaXNzdWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpc3N1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciBmb3IgdGhlIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaXNzdWVfZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBpc3N1ZSB3YXMgbWFya2VkIGFzIHJlc29sdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaXNzdWVfcmVzb2x2ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpbnZvbHZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpbnZvbHZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pc3N1ZXMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlzc3VlIHRvIHJldHJpZXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpc3N1ZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJc3N1ZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXNzdWVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1ZX1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc3N1ZT86IElzc3VlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc1NlYXJjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXNzdWVzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIFBsYWlkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVxdWVzdF9pZGAgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhhdCBtaWdodCBoYXZlIGhhZCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uIGlzc3VlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25fcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lzc3Vlcy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNTZWFyY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgaXNzdWVzIGFmZmVjdGluZyB0aGUgSXRlbSwgc2Vzc2lvbiwgb3IgcmVxdWVzdCBwYXNzZWQgaW4sIGNvbmZvcm1pbmcgdG8gdGhlIElzc3VlcyBkYXRhIG1vZGVsLiBBbiBlbXB0eSBsaXN0IGluZGljYXRlcyB0aGF0IG5vIG1hdGNoaW5nIGlzc3VlcyB3ZXJlIGZvdW5kLlxuICAgICAqIEB0eXBlIHtBcnJheTxJc3N1ZT59XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNzdWVzPzogQXJyYXk8SXNzdWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgaXNzdWUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJc3N1ZXNTdGF0dXMge1xuICAgIFJlcG9ydGVkID0gJ1JFUE9SVEVEJyxcbiAgICBBd2FpdGluZ1Jlc29sdXRpb24gPSAnQVdBSVRJTkdfUkVTT0xVVElPTicsXG4gICAgRml4SW5Qcm9ncmVzcyA9ICdGSVhfSU5fUFJPR1JFU1MnLFxuICAgIEZpeFBlbmRpbmdWYWxpZGF0aW9uID0gJ0ZJWF9QRU5ESU5HX1ZBTElEQVRJT04nLFxuICAgIENhbm5vdEZpeCA9ICdDQU5OT1RfRklYJyxcbiAgICBSZXNvbHZlZCA9ICdSRVNPTFZFRCdcbn1cblxuLyoqXG4gKiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lzc3Vlcy9zdWJzY3JpYmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaXNzdWUgdG8gc3Vic2NyaWJlIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc3N1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB3aGVyZSBub3RpZmljYXRpb25zIHNob3VsZCBiZSBzZW50IHdoZW4gdGhlIGlzc3VlIHN0YXR1cyBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pc3N1ZXMvc3Vic2NyaWJlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGJpbmFyeSBtYXRjaCBpbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBjb3VudHJ5IHRoYXQgaXNzdWVkIHRoZSBwcm92aWRlZCBkb2N1bWVudCBtYXRjaGVzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgc2VwYXJhdGVseSBwcm92aWRlZCB0byBQbGFpZC4gIE5vdGU6IFlvdSBjYW4gY29uZmlndXJlIHdoZXRoZXIgYSBgbm9fbWF0Y2hgIG9uIGBpc3N1aW5nX2NvdW50cnlgIGZhaWxzIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBieSBlZGl0aW5nIHlvdXIgUGxhaWQgVGVtcGxhdGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJc3N1aW5nQ291bnRyeSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lLURheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB3aXRob3V0IGFuIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24sIHN1Y2ggYXMgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUF1dGhNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdXRoX21ldGhvZD86IEl0ZW1BdXRoTWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBiaWxsZWRfcHJvZHVjdHNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdmFpbGFibGVfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4gYmlsbGVkIGZvciB0aGUgSXRlbS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXZhaWxhYmxlX3Byb2R1Y3RzYC4gTm90ZSAtIGBiaWxsZWRfcHJvZHVjdHNgIGlzIHBvcHVsYXRlZCBpbiBhbGwgZW52aXJvbm1lbnRzIGJ1dCBvbmx5IHJlcXVlc3RzIGluIFByb2R1Y3Rpb24gYXJlIGJpbGxlZC4gQWxzbyBub3RlIHRoYXQgcHJvZHVjdHMgdGhhdCBhcmUgYmlsbGVkIG9uIGEgcGF5LXBlci1jYWxsIGJhc2lzIHJhdGhlciB0aGFuIGEgcGF5LXBlci1JdGVtIGJhc2lzLCBzdWNoIGFzIGBiYWxhbmNlYCwgd2lsbCBub3QgYXBwZWFyIGhlcmUuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBiaWxsZWRfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYWRkZWQgdG8gdGhlIEl0ZW0uIEluIGFsbW9zdCBhbGwgY2FzZXMsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgYGJpbGxlZF9wcm9kdWN0c2AgZmllbGQuIEZvciBzb21lIHByb2R1Y3RzLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHByb2R1Y3QgdG8gYmUgYWRkZWQgdG8gYW4gSXRlbSBidXQgbm90IHlldCBiaWxsZWQgKGUuZy4gQXNzZXRzLCBiZWZvcmUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBoYXMgYmVlbiBjYWxsZWQsIG9yIEF1dGggb3IgSWRlbnRpdHkgd2hlbiBhZGRlZCBhcyBPcHRpb25hbCBQcm9kdWN0cyBidXQgYmVmb3JlIHRoZWlyIGVuZHBvaW50cyBoYXZlIGJlZW4gY2FsbGVkKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvZHVjdCBtYXkgYXBwZWFyIGluIGBwcm9kdWN0c2AgYnV0IG5vdCBpbiBgYmlsbGVkX3Byb2R1Y3RzYC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoaXMgd2lsbCBjb25zaXN0IG9mIGFsbCBwcm9kdWN0cyB3aGVyZSBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gdGhlIHJlcXVpcmVkIGRhdGEgc2NvcGVzIGZvciB0aGF0IHByb2R1Y3QgYW5kIHlvdSBoYXZlIFByb2R1Y3Rpb24gYWNjZXNzIGZvciB0aGF0IHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBjb25zZW50ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuIElmIHRoZSBJdGVtIGRvZXMgbm90IGhhdmUgY29uc2VudCBleHBpcmF0aW9uIHNjaGVkdWxlZCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gQ3VycmVudGx5LCBvbmx5IGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgYW5kIGEgc21hbGwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgaGF2ZSBleHBpcmluZyBjb25zZW50LiBGb3IgYSBsaXN0IG9mIFVTIGluc3RpdHV0aW9ucyB0aGF0IGN1cnJlbnRseSBleHBpcmUgY29uc2VudCwgc2VlIHRoZSBbT0F1dGggR3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9vYXV0aC8jcmVmcmVzaGluZy1pdGVtLWNvbnNlbnQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbiBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZCwgd2hpY2ggY2FuIGJlIHRoZSBjYXNlIGZvciBJdGVtcyB3aXRoIHNvbWUgZm9ybXMgb2YgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbi4gIGBiYWNrZ3JvdW5kYCAtIEl0ZW0gY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgIGB1c2VyX3ByZXNlbnRfcmVxdWlyZWRgIC0gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgdXBkYXRlX3R5cGU6IEl0ZW1VcGRhdGVUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJdGVtVXBkYXRlVHlwZUVudW0ge1xuICAgIEJhY2tncm91bmQgPSAnYmFja2dyb3VuZCcsXG4gICAgVXNlclByZXNlbnRSZXF1aXJlZCA9ICd1c2VyX3ByZXNlbnRfcmVxdWlyZWQnXG59XG5cbi8qKlxuICogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbmV3X2FjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEFjdGl2aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYWN0aXZpdGllczogQXJyYXk8QWN0aXZpdHk+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aW1lc3RhbXBzIGZvciB0aGUgbGFzdCB0aW1lIGVhY2ggZGF0YSB0eXBlIHdhcyBhY2Nlc3NlZCBwZXIgYXBwbGljYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PExhc3REYXRhQWNjZXNzVGltZXM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X2RhdGFfYWNjZXNzX3RpbWVzOiBBcnJheTxMYXN0RGF0YUFjY2Vzc1RpbWVzPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSB1c2VyIHN1Y2Nlc3NmdWxseSBhZGRzIGEgUGxhaWQgSXRlbSBkdXJpbmcgYSBMaW5rIHNlc3Npb24gd2hlbiB1c2luZyBIb3N0ZWQgTGluayBvciBNdWx0aS1JdGVtIExpbmsgc2Vzc2lvbnMuIENvbnRhaW5zIHRoZSBwdWJsaWMgdG9rZW4gZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BZGRSZXN1bHRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJVEVNX0FERF9SRVNVTFRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgbGlua190b2tlbmAgdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHB1YmxpY190b2tlbmAgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbSB0aGF0IHdhcyBhZGRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BZGRSZXN1bHRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgZm9yIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29ubmVjdGVkIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbnM6IEFycmF5PENvbm5lY3RlZEFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogVXNlciBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLCBmb3IgY2xpZW50cyBtYWtpbmcgYSByZXF1ZXN0IHdpdGhvdXQgYW4gYGFjY2Vzc190b2tlbmAuIFRoaXMgaXMgb25seSBhbGxvd2VkIGZvciBzZWxlY3QgY2xpZW50cyBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIE1vc3QgY2xpZW50cyBzaG91bGQgY2FsbCBgL2l0ZW0vaW1wb3J0YCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZSBoYXNoZWQgYnkgRkkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgZmlfdXNlcm5hbWVfaGFzaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY29wZXM6IFNjb3BlcztcbiAgICAvKipcbiAgICAgKiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCBkdXJpbmcgZW5yb2xsbWVudCwgdGhpcyBmaWVsZCBtdXN0IGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBzdGF0ZSBzZW50IHRvIHRoZSBwYXJ0bmVyIGluIHRoZSBPQXV0aCBMb2dpbiBVUkkuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgd2hlbiB0aGUgY29udGV4dCBpcyBgRU5ST0xMTUVOVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNDb250ZXh0fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29udGV4dDogU2NvcGVzQ29udGV4dDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG1ldGhvZCB1c2VkIHRvIHBvcHVsYXRlIEF1dGggZGF0YSBmb3IgdGhlIEl0ZW0uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIEl0ZW1zIHRoYXQgaGF2ZSBoYWQgQXV0aCBudW1iZXJzIGRhdGEgc2V0IG9uIGF0IGxlYXN0IG9uZSBvZiB0aGVpciBhY2NvdW50cywgYW5kIHdpbGwgYmUgYG51bGxgIG90aGVyd2lzZS4gRm9yIGluZm8gYWJvdXQgdGhlIHZhcmlvdXMgZmxvd3MsIHNlZSBvdXIgW0F1dGggY292ZXJhZ2UgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuICBgSU5TVEFOVF9BVVRIYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXJcXCdzIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24uICBgSU5TVEFOVF9NQVRDSGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgSW5zdGFudCBNYXRjaCBmYWxsYmFjayBmbG93LiAgYEFVVE9NQVRFRF9NSUNST0RFUE9TSVRTYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgZmxvdy4gIGBTQU1FX0RBWV9NSUNST0RFUE9TSVRTYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBTYW1lLURheSBNaWNyby1kZXBvc2l0cyBmbG93LiAgYElOU1RBTlRfTUlDUk9ERVBPU0lUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgSW5zdGFudCBNaWNyby1kZXBvc2l0cyBmbG93LiAgYERBVEFCQVNFX01BVENIYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBEYXRhYmFzZSBNYXRjaCBmbG93LiAgYERBVEFCQVNFX0lOU0lHSFRTYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBEYXRhYmFzZSBJbnNpZ2h0cyBmbG93LiAgYFRSQU5TRkVSX01JR1JBVEVEYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIFtgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zZmVyL2FjY291bnQtbGlua2luZy8jbWlncmF0ZS1hY2NvdW50LWludG8tdHJhbnNmZXJzKS4gIGBJTlZFU1RNRU5UU19GQUxMQkFDS2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgZm9yIEludmVzdG1lbnRzIE1vdmUgd2FzIHByb3ZpZGVkIHZpYSBhIFtmYWxsYmFjayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2ludmVzdG1lbnRzLW1vdmUvI2ZhbGxiYWNrLWZsb3dzKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEl0ZW1BdXRoTWV0aG9kIHtcbiAgICBJbnN0YW50QXV0aCA9ICdJTlNUQU5UX0FVVEgnLFxuICAgIEluc3RhbnRNYXRjaCA9ICdJTlNUQU5UX01BVENIJyxcbiAgICBBdXRvbWF0ZWRNaWNyb2RlcG9zaXRzID0gJ0FVVE9NQVRFRF9NSUNST0RFUE9TSVRTJyxcbiAgICBTYW1lRGF5TWljcm9kZXBvc2l0cyA9ICdTQU1FX0RBWV9NSUNST0RFUE9TSVRTJyxcbiAgICBJbnN0YW50TWljcm9kZXBvc2l0cyA9ICdJTlNUQU5UX01JQ1JPREVQT1NJVFMnLFxuICAgIERhdGFiYXNlTWF0Y2ggPSAnREFUQUJBU0VfTUFUQ0gnLFxuICAgIERhdGFiYXNlSW5zaWdodHMgPSAnREFUQUJBU0VfSU5TSUdIVFMnLFxuICAgIFRyYW5zZmVyTWlncmF0ZWQgPSAnVFJBTlNGRVJfTUlHUkFURUQnLFxuICAgIEludmVzdG1lbnRzRmFsbGJhY2sgPSAnSU5WRVNUTUVOVFNfRkFMTEJBQ0snLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBIGRhdGEgc2NvcGUgZm9yIHRoZSBwcm9kdWN0cyB0aGF0IGEgdXNlciBjYW4gY29uc2VudCB0byBpbiBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEl0ZW1Db25zZW50ZWREYXRhU2NvcGUge1xuICAgIEFjY291bnRCYWxhbmNlSW5mbyA9ICdhY2NvdW50X2JhbGFuY2VfaW5mbycsXG4gICAgQ29udGFjdEluZm8gPSAnY29udGFjdF9pbmZvJyxcbiAgICBBY2NvdW50Um91dGluZ051bWJlciA9ICdhY2NvdW50X3JvdXRpbmdfbnVtYmVyJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAndHJhbnNhY3Rpb25zJyxcbiAgICBDcmVkaXRMb2FuSW5mbyA9ICdjcmVkaXRfbG9hbl9pbmZvJyxcbiAgICBJbnZlc3RtZW50cyA9ICdpbnZlc3RtZW50cycsXG4gICAgUGF5cm9sbEluZm8gPSAncGF5cm9sbF9pbmZvJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0luZm8gPSAnaW5jb21lX3ZlcmlmaWNhdGlvbl9wYXlzdHVic19pbmZvJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25XMnNJbmZvID0gJ2luY29tZV92ZXJpZmljYXRpb25fdzJzX2luZm8nLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbkJhbmtTdGF0ZW1lbnRzID0gJ2luY29tZV92ZXJpZmljYXRpb25fYmFua19zdGF0ZW1lbnRzJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25FbXBsb3ltZW50SW5mbyA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uX2VtcGxveW1lbnRfaW5mbycsXG4gICAgQmFua1N0YXRlbWVudHMgPSAnYmFua19zdGF0ZW1lbnRzJyxcbiAgICBSaXNrSW5mbyA9ICdyaXNrX2luZm8nLFxuICAgIE5ldHdvcmtJbnNpZ2h0c0xpdGUgPSAnbmV0d29ya19pbnNpZ2h0c19saXRlJyxcbiAgICBGcmF1ZEluZm8gPSAnZnJhdWRfaW5mbydcbn1cblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZW50aXR5IGF1dGhlbnRpY2F0aW5nIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXRlbUNyZWF0ZUF1dGhlbnRpY2F0aW9uIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIERhdGFQYXJ0bmVyID0gJ0RBVEFfUEFSVE5FUicsXG4gICAgUGxhaWQgPSAnUExBSUQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggTGlua1xcJ3MgdXBkYXRlIG1vZGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJdGVtR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgIGFuZCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1XaXRoQ29uc2VudEZpZWxkc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbVdpdGhDb25zZW50RmllbGRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1cz86IEl0ZW1TdGF0dXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwcm9kdWN0IHN0cmluZ3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGh9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9hdXRoOiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGNvbmZpZ3VyZSBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIGFuIEl0ZW0uIFBsYWlkIGZpcmVzIGEgd2ViaG9vayBpZiBjcmVkZW50aWFscyBmYWlsLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3Qgb2YgdXNlciBJRCBhbmQgYXV0aCB0b2tlbiBwYWlyLCBwZXJtaXR0aW5nIFBsYWlkIHRvIGFnZ3JlZ2F0ZSBhIHVzZXJcXCdzIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoIHtcbiAgICAvKipcbiAgICAgKiBPcGFxdWUgdXNlciBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBdXRob3JpemF0aW9uIHRva2VuIFBsYWlkIHdpbGwgdXNlIHRvIGFnZ3JlZ2F0ZSB0aGlzIHVzZXJcXCdzIGFjY291bnRzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIGF1dGhfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2ltcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtIGhhcyBleGl0ZWQgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSB3aXRob3V0IHRoZSB1c2VyIGhhdmluZyBnb25lIHRocm91Z2ggdGhlIHVwZGF0ZSBtb2RlIGZsb3cgaW4geW91ciBhcHAgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdXNlciBjb21wbGV0ZWQgdGhlIHVwZGF0ZSBtb2RlIGluIGEgZGlmZmVyZW50IGFwcCkuIElmIHlvdSBoYXZlIG1lc3NhZ2luZyB0aGF0IHRlbGxzIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHRoZSB1cGRhdGUgbW9kZSBmbG93LCB5b3Ugc2hvdWxkIHNpbGVuY2UgdGhpcyBtZXNzYWdpbmcgdXBvbiByZWNlaXZpbmcgdGhlIGBMT0dJTl9SRVBBSVJFRGAgd2ViaG9vay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTE9HSU5fUkVQQUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgb25jZSBQbGFpZCBjYWxjdWxhdGVzIGluY29tZSBmcm9tIGFuIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3Byb2R1Y3RzL3Rlcm1pbmF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0c1Rlcm1pbmF0ZVJlYXNvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWFzb25fY29kZTogUHJvZHVjdHNUZXJtaW5hdGVSZWFzb25Db2RlO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgY29udGV4dCBvciBkZXRhaWxzIGFib3V0IHRoZSByZWFzb24gZm9yIHRlcm1pbmF0aW5nIHByb2R1Y3RzIG9uIHRoZSBJdGVtLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYHJlYXNvbl9ub3RlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVhc29uX25vdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9wcm9kdWN0cy90ZXJtaW5hdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgcHVibGljX3Rva2VuYCBmb3IgdGhlIHBhcnRpY3VsYXIgSXRlbSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYGFjY2Vzc190b2tlbmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgYHB1YmxpY190b2tlbmAsIG9idGFpbmVkIGZyb20gdGhlIExpbmsgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb3IgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCB2YWx1ZSBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlYXNvbiBmb3IgcmVtb3ZpbmcgdGhlIEl0ZW0gIGBGUkFVRF9GSVJTVF9QQVJUWWA6IFRoZSBlbmQgdXNlciB3aG8gb3ducyB0aGUgY29ubmVjdGVkIGJhbmsgYWNjb3VudCBjb21taXR0ZWQgZnJhdWQgYEZSQVVEX0ZBTFNFX0lERU5USVRZYDogVGhlIGVuZCB1c2VyIGNyZWF0ZWQgdGhlIGNvbm5lY3Rpb24gdXNpbmcgZmFsc2UgaWRlbnRpdHkgaW5mb3JtYXRpb24gb3Igc3RvbGVuIGNyZWRlbnRpYWxzIGBGUkFVRF9BQlVTRWA6IFRoZSBlbmQgdXNlciBpcyBhYnVzaW5nIHRoZSBjbGllbnRcXCdzIHNlcnZpY2Ugb3IgcGxhdGZvcm0gdGhyb3VnaCB0aGVpciBjb25uZWN0ZWQgYWNjb3VudCBgRlJBVURfT1RIRVJgOiBPdGhlciBmcmF1ZC1yZWxhdGVkIHJlYXNvbnMgaW52b2x2aW5nIHRoZSBlbmQgdXNlciBub3QgY292ZXJlZCBieSB0aGUgc3BlY2lmaWMgZnJhdWQgY2F0ZWdvcmllcyBgQ09OTkVDVElPTl9JU19OT05fRlVOQ1RJT05BTGA6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBlbmQgdXNlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uIGlzIGJyb2tlbiBhbmQgY2Fubm90IGJlIHJlc3RvcmVkIGBPVEhFUmA6IEFueSBvdGhlciByZWFzb24gZm9yIHJlbW92aW5nIHRoZSBjb25uZWN0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjYXRlZ29yaWVzIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXRlbVJlbW92ZVJlYXNvbkNvZGUge1xuICAgIEZyYXVkRmlyc3RQYXJ0eSA9ICdGUkFVRF9GSVJTVF9QQVJUWScsXG4gICAgRnJhdWRGYWxzZUlkZW50aXR5ID0gJ0ZSQVVEX0ZBTFNFX0lERU5USVRZJyxcbiAgICBGcmF1ZEFidXNlID0gJ0ZSQVVEX0FCVVNFJyxcbiAgICBGcmF1ZE90aGVyID0gJ0ZSQVVEX09USEVSJyxcbiAgICBDb25uZWN0aW9uSXNOb25GdW5jdGlvbmFsID0gJ0NPTk5FQ1RJT05fSVNfTk9OX0ZVTkNUSU9OQUwnLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEl0ZW1SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVJlbW92ZVJlYXNvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVhc29uX2NvZGU/OiBJdGVtUmVtb3ZlUmVhc29uQ29kZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBjb250ZXh0IG9yIGRldGFpbHMgYWJvdXQgdGhlIHJlYXNvbiBmb3IgcmVtb3ZpbmcgdGhlIEl0ZW0uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBgcmVhc29uX25vdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVhc29uX25vdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIGZhaWxzIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB3ZWJob29rIGZpcmVkIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgd2ViaG9vayB3YXMgZmlyZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIHNlbnRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHdlYmhvb2sgY29kZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIGNvZGVfc2VudD86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTGFzdFdlYmhvb2t9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBzdWNjZXNzZnVsbHkgY29ubmVjdHMgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuIFRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVjdCB0cmFuc2FjdGlvbnMgdXBkYXRlcyBwZXJmb3JtZWQgYnkgbm9uLVRyYW5zYWN0aW9ucyBwcm9kdWN0cyAoZS5nLiBTaWduYWwpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuIFRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVjdCB0cmFuc2FjdGlvbnMgdXBkYXRlcyBwZXJmb3JtZWQgYnkgbm9uLVRyYW5zYWN0aW9ucyBwcm9kdWN0cyAoZS5nLiBTaWduYWwpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBJdGVtLiBUbyByZW1vdmUgYSB3ZWJob29rIGZyb20gYW4gSXRlbSwgc2V0IHRvIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgd2l0aG91dCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLCBzdWNoIGFzIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgd2l0aG91dCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLCBzdWNoIGFzIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtQXV0aE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgYXV0aF9tZXRob2Q/OiBJdGVtQXV0aE1ldGhvZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBiaWxsZWRfcHJvZHVjdHNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgYmVlbiBiaWxsZWQgZm9yIHRoZSBJdGVtLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhdmFpbGFibGVfcHJvZHVjdHNgLiBOb3RlIC0gYGJpbGxlZF9wcm9kdWN0c2AgaXMgcG9wdWxhdGVkIGluIGFsbCBlbnZpcm9ubWVudHMgYnV0IG9ubHkgcmVxdWVzdHMgaW4gUHJvZHVjdGlvbiBhcmUgYmlsbGVkLiBBbHNvIG5vdGUgdGhhdCBwcm9kdWN0cyB0aGF0IGFyZSBiaWxsZWQgb24gYSBwYXktcGVyLWNhbGwgYmFzaXMgcmF0aGVyIHRoYW4gYSBwYXktcGVyLUl0ZW0gYmFzaXMsIHN1Y2ggYXMgYGJhbGFuY2VgLCB3aWxsIG5vdCBhcHBlYXIgaGVyZS4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgYmlsbGVkX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGFkZGVkIHRvIHRoZSBJdGVtLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGBiaWxsZWRfcHJvZHVjdHNgIGZpZWxkLiBGb3Igc29tZSBwcm9kdWN0cywgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBwcm9kdWN0IHRvIGJlIGFkZGVkIHRvIGFuIEl0ZW0gYnV0IG5vdCB5ZXQgYmlsbGVkIChlLmcuIEFzc2V0cywgYmVmb3JlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgaGFzIGJlZW4gY2FsbGVkLCBvciBBdXRoIG9yIElkZW50aXR5IHdoZW4gYWRkZWQgYXMgT3B0aW9uYWwgUHJvZHVjdHMgYnV0IGJlZm9yZSB0aGVpciBlbmRwb2ludHMgaGF2ZSBiZWVuIGNhbGxlZCksIGluIHdoaWNoIGNhc2UgdGhlIHByb2R1Y3QgbWF5IGFwcGVhciBpbiBgcHJvZHVjdHNgIGJ1dCBub3QgaW4gYGJpbGxlZF9wcm9kdWN0c2AuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoaXMgd2lsbCBjb25zaXN0IG9mIGFsbCBwcm9kdWN0cyB3aGVyZSBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gdGhlIHJlcXVpcmVkIGRhdGEgc2NvcGVzIGZvciB0aGF0IHByb2R1Y3QgYW5kIHlvdSBoYXZlIFByb2R1Y3Rpb24gYWNjZXNzIGZvciB0aGF0IHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGNvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgSXRlbVxcJ3MgYWNjZXNzIGNvbnNlbnQgd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gSWYgdGhlIEl0ZW0gZG9lcyBub3QgaGF2ZSBjb25zZW50IGV4cGlyYXRpb24gc2NoZWR1bGVkLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLiBDdXJyZW50bHksIG9ubHkgaW5zdGl0dXRpb25zIGluIEV1cm9wZSBhbmQgYSBzbWFsbCBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBoYXZlIGV4cGlyaW5nIGNvbnNlbnQuIEZvciBhIGxpc3Qgb2YgVVMgaW5zdGl0dXRpb25zIHRoYXQgY3VycmVudGx5IGV4cGlyZSBjb25zZW50LCBzZWUgdGhlIFtPQXV0aCBHdWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL29hdXRoLyNyZWZyZXNoaW5nLWl0ZW0tY29uc2VudCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgSXRlbXMgd2l0aCBzb21lIGZvcm1zIG9mIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24uICBgYmFja2dyb3VuZGAgLSBJdGVtIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBiYWNrZ3JvdW5kICBgdXNlcl9wcmVzZW50X3JlcXVpcmVkYCAtIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgdXBkYXRlX3R5cGU6IEl0ZW1XaXRoQ29uc2VudEZpZWxkc1VwZGF0ZVR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEl0ZW0gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB1c2UgY2FzZXMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpLiAgWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiB1c2UgY2FzZXMgb3IgdXBkYXRlIHRoZSBsaXN0IG9mIHVzZSBjYXNlcyB0byByZXF1ZXN0IGF0IGFueSB0aW1lIHZpYSB0aGUgTGluayBDdXN0b21pemF0aW9uIHNlY3Rpb24gb2YgdGhlIFtQbGFpZCBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LXY1KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX3VzZV9jYXNlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGRhdGEgc2NvcGVzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBgY29uc2VudGVkX3Byb2R1Y3RzYDsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jZGF0YS1zY29wZXMtYnktcHJvZHVjdCkgb2YgZGF0YSBzY29wZXMgYW5kIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxJdGVtQ29uc2VudGVkRGF0YVNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSXRlbVdpdGhDb25zZW50RmllbGRzVXBkYXRlVHlwZUVudW0ge1xuICAgIEJhY2tncm91bmQgPSAnYmFja2dyb3VuZCcsXG4gICAgVXNlclByZXNlbnRSZXF1aXJlZCA9ICd1c2VyX3ByZXNlbnRfcmVxdWlyZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEl0ZW0gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZlxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHVzZSBjYXNlcyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuICBZb3UgY2FuIHNlZSB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyBvciB1cGRhdGUgdGhlIGxpc3Qgb2YgdXNlIGNhc2VzIHRvIHJlcXVlc3QgYXQgYW55IHRpbWUgdmlhIHRoZSBMaW5rIEN1c3RvbWl6YXRpb24gc2VjdGlvbiBvZiB0aGUgW1BsYWlkIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktdjUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZlxuICAgICAqL1xuICAgIGNvbnNlbnRlZF91c2VfY2FzZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBkYXRhIHNjb3BlcyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgYGNvbnNlbnRlZF9wcm9kdWN0c2A7IHNlZSB0aGUgW2Z1bGwgbWFwcGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT47XG59XG4vKipcbiAqIEEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbSldUIGxpYnJhcmllc10oaHR0cHM6Ly9qd3QuaW8vI2xpYnJhcmllcy1pbykgdG8gdmVyaWZ5IFBsYWlkIHdlYmhvb2tzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXS1B1YmxpY0tleVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpXS1B1YmxpY0tleSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFsZyBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcnYgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgY3VydmUgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3J2OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtpZCAoS2V5IElEKSBtZW1iZXIgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYSBzcGVjaWZpYyBrZXkuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gY2hvb3NlIGFtb25nIGEgc2V0IG9mIGtleXMgd2l0aGluIHRoZSBKV0sgZHVyaW5nIGtleSByb2xsb3Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBraWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga3R5IChrZXkgdHlwZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleSwgc3VjaCBhcyBSU0Egb3IgRUMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga3R5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZSAocHVibGljIGtleSB1c2UpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgdXNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHggbWVtYmVyIGNvbnRhaW5zIHRoZSB4IGNvb3JkaW5hdGUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCwgcHJvdmlkZWQgYXMgYSBiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGNvb3JkaW5hdGVcXCdzIGJpZyBlbmRpYW4gcmVwcmVzZW50YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB5IG1lbWJlciBjb250YWlucyB0aGUgeSBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSBleHBpcmVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBKV1QgSGVhZGVyLCB1c2VkIGZvciB3ZWJob29rIHZhbGlkYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldUSGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSldUSGVhZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV1RIZWFkZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGtpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBhZGRyZXNzYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICB0eXBlOiBBZGRyZXNzUHVycG9zZUxhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgc3RyZWV0PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIGNpdHk/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgcmVnaW9uPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2RldGFpbHM/OiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYGRhdGVfb2ZfYmlydGhgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgZGF5PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICBtb250aD86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgeWVhcj86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBga3ljX2NoZWNrYCAoRGF0YSBTb3VyY2UgVmVyaWZpY2F0aW9uKSBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMua3ljX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYGt5Y19jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5reWNfY2hlY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0FkZHJlc3NTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja05hbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBLWUNDaGVja05hbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja1Bob25lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBLWUNDaGVja1Bob25lU3VtbWFyeTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgYWRkcmVzc2AgZmllbGQgbWF0Y2hlZCBmb3IgZmllbGRzIHRoYXQgYXJlIG9ubHkgcHJlc2VudCBvbiBhbiBpbnRlcm5hdGlvbmFsIEtZQyBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgYnVpbGRpbmc6IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgY291bnR5OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGRpc3RyaWN0OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGhvdXNlX251bWJlcjogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdWJwcmVtaXNlOiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIHRob3JvdWdoZmFyZTogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgaWRfbnVtYmVyYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0lETnVtYmVyU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBuYW1lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja05hbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja05hbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYHBob25lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tQaG9uZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIGFyZWFfY29kZTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhdHlwZSB3YXMgYWNjZXNzZWQgYnkgYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXN0RGF0YUFjY2Vzc1RpbWVzIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXBwbGljYXRpb24gYWNjZXNzaW5nIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgYWNjb3VudF9iYWxhbmNlX2luZm9gIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFjY291bnRfYmFsYW5jZV9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgYGFjY291bnRfcm91dGluZ19udW1iZXJgIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFjY291bnRfcm91dGluZ19udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgY29udGFjdF9kZXRhaWxzYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjb250YWN0X2RldGFpbHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgdHJhbnNhY3Rpb25zYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgY3JlZGl0X2FuZF9sb2Fuc2Agd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgY3JlZGl0X2FuZF9sb2Fuczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGBpbnZlc3RtZW50c2Agd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgcGF5cm9sbF9pbmZvYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luZm86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBgdHJhbnNhY3Rpb25fcmlza19pbmZvYCB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9yaXNrX2luZm86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBsYXRlc3Qgc2NvcmVkIGV2ZW50IGZvciBhIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhdGVzdFNjb3JlZEV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZXN0U2NvcmVkRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXRlc3RTY29yZWRFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgZXZlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGF0ZXN0U2NvcmVkRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXRlc3RTY29yZWRFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RydXN0SW5kZXh9XG4gICAgICogQG1lbWJlcm9mIExhdGVzdFNjb3JlZEV2ZW50XG4gICAgICovXG4gICAgdHJ1c3RfaW5kZXg6IFRydXN0SW5kZXggfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGZyYXVkIGF0dHJpYnV0ZXMgYXMgYW4gYXJiaXRyYXJ5IHNldCBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZSBzZXQgb2YgYXR0cmlidXRlcyByZXR1cm5lZCB2YXJpZXMgYnkgbW9kZWwuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMYXRlc3RTY29yZWRFdmVudFxuICAgICAqL1xuICAgIGZyYXVkX2F0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgUGxhaWRcXCdzIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCBmb3IgYSB1c2VyIGFuZCB0aGF0IFBsYWlkIGhhcyB2ZXJpZmllZCB0aGF0IHRoZSB1c2VyIG93bnMgdGhlaXIgcGhvbmUgbnVtYmVyLiBJZiB5b3UgcmVjZWl2ZSB0aGlzIHdlYmhvb2ssIHlvdSBzaG91bGQgc2tpcCB5b3VyIG93biBPVFAgcGhvbmUgbnVtYmVyIHZlcmlmaWNhdGlvbiBmbG93IGZvciB0aGUgdXNlciwgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdCBjb21wbGV0ZSB0aGUgZW50aXJlIExpbmsgZmxvdy4gSWYgdGhlIHVzZXIgZG9lc25cXCd0IGNvbXBsZXRlIHRoZSBmdWxsIExpbmsgZmxvdyAoYXMgdmVyaWZpZWQgYnkgeW91ciBiZWluZyBhYmxlIHRvIHN1Y2Nlc3NmdWxseSBjYWxsIGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YCB1c2luZyB0aGUgYHB1YmxpY190b2tlbmAgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2spIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGltcGxlbWVudCBbd2ViaG9vayB2ZXJpZmljYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzL3dlYmhvb2stdmVyaWZpY2F0aW9uLykgb3IgYW5vdGhlciB0ZWNobmlxdWUgdG8gYXZvaWQgd2ViaG9vayBzcG9vZmluZyBhdHRhY2tzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMYXllckF1dGhlbnRpY2F0aW9uUGFzc2VkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExheWVyQXV0aGVudGljYXRpb25QYXNzZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTEFZRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGF5ZXJBdXRoZW50aWNhdGlvblBhc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTEFZRVJfQVVUSEVOVElDQVRJT05fUEFTU0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExheWVyQXV0aGVudGljYXRpb25QYXNzZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGF5ZXJBdXRoZW50aWNhdGlvblBhc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhlc2UgZXZlbnRzIG9jY3VycmVkIGluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGF5ZXJBdXRoZW50aWNhdGlvblBhc3NlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGluayB0b2tlbiB1c2VkIHRvIGNyZWF0ZSB0aGUgTGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBhcmUgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExheWVyQXV0aGVudGljYXRpb25QYXNzZWRXZWJob29rXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTb3VyY2Ugb2YgdGhlIGxlZGdlciBldmVudC4gIGBcXFwiVFJBTlNGRVJcXFwiYCAtIFRoZSBzb3VyY2Ugb2YgdGhlIGxlZGdlciBldmVudCBpcyBhIHRyYW5zZmVyIGBcXFwiU1dFRVBcXFwiYCAtIFRoZSBzb3VyY2Ugb2YgdGhlIGxlZGdlciBldmVudCBpcyBhIHN3ZWVwIGBcXFwiUkVGVU5EXFxcImAgLSBUaGUgc291cmNlIG9mIHRoZSBsZWRnZXIgZXZlbnQgaXMgYSByZWZ1bmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExlZGdlckV2ZW50U291cmNlVHlwZSB7XG4gICAgVHJhbnNmZXIgPSAnVFJBTlNGRVInLFxuICAgIFN3ZWVwID0gJ1NXRUVQJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJ1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHRzIG9mIHRoZSBMZW5kU2NvcmVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGVuZFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVuZFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgcmV0dXJuZWQgYnkgdGhlIExlbmRTY29yZSBtb2RlbC4gV2lsbCBiZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAxIHRvIDk5LiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIGxvd2VyIGNyZWRpdCByaXNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExlbmRTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29ucyBmb3IgYW4gaW5kaXZpZHVhbCBoYXZpbmcgcmlzayBhY2NvcmRpbmcgdG8gdGhlIExlbmRTY29yZS4gRm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHJlYXNvbiBjb2RlcyBhbmQgYSBtYXBwaW5nIG9mIHJlYXNvbiBjb2RlcyB0byBodW1hbi1yZWFkYWJsZSByZWFzb25zLCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiBEaWZmZXJlbnQgTGVuZFNjb3JlIHZlcnNpb25zIHdpbGwgdXNlIGRpZmZlcmVudCBzZXRzIG9mIHJlYXNvbiBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGVuZFNjb3JlXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIExlbmRTY29yZSBjb3VsZCBub3QgYmUgY29tcHV0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGVuZFNjb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgTElBQklMSVRJRVNgIGFuZCBjb2RlIGBERUZBVUxUX1VQREFURWAgd2lsbCBiZSBmaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGxpYWJpbGl0aWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhIGxpYWJpbGl0aWVzIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElBQklMSVRJRVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBcXCdzIGZvciBhY2NvdW50cyB0aGF0IGNvbnRhaW4gbmV3IGxpYWJpbGl0aWVzLlxcJ1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF9uZXdfbGlhYmlsaXRpZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGgga2V5cyBvZiBgYWNjb3VudF9pZGBcXCdzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIGxpYWJpbGl0aWVzIGZpZWxkcyB0aGF0IGNoYW5nZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwicGFzdF9hbW91bnRfZHVlXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9saWFiaWxpdGllczogeyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2xpYWJpbGl0aWVzL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIGBvcHRpb25zYCBjYW5ub3QgYmUgbnVsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbGlhYmlsaXR5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVkaXQgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIGNyZWRpdDogQXJyYXk8Q3JlZGl0Q2FyZExpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3J0Z2FnZSBhY2NvdW50cyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIG1vcnRnYWdlOiBBcnJheTxNb3J0Z2FnZUxpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHVkZW50IGxvYW4gYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFN0dWRlbnRMb2FuPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBzdHVkZW50OiBBcnJheTxTdHVkZW50TG9hbj4gfCBudWxsO1xufVxuLyoqXG4gKiBVc2VkIHRvIGNvbmZpZ3VyZSBTYW5kYm94IHRlc3QgZGF0YSBmb3IgdGhlIExpYWJpbGl0aWVzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGxpYWJpbGl0eSBvYmplY3QsIGVpdGhlciBgY3JlZGl0YCBvciBgc3R1ZGVudGAuIE1vcnRnYWdlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhlIGN1c3RvbSBTYW5kYm94LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdXJjaGFzZSBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gRm9yIHNpbXBsaWNpdHksIHRoaXMgaXMgdGhlIG9ubHkgaW50ZXJlc3QgcmF0ZSB1c2VkIHRvIGNhbGN1bGF0ZSBpbnRlcmVzdCBjaGFyZ2VzLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHVyY2hhc2VfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNhc2ggQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjYXNoX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYWxhbmNlIHRyYW5zZmVyIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgYmFsYW5jZV90cmFuc2Zlcl9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lhbCBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNwZWNpYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsYXN0X3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYG1pbmltdW1fcGF5bWVudF9hbW91bnRgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgIG9yIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGlzX292ZXJkdWVgIGZpZWxkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBsb2FuIHByaW5jaXBhbC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwcmluY2lwYWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbm9taW5hbF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGludGVyZXN0IGNhcGl0YWxpemF0aW9uIGJlZ2lucyBhdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1vbnRocyBhZnRlciBsb2FuIG9yaWdpbmF0aW9uLiBCeSBkZWZhdWx0IGludGVyZXN0IGlzIG5ldmVyIGNhcGl0YWxpemVkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGludGVyZXN0X2NhcGl0YWxpemF0aW9uX2dyYWNlX3BlcmlvZF9tb250aHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfbW9kZWw6IFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWw7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBleHBlY3RlZF9wYXlvZmZfZGF0ZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZXhwZWN0ZWRfcGF5b2ZmX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGd1YXJhbnRvcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZ3VhcmFudG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19mZWRlcmFsYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfZmVkZXJhbDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGxvYW5fbmFtZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fc3RhdHVzOiBTdHVkZW50TG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwc2xmX3N0YXR1czogUFNMRlN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLmRlc2NyaXB0aW9uYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbl9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcmVwYXltZW50X3BsYW4udHlwZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBgXFxcImV4dGVuZGVkIGdyYWR1YXRlZFxcXCJgLCBgXFxcImV4dGVuZGVkIHN0YW5kYXJkXFxcImAsIGBcXFwiZ3JhZHVhdGVkXFxcImAsIGBcXFwiaW5jb21lLWNvbnRpbmdlbnQgcmVwYXltZW50XFxcImAsIGBcXFwiaW5jb21lLWJhc2VkIHJlcGF5bWVudFxcXCJgLCBgXFxcImluY29tZS1zZW5zaXRpdmUgcmVwYXltZW50XFxcImAsIGBcXFwiaW50ZXJlc3Qgb25seVxcXCJgLCBgXFxcIm90aGVyXFxcImAsIGBcXFwicGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwicmV2aXNlZCBwYXkgYXMgeW91IGVhcm5cXFwiYCwgYFxcXCJzdGFuZGFyZFxcXCJgLCBvciBgXFxcInNhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvblxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgc2VxdWVuY2VfbnVtYmVyYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXJ2aWNlcl9hZGRyZXNzOiBBZGRyZXNzO1xufVxuLyoqXG4gKiBBIHNwZWNpZmljIHVzZSBjYXNlIGZvciBhIGxpbWl0ZWQgcHVycG9zZSBjaGVja2luZyBhY2NvdW50LiBMaW1pdGVkIHB1cnBvc2UgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCByZWplY3Qgb3IgcmV0dXJuIEFDSCB0cmFuc2FjdGlvbnMgdGhhdCBhcmVuXFwndCBmb3IgZWxpZ2libGUgdXNlIGNhc2VzLiBGb3IgZXhhbXBsZSwgYSBgUkVOVF9NT1JUR0FHRWAgbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nIGFjY291bnQgd2lsbCByZWplY3QgQUNIIHRyYW5zYWN0aW9ucyB0aGF0IGFyZSBub3Qgc3BlY2lmaWNhbGx5IHJlbnQgb3IgbW9ydGdhZ2UgcGF5bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW1pdGVkUHVycG9zZVR5cGUge1xuICAgIFJlbnRNb3J0Z2FnZSA9ICdSRU5UX01PUlRHQUdFJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGNhbGxiYWNrIGZyb20gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtDYWxsYmFja01ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0NhbGxiYWNrTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhbGxiYWNrX3R5cGU/OiBMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRXZlbnROYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGV2ZW50X25hbWU/OiBMaW5rRXZlbnROYW1lO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGVyZSBpbiB0aGUgZmxvdyB0aGUgTGluayB1c2VyIGV4aXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgc3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYWNjb3VudHMgd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua0RlbGl2ZXJ5QWNjb3VudD47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIGFjY291bnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogTGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElmIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGlzIGJlaW5nIHVzZWQsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IGJlaW5nIHZlcmlmaWVkIGlzIGEgYGJ1c2luZXNzYCBvciBgcGVyc29uYWxgIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIGNsYXNzX3R5cGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2sgY29udGFpbmluZyBtZXRhZGF0YSBwcm94aWVkIG92ZXIgZnJvbSBMaW5rIGNhbGxiYWNrIGUuZy4gYG9uRXZlbnRgLCBgb25FeGl0YCwgYG9uU3VjY2Vzc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExJTktfQ0FMTEJBQ0tgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtDYWxsYmFja01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2NhbGxiYWNrX21ldGFkYXRhOiBMaW5rQ2FsbGJhY2tNZXRhZGF0YTtcbn1cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIGNvbnRhaW5pbmcgYm90aCB0aGUgdHlwZSBhbmQgYWRkcmVzcyB0byBzZW5kIHRoZSBVUkwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBtZXRob2Q/OiBMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIC8gZW1haWwgYWRkcmVzcyB0aGF0IEhvc3RlZCBMaW5rIHNlc3Npb25zIGFyZSBkZWxpdmVyZWQgdG8uIFBob25lIG51bWJlcnMgbXVzdCBiZSBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaW5rRGVsaXZlcnlPcHRpb25zO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24sIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGVsaXZlcnkgbWV0aG9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLiBTYW1lIGFzIHRoZSBgbGlua190b2tlbmAgc3RyaW5nIGV4Y2x1ZGluZyB0aGUgXFxcImxpbmste2Vudn0tXFxcIiBwcmVmaXguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZWxpdmVyeSBtZXRob2QgdG8gYmUgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTC4gIGBTTVNgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggU01TICBgRU1BSUxgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggZW1haWxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogTGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uIHdhcyBjcmVhdGVkIGF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24gd2FzIGNvbXBsZXRlZCBhdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGluc3RpdHV0aW9uIG5hbWUsIHN1Y2ggYXMgXFwnV2VsbHMgRmFyZ29cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBkZWxpdmVyeSBvZiB0aGUgbGluayBzZXNzaW9uIHRvIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZD86IExpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gICAgICovXG4gICAgZGVsaXZlcnlfc3RhdHVzPzogTGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzO1xufVxuLyoqXG4gKiBPcHRpb25hbCBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeU9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5UmVjaXBpZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlPcHRpb25zXG4gICAgICovXG4gICAgcmVjaXBpZW50PzogTGlua0RlbGl2ZXJ5UmVjaXBpZW50O1xufVxuLyoqXG4gKiBNZXRhZGF0YSByZWxhdGVkIHRvIHRoZSByZWNpcGllbnQuIElmIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBwb3B1bGF0ZSB0aGlzIGZpZWxkIGlzIG5vdCBhdmFpbGFibGUsIGxlYXZlIGl0IGJsYW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGNvbW11bmljYXRpb24gbWV0aG9kcyB0byBzZW5kIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTCB0by4gSWYgZGVsaXZlcnkgaXMgbm90IHJlcXVpcmVkLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5UmVjaXBpZW50XG4gICAgICovXG4gICAgY29tbXVuaWNhdGlvbl9tZXRob2RzPzogQXJyYXk8TGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZD47XG4gICAgLyoqXG4gICAgICogRmlyc3QgbmFtZSBvZiB0aGUgcmVjaXBpZW50LiBXaWxsIGJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsIC8gdGV4dCAoaWYgY29uZmlndXJlZCkuIElmIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uLiAgYENSRUFURURgOiBUaGUgc2Vzc2lvbiBpcyBjcmVhdGVkIGJ1dCBub3QgeWV0IGFjY2Vzc2VkIGJ5IHRoZSB1c2VyICBgT1BFTkVEYDogVGhlIHNlc3Npb24gaXMgb3BlbmVkIGJ5IHRoZSB1c2VyIGJ1dCBub3QgeWV0IGNvbXBsZXRlZCAgYEVYSVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGV4aXRlZCBieSB0aGUgdXNlciAgYENPTVBMRVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBieSB0aGUgdXNlciAgYEVYUElSRURgOiBUaGUgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1cyB7XG4gICAgQ3JlYXRlZCA9ICdDUkVBVEVEJyxcbiAgICBPcGVuZWQgPSAnT1BFTkVEJyxcbiAgICBFeGl0ZWQgPSAnRVhJVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnQ09NUExFVEVEJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBVbnNlbnQgPSAndW5zZW50JyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1BlbmRpbmcgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGVuZGluZydcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBMaW5rIGNhbGxiYWNrIGV2ZW50XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlIHtcbiAgICBTdWNjZXNzID0gJ09OX1NVQ0NFU1MnLFxuICAgIEV2ZW50ID0gJ09OX0VWRU5UJyxcbiAgICBFeGl0ID0gJ09OX0VYSVQnXG59XG5cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIHVzZWQgdG8gZGVsaXZlciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2Qge1xuICAgIFNtcyA9ICdTTVMnLFxuICAgIEVtYWlsID0gJ0VNQUlMJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBIb3N0ZWQgTGluayB0byB0aGUgdXNlclxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBBbiBldmVudCB0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSB1c2VyIHdhcyBnb2luZyB0aHJvdWdoIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0V2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50IHtcbiAgICAvKipcbiAgICAgKiBFdmVudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgZXZlbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVVJRCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZHVwbGljYXRlIGV2ZW50c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtFdmVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9tZXRhZGF0YTogTGlua0V2ZW50TWV0YWRhdGE7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IGFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieTogYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgdHlwZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMga2V5IGluZGljYXRlcyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIEVtaXR0ZWQgYnk6IGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGV4aXRfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB1c2VkIHRvIHNlYXJjaCBmb3IgaW5zdGl0dXRpb25zLiBFbWl0dGVkIGJ5OiBgU0VBUkNIX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlYXJjaF9xdWVyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIHN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdXNlciBoYXMgZW5jb3VudGVyZWQgb25lIG9mIHRoZSBmb2xsb3dpbmcgTUZBIHR5cGVzOiBjb2RlLCBkZXZpY2UsIHF1ZXN0aW9ucywgc2VsZWN0aW9ucy4gRW1pdHRlZCBieTogYFNVQk1JVF9NRkFgIGFuZCBgVFJBTlNJVElPTl9WSUVXYCB3aGVuIGB2aWV3X25hbWVgIGlzIGBNRkFgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbWZhX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHZpZXcgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgdG8uIEVtaXR0ZWQgYnk6IGBUUkFOU0lUSU9OX1ZJRVdgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdmlld19uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciB0aGUgdmVyaWZpY2F0aW9uIG1ldGhvZCBmb3IgYSBtYXRjaGVkIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBBdXRoIFR5cGUgU2VsZWN0IGZsb3cgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgc2VsZWN0ZWQgdmVyaWZpY2F0aW9uIG1ldGhvZCwgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBwaG9uZW90cGAgb3IgYHBhc3N3b3JkYDsgIGlmIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZWxlY3RlZCBBdXRoIFR5cGUgU2VsZWN0IGZsb3csIHRoZW4gcG9zc2libGUgdmFsdWVzIGFyZSBgZmxvd190eXBlX21hbnVhbGAgb3IgYGZsb3dfdHlwZV9pbnN0YW50YC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX1ZFUklGWV9NRVRIT0RgIGFuZCBgU0VMRUNUX0FVVEhfVFlQRWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGJyYW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYnJhbmRfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoaXMgaW5zdGl0dXRpb24gd2FzIG1hdGNoZWQuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYHJldHVybmluZ191c2VyYCBvciBgcm91dGluZ19udW1iZXJgIGlmIGVtaXR0ZWQgYnkgYE1BVENIRURfU0VMRUNUX0lOU1RJVFVUSU9OYC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgYmUgYFNBVkVEX0lOU1RJVFVUSU9OYCBvciBgQVVUT19TRUxFQ1RfU0FWRURfSU5TVElUVVRJT05gIGlmIGVtaXR0ZWQgYnkgYFNFTEVDVF9JTlNUSVRVVElPTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXRjaF9yZWFzb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIHN1Ym1pdHRlZCBieSB0aGUgdXNlciBhdCB0aGUgbWljcm8tZGVwb3NpdHMgcm91dGluZyBudW1iZXIgcGFuZS4gRW1pdHRlZCBieSBgU1VCTUlUX1JPVVRJTkdfTlVNQkVSYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBtYXNrIGV4dHJhY3RlZCBmcm9tIHRoZSB1c2VyLXByb3ZpZGVkIGFjY291bnQgbnVtYmVyLiBJZiB0aGUgdXNlci1pbnB1dHRlZCBhY2NvdW50IG51bWJlciBpcyBmb3VyIGRpZ2l0cyBsb25nLCBgYWNjb3VudF9udW1iZXJfbWFza2AgaXMgZW1wdHkuIEVtaXR0ZWQgYnkgYFNVQk1JVF9BQ0NPVU5UX05VTUJFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcl9tYXNrPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV2ZW50IHRoYXQgaGFzIGp1c3Qgb2NjdXJyZWQgaW4gdGhlIExpbmsgZmxvdy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtFdmVudE5hbWUge1xuICAgIEJhbmtJbmNvbWVJbnNpZ2h0c0NvbXBsZXRlZCA9ICdCQU5LX0lOQ09NRV9JTlNJR0hUU19DT01QTEVURUQnLFxuICAgIENsb3NlT2F1dGggPSAnQ0xPU0VfT0FVVEgnLFxuICAgIEVycm9yID0gJ0VSUk9SJyxcbiAgICBFeGl0ID0gJ0VYSVQnLFxuICAgIEZhaWxPYXV0aCA9ICdGQUlMX09BVVRIJyxcbiAgICBIYW5kb2ZmID0gJ0hBTkRPRkYnLFxuICAgIElzc3VlRm9sbG93ZWQgPSAnSVNTVUVfRk9MTE9XRUQnLFxuICAgIE9wZW4gPSAnT1BFTicsXG4gICAgT3Blbk15UGxhaWQgPSAnT1BFTl9NWV9QTEFJRCcsXG4gICAgT3Blbk9hdXRoID0gJ09QRU5fT0FVVEgnLFxuICAgIFNlYXJjaEluc3RpdHV0aW9uID0gJ1NFQVJDSF9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0QXV0aFR5cGUgPSAnU0VMRUNUX0FVVEhfVFlQRScsXG4gICAgU2VsZWN0QnJhbmQgPSAnU0VMRUNUX0JSQU5EJyxcbiAgICBTZWxlY3REZWdyYWRlZEluc3RpdHV0aW9uID0gJ1NFTEVDVF9ERUdSQURFRF9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0RG93bkluc3RpdHV0aW9uID0gJ1NFTEVDVF9ET1dOX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3RGaWx0ZXJlZEluc3RpdHV0aW9uID0gJ1NFTEVDVF9GSUxURVJFRF9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0SW5zdGl0dXRpb24gPSAnU0VMRUNUX0lOU1RJVFVUSU9OJyxcbiAgICBTdWJtaXRBY2NvdW50TnVtYmVyID0gJ1NVQk1JVF9BQ0NPVU5UX05VTUJFUicsXG4gICAgU3VibWl0Q3JlZGVudGlhbHMgPSAnU1VCTUlUX0NSRURFTlRJQUxTJyxcbiAgICBTdWJtaXREb2N1bWVudHMgPSAnU1VCTUlUX0RPQ1VNRU5UUycsXG4gICAgU3VibWl0RG9jdW1lbnRzRXJyb3IgPSAnU1VCTUlUX0RPQ1VNRU5UU19FUlJPUicsXG4gICAgU3VibWl0RG9jdW1lbnRzU3VjY2VzcyA9ICdTVUJNSVRfRE9DVU1FTlRTX1NVQ0NFU1MnLFxuICAgIFN1Ym1pdE1mYSA9ICdTVUJNSVRfTUZBJyxcbiAgICBTdWJtaXRSb3V0aW5nTnVtYmVyID0gJ1NVQk1JVF9ST1VUSU5HX05VTUJFUicsXG4gICAgVHJhbnNpdGlvblZpZXcgPSAnVFJBTlNJVElPTl9WSUVXJyxcbiAgICBWaWV3RGF0YVR5cGVzID0gJ1ZJRVdfREFUQV9UWVBFUydcbn1cblxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgY29udGFpbnMgYSBzdW1tYXJ5IG9mIHRoZSBldmVudHMgZnJvbSBhIExpbmsgc2Vzc2lvbiBhbmQgd2lsbCBiZSBmaXJlZCBhZnRlciB0aGUgdXNlciBmaW5pc2hlcyBnb2luZyB0aHJvdWdoIExpbmsuIElmIHRoZSB1c2VyIGFiYW5kb25zIHRoZSBMaW5rIGZsb3cgKGkuZS4sIGNsb3NlcyB0aGUgaG9zdGVkIGxpbmsgd2VicGFnZSBvciBsZWF2ZXMgTGluayBvcGVuIGZvciB0b28gbG9uZyB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uKSwgdGhlIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCA1LTE1IG1pbnV0ZXMgYWZ0ZXIgdGhlIGxhc3QgdXNlciBpbnRlcmFjdGlvbi4gQSBzaW5nbGUgTGluayBzZXNzaW9uIG1heSBvY2Nhc2lvbmFsbHkgZ2VuZXJhdGUgbXVsdGlwbGUgYEVWRU5UU2Agd2ViaG9va3MuIElmIHRoaXMgb2NjdXJzLCB0aGUgbmV3IHdlYmhvb2sgd2lsbCBjb250YWluIGFsbCBwcmV2aW91cyBldmVudHMgZm9yIHRoZSBzZXNzaW9uLCBhcyB3ZWxsIGFzIG5ldyBldmVudHMgdGhhdCBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgYEVWRU5UU2Agd2ViaG9vayB3YXMgc2VudC4gSWYgdGhpcyBvY2N1cnMsIGV2ZW50cyBjYW4gYmUgZ3JvdXBlZCB1c2luZyB0aGUgYGxpbmtfc2Vzc2lvbl9pZGAgZmllbGQgYW5kLCBpZiBuZWNlc3NhcnksIGRlLWR1cGxpY2F0ZWQgdXNpbmcgdGhlIGBldmVudF9pZGAgZmllbGQuICBCeSBkZWZhdWx0LCB0aGUgYEVWRU5UU2Agd2ViaG9vayBpcyBzZW50IG9ubHkgZm9yIHNlc3Npb25zIHdoZXJlIHRoZSBlbmQgdXNlciBnb2VzIHRocm91Z2ggYSBIb3N0ZWQgTGluayBmbG93IChpbmNsdWRpbmcgTGluayBSZWNvdmVyeSBmbG93cykuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBzZXNzaW9ucyBub3QgdXNpbmcgSG9zdGVkIExpbmssIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgb3Igc3VwcG9ydC4gVGhpcyBlbmFibGVtZW50IHdpbGwgYWxzbyBjYXVzZSB5b3UgdG8gcmVjZWl2ZSB0aGUgYFNFU1NJT05fRklOSVNIRURgIHdlYmhvb2sgZm9yIG5vbi1Ib3N0ZWQtTGluayBzZXNzaW9ucyBhbmQgdG8gYmUgYWJsZSB0byB1c2UgYC9saW5rL3Rva2VuL2dldGAgdG8gcmVjZWl2ZSBldmVudHMgZGF0YSBmb3Igbm9uLUhvc3RlZCBMaW5rIHNlc3Npb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudHNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFVkVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGluayBldmVudHMgZW1pdHRlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGV2ZW50czogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBvY2N1cnJlZCBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgYXJlIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay9vYXV0aC9jb3JyZWxhdGlvbl9pZC9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmcm9tIGEgcmVjZWl2ZWQgT0F1dGggcmVkaXJlY3QgVVJJIGNhbGxiYWNrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfY29ycmVsYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmsvb2F1dGgvY29ycmVsYXRpb25faWQvZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgbGlua190b2tlbmAgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYGxpbmtfY29ycmVsYXRpb25faWRgLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZS1pbml0aWFsaXplIExpbmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGJhbmsgZW1wbG95bWVudCB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM6IENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZG9jdW1lbnQgdXBsb2FkIENSQSBzZXNzaW9uIGluIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fYmFua19zdGF0ZW1lbnRzX3VwbG9hZGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgUGxhaWQgQ2hlY2sgSXRlbSBhZGQgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgQ2hlY2sgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIFRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBgYWNjb3VudHNgIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIFBsYWlkIENoZWNrIEl0ZW0gdXBkYXRlIHZpYSB1cGRhdGUgbW9kZSBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYVVwZGF0ZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgQ2hlY2sgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIFRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFVcGRhdGVSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIFtvbkV4aXRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay93ZWIvI29uZXhpdCkgY2FsbGJhY2sgZnJvbSBMaW5rLiBJZiB5b3UgYXJlIG5vdCByZWNlaXZpbmcgdGhpcyBmaWVsZCBhbmQgYXJlIGluc3RlYWQgcmVjZWl2aW5nIHRoZSBkZXByZWNhdGVkIGBvbl9leGl0YCBmaWVsZCwgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byB1cGRhdGUgeW91ciBpbnRlZ3JhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25FeGl0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbmV4aXQpIGNhbGxiYWNrIGZyb20gTGluay4gVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBvbmx5IGZvciBsZWdhY3kgaW1wbGVtZW50YXRpb25zIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtgZXhpdGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tZ2V0LXJlc3BvbnNlLWxpbmstc2Vzc2lvbnMtZXhpdCksIGZvciBpbXByb3ZlZCBuYW1pbmcgY29uc2lzdGVuY3kuIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZmllbGQsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIgYGV4aXRgIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIGlmIGEgdXNlciBleGl0cyBMaW5rIHdpdGhvdXQgc3VjY2Vzc2Z1bGx5IGxpbmtpbmcgYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIHN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGluc3RpdHV0aW9uIG9iamVjdC4gSWYgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IG9yIEluc3RhbnQgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgV2VsbHMgRmFyZ29gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24sIGFsb25nIHdpdGggdGhlIHB1YmxpYyB0b2tlbihzKSBpZiBhdmFpbGFibGUuICBCeSBkZWZhdWx0LCB0aGlzIHdlYmhvb2sgaXMgc2VudCBvbmx5IGZvciBzZXNzaW9ucyBlbmFibGVkIGZvciB0aGUgSG9zdGVkIExpbmsgZmxvdyAoaW5jbHVkaW5nIExpbmsgUmVjb3ZlcnkgZmxvd3MpLCBhIE11bHRpLUl0ZW0gTGluayBmbG93LCBvciBhIExheWVyIGZsb3cuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBvdGhlciBzZXNzaW9ucywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBvciBzdXBwb3J0LiBUaGlzIGVuYWJsZW1lbnQgd2lsbCBhbHNvIGVuYWJsZSB0aGUgYEVWRU5UU2Agd2ViaG9vayBmb3IgYWxsIExpbmsgc2Vzc2lvbnMgYW5kIHRoZSBhYmlsaXR5IHRvIHVzZSBgL2xpbmsvdG9rZW4vZ2V0YCB0byByZXRyaWV2ZSBldmVudHMgZm9yIG5vbi1Ib3N0ZWQtTGluayBzZXNzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU0VTU0lPTl9GSU5JU0hFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIExpbmsgc2Vzc2lvbi4gV2lsbCBhbHdheXMgYmUgXFxcIlNVQ0NFU1NcXFwiIG9yIFxcXCJFWElURURcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGxpbmtfdG9rZW5gIHVzZWQgdG8gY3JlYXRlIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbiBnZW5lcmF0ZWQgYnkgdGhlIExpbmsgc2Vzc2lvbi4gVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkOyBwbGVhc2UgdXNlIGBwdWJsaWNfdG9rZW5zYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbnMgZ2VuZXJhdGVkIGJ5IHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgcHVibGljX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhbiBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFJldHVybmVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBheXN0dWJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBXLTJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uIElmIHlvdSBhcmUgbm90IHJlY2VpdmluZyB0aGlzIGZpZWxkIGFuZCBhcmUgaW5zdGVhZCByZWNlaXZpbmcgdGhlIGRlcHJlY2F0ZWQgYG9uX3N1Y2Nlc3NgIGZpZWxkLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHVwZGF0ZSB5b3VyIGludGVncmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBpdGVtX2FkZF9yZXN1bHRzOiBBcnJheTxMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgUGxhaWQgQ2hlY2sgSXRlbSBhZGRzIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBjcmFfaXRlbV9hZGRfcmVzdWx0czogQXJyYXk8TGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIFBsYWlkIENoZWNrIEl0ZW0gdXBkYXRlcyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25DcmFVcGRhdGVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBjcmFfdXBkYXRlX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uQ3JhVXBkYXRlUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luY29tZV9yZXN1bHRzOiBBcnJheTxMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGRvY3VtZW50X2luY29tZV9yZXN1bHRzOiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBjcmFfZG9jdW1lbnRfdXBsb2FkX3Jlc3VsdHM/OiBMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25TdWNjZXNzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbnN1Y2Nlc3MpIGNhbGxiYWNrIGZyb20gTGluay4gVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBvbmx5IGZvciBsZWdhY3kgaW50ZWdyYXRpb25zIGFuZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtgcmVzdWx0cy5pdGVtX2FkZF9yZXN1bHRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1nZXQtcmVzcG9uc2UtbGluay1zZXNzaW9ucy1yZXN1bHRzLWl0ZW0tYWRkLXJlc3VsdHMpIHdoaWNoIGNhbiBzdXBwb3J0IG11bHRpcGxlIHB1YmxpYyB0b2tlbnMgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLCBmb3IgZmxvd3Mgc3VjaCBhcyBtdWx0aS1JdGVtIExpbmsuIElmIHlvdSBhcmUgcmVjZWl2aW5nIGBvbl9zdWNjZXNzYCwgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBtaWdyYXRlIHRvIGByZXN1bHRzLml0ZW1fYWRkX3Jlc3VsdHNgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2VzcyB7XG4gICAgLyoqXG4gICAgICogRGlzcGxheWVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBEaXNwbGF5ZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYGFjY291bnRzYCB3aWxsIG9ubHkgaW5jbHVkZSBzZWxlY3RlZCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB1c2VyXFwncyBhY3Rpb25zIGFuZCBldmVudHMgdGhyb3VnaCB0aGUgTGluayBmbG93LiBJbmNsdWRlIHRoaXMgaWRlbnRpZmllciB3aGVuIG9wZW5pbmcgYSBzdXBwb3J0IHRpY2tldCBmb3IgZmFzdGVyIHR1cm5hcm91bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgdHJhbnNmZXJfc3RhdHVzPzogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1cyB8IG51bGw7XG59XG4vKipcbiAqIEFuIGFjY291bnQgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIGFjY291bnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cy4gSXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCB3aGVuIHVzaW5nIEF1dGggYW5kIGZhbGxpbmcgYmFjayB0byBtaWNyby1kZXBvc2l0IG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQuICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB1bnNlbnRgOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCBidXQgUGxhaWQgaGFzIG5vdCB5ZXQgc2VudCB0aGUgbWljcm8tZGVwb3NpdC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wZW5kaW5nYDogVGhlIERhdGFiYXNlIEF1dGggcmVzdWx0IGlzIHBlbmRpbmcgYW5kIHdpbGwgYmUgYXZhaWxhYmxlIHVwb24gQXV0aCByZXF1ZXN0LiAgYGRhdGFiYXNlX2luc2lnaHRzX2ZhaWxgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gVHlwaWNhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQsIHRoZSBhY2NvdW50IG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGluZyBudW1iZXIsIG9yIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlcG9ydGVkIGFzIGNsb3NlZCBvciBmcm96ZW4uIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXM6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciBtYXRjaCBhIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVyIG9mIGFuIGFjY291bnQgcmVjb2duaXplZCBvbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIHRoZSBhY2NvdW50IGlzIG5vdCBrbm93biBieSBQbGFpZCB0byBiZSBmcm96ZW4gb3IgY2xvc2VkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEF1dGguICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQ6IHRoZSByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlciB3ZXJlIG5vdCByZWNvZ25pemVkIG9uIHRoZSBQbGFpZCBuZXR3b3JrLCBidXQgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHZhbGlkIGFuZCB0aGUgYWNjb3VudCBudW1iZXIgaXMgYSBwb3RlbnRpYWwgdmFsaWQgYWNjb3VudCBudW1iZXIgZm9yIHRoYXQgcm91dGluZyBudW1iZXIuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgQXV0aC4gIGBkYXRhYmFzZV9tYXRjaGVkYDogKGRlcHJlY2F0ZWQpIFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYG51bGxgIG9yIGVtcHR5IHN0cmluZzogTmVpdGhlciBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBub3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gd2FzIGJlaW5nIHVzZWQsIGluZGljYXRlcyB0aGUgdXNlclxcJ3Mgc2VsZWN0aW9uIHdoZW4gYXNrZWQgaWYgdGhlIGFjY291bnQgYmVpbmcgdmVyaWZpZWQgaXMgYSBgYnVzaW5lc3NgIG9yIGBwZXJzb25hbGAgYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGFzIFBsYWlkIG5vIGxvbmdlciBjb2xsZWN0cyB0aGlzIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgbWljcm8tZGVwb3NpdCBmbG93LiBUbyBzZWUgd2hldGhlciBhbiBhY2NvdW50IGlzIGJ1c2luZXNzIG9yIHBlcnNvbmFsLCB1c2UgdGhlIGBob2xkZXJfY2F0ZWdvcnlgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgb3IgSW5zdGFudCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiwgd2lsbCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBcXCdXZWxscyBGYXJnb1xcJ2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHRyYW5zZmVyLiBSZXR1cm5lZCBvbmx5IHdoZW4gW1RyYW5zZmVyIFVJXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpKSBpcyBpbXBsZW1lbnRlZC4gIC0gYENPTVBMRVRFYCAtIFRoZSB0cmFuc2ZlciB3YXMgY29tcGxldGVkLiAtIGBJTkNPTVBMRVRFYCAtIFRoZSB0cmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBGb3IgaGVscCwgc2VlIFtUcm91Ymxlc2hvb3RpbmcgdHJhbnNmZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpLyN0cm91Ymxlc2hvb3RpbmctdHJhbnNmZXItdWkpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1cyB7XG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnLFxuICAgIEluY29tcGxldGUgPSAnSU5DT01QTEVURScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEJ5IGRlZmF1bHQsIExpbmsgd2lsbCBwcm92aWRlIGxpbWl0ZWQgYWNjb3VudCBmaWx0ZXJpbmc6IGl0IHdpbGwgb25seSBkaXNwbGF5IEluc3RpdHV0aW9ucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIHByb2R1Y3RzIHN1cHBsaWVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgYW5kLCBpZiBgYXV0aGAgaXMgc3BlY2lmaWVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCB3aWxsIGFsc28gZmlsdGVyIG91dCBhY2NvdW50cyBvdGhlciB0aGFuIGBjaGVja2luZ2AsIGBzYXZpbmdzYCwgYW5kIGBjYXNoIG1hbmFnZW1lbnRgIGFjY291bnRzIG9uIHRoZSBBY2NvdW50IFNlbGVjdCBwYW5lLiBZb3UgY2FuIGZ1cnRoZXIgbGltaXQgdGhlIGFjY291bnRzIHNob3duIGluIExpbmsgYnkgdXNpbmcgYGFjY291bnRfZmlsdGVyc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBzaG93biBpbiBMaW5rLiBPbmx5IHRoZSBzcGVjaWZpZWQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gVGhpcyBmaWx0ZXJpbmcgYXBwbGllcyB0byBib3RoIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3IChpZiBlbmFibGVkKSBhbmQgdGhlIEluc3RpdHV0aW9uIFNlbGVjdCB2aWV3LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgc2VsZWN0ZWQgc3VidHlwZXMgd2lsbCBiZSBvbWl0dGVkIGZyb20gTGluay4gVG8gaW5kaWNhdGUgdGhhdCBhbGwgc3VidHlwZXMgc2hvdWxkIGJlIHNob3duLCB1c2UgdGhlIHZhbHVlIGBcXFwiYWxsXFxcImAuIElmIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBmaWx0ZXIgaXMgdXNlZCwgYW55IGFjY291bnQgdHlwZSBmb3Igd2hpY2ggYSBmaWx0ZXIgaXMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGVudGlyZWx5IG9taXR0ZWQgZnJvbSBMaW5rLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBUaGUgZmlsdGVyIG1heSBvciBtYXkgbm90IGltcGFjdCB0aGUgbGlzdCBvZiBhY2NvdW50cyBzaG93biBieSB0aGUgaW5zdGl0dXRpb24gaW4gdGhlIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3csIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgaW5zdGl0dXRpb24uIElmIHRoZSB1c2VyIHNlbGVjdHMgZXhjbHVkZWQgYWNjb3VudCBzdWJ0eXBlcyBpbiB0aGUgT0F1dGggZmxvdywgdGhlc2UgYWNjb3VudHMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIEl0ZW0uIElmIHRoZSB1c2VyIHNlbGVjdHMgb25seSBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzLCB0aGUgbGluayBhdHRlbXB0IHdpbGwgZmFpbCBhbmQgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byB0cnkgYWdhaW4uIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBsb2FuPzogTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3RoZXJGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgb3RoZXI/OiBPdGhlckZpbHRlcjtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgQ2FzaGZsb3cgUmVwb3J0IHByb2R1Y3QuIEN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ2FzaGZsb3dSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGluIHRoZSBDYXNoZmxvdyBSZXBvcnQgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdG8gcGFzcyBpbiBmb3IgdGhlIENhcmQgU3dpdGNoIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQklOIChCYW5rIElkZW50aWZpY2F0aW9uIE51bWJlcikgb2YgdGhlIGNhcmQgdG8gc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAgICAgKi9cbiAgICBjYXJkX2Jpbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgbGltaXRlZCBwdXJwb3NlIHR5cGVzLiBSZXN0cmljdHMgd2hpY2gga2luZHMgb2YgbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nIGFjY291bnRzIG1heSBiZSBjb25uZWN0ZWQgaW4gTGluayB0byBwcmV2ZW50IHVzZXJzIGZyb20gY29ubmVjdGluZyB0aGVtIGZvciB1bnN1cHBvcnRlZCB1c2UgY2FzZXMuIFJlcXVpcmVkIHdoZW4gXFwnbGltaXRlZCBwdXJwb3NlIGNoZWNraW5nXFwnIGlzIGluIHRoZSBzdWJ0eXBlcyBmaWx0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PExpbWl0ZWRQdXJwb3NlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJcbiAgICAgKi9cbiAgICBsaW1pdGVkX3B1cnBvc2VfdHlwZXM/OiBBcnJheTxMaW1pdGVkUHVycG9zZVR5cGU+O1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEhvc3RlZCBMaW5rLiBUbyBlbmFibGUgdGhlIHNlc3Npb24gZm9yIEhvc3RlZCBMaW5rLCBzZW5kIHRoaXMgb2JqZWN0IGluIHRoZSByZXF1ZXN0LiBJdCBjYW4gYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgZGVsaXZlcnlfbWV0aG9kPzogSG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFVSSSB0aGF0IEhvc3RlZCBMaW5rIHdpbGwgcmVkaXJlY3QgdG8gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBMaW5rIGZsb3cuIFRoaXMgd2lsbCBvbmx5IG9jY3VyIGluIEhvc3RlZCBMaW5rIHNlc3Npb25zLCBub3QgaW4gb3RoZXIgaW1wbGVtZW50YXRpb24gbWV0aG9kcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGNvbXBsZXRpb25fcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IHNlY29uZHMgdGhlIGxpbmsgd2lsbCBiZSB2YWxpZCBmb3IuIE11c3QgYmUgcG9zaXRpdmUuIENhbm5vdCBiZSBsb25nZXIgdGhhbiAyMSBkYXlzLiBUaGUgZGVmYXVsdCBsaWZldGltZSBpcyA3IGRheXMgZm9yIGxpbmtzIGRlbGl2ZXJlZCBieSBlbWFpbCwgMSBkYXkgZm9yIGxpbmtzIGRlbGl2ZXJlZCB2aWEgU01TLCBhbmQgMzAgbWludXRlcyBmb3IgbGlua3Mgbm90IHNlbnQgdmlhIFBsYWlkIExpbmsgZGVsaXZlcnkuIFRoaXMgcGFyYW1ldGVyIHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIGFsbCB0aHJlZSBsaW5rIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgdXJsX2xpZmV0aW1lX3NlY29uZHM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2xpZW50IGlzIG9wZW5pbmcgSG9zdGVkIExpbmsgaW4gYSBtb2JpbGUgYXBwIGluIGFuIGBBc1dlYkF1dGhlbnRpY2F0aW9uU2Vzc2lvbmAgb3IgQ2hyb21lIGN1c3RvbSB0YWIuIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgaXNfbW9iaWxlX2FwcD86IGJvb2xlYW47XG59XG4vKipcbiAqIElkZW50aXR5IG9iamVjdCB1c2VkIHRvIHNwZWNpZnkgZG9jdW1lbnQgdXBsb2FkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgaXNfZG9jdW1lbnRfdXBsb2FkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgLiBDdXJyZW50bHkgY2FuIG9ubHkgY29udGFpbiBvbmUgYGFjY291bnRfaWRgLiBNdXN0IGJlIHBvcHVsYXRlZCBpZiB1c2luZyBEb2N1bWVudCBVcGxvYWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBhcnNpbmcgY29uZmlndXJhdGlvbnMuIFZhbGlkIHBhcnNpbmcgY29uZmlndXJhdGlvbnMgYXJlIGBvY3JgIGFuZCBgcmlza19zaWduYWxzYC4gSWYgcGFyc2luZyBjb25maWd1cmF0aW9ucyBhcmUgb21pdHRlZCwgZGVmYXVsdHMgdG8gYG9jcmBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWdzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz47XG59XG4vKipcbiAqIEEgbWFwIGNvbnRhaW5pbmcgZGF0YSB1c2VkIHRvIGhpZ2hsaWdodCBpbnN0aXR1dGlvbnMgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGJhbmsgdG8gaGlnaGxpZ2h0IGluIExpbmsuIE5vdGU6IGluIHJhcmUgY2FzZXMsIGEgc2luZ2xlIHJvdXRpbmcgbnVtYmVyIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgaW5zdGl0dXRpb25zLCBlLmcuIGR1ZSB0byBhIGJyb2tlcmFnZSB1c2luZyBhbm90aGVyIGluc3RpdHV0aW9uIHRvIG1hbmFnZSBBQ0ggb24gaXRzIHN3ZWVwIGFjY291bnRzLiBJZiB0aGlzIGhhcHBlbnMsIHRoZSBiYW5rIHdpbGwgbm90IGJlIGhpZ2hsaWdodGVkIGluIExpbmsgZXZlbiBpZiB0aGUgcm91dGluZyBudW1iZXIgaXMgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllcikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PExvYW5BY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIGFwcGxpY2F0aW9uLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIExpbmsuIE1heGltdW0gbGVuZ3RoIG9mIDMwIGNoYXJhY3RlcnMuIElmIGEgdmFsdWUgbG9uZ2VyIHRoYW4gMzAgY2hhcmFjdGVycyBpcyBwcm92aWRlZCwgTGluayB3aWxsIGRpc3BsYXkgXFxcIlRoaXMgQXBwbGljYXRpb25cXFwiIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhbmd1YWdlIHRoYXQgTGluayBzaG91bGQgYmUgZGlzcGxheWVkIGluLiBXaGVuIGluaXRpYWxpemluZyB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgdGhpcyBmaWVsZCBpcyBub3QgdXNlZDsgZm9yIG1vcmUgZGV0YWlscywgc2VlIFtJZGVudGl0eSBWZXJpZmljYXRpb24gc3VwcG9ydGVkIGxhbmd1YWdlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vI3N1cHBvcnRlZC1sYW5ndWFnZXMpLiAgU3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IC0gRGFuaXNoIChgXFwnZGFcXCdgKSAtIER1dGNoIChgXFwnbmxcXCdgKSAtIEVuZ2xpc2ggKGBcXCdlblxcJ2ApIC0gRXN0b25pYW4gKGBcXCdldFxcJ2ApIC0gRnJlbmNoIChgXFwnZnJcXCdgKSAtIEdlcm1hbiAoYFxcJ2RlXFwnYCkgLSBIaW5kaSAoYFxcJ2hpXFwnYCkgLSBJdGFsaWFuIChgXFwnaXRcXCdgKSAtIExhdHZpYW4gKGBcXCdsdlxcJ2ApIC0gTGl0aHVhbmlhbiAoYFxcJ2x0XFwnYCkgLSBOb3J3ZWdpYW4gKGBcXCdub1xcJ2ApIC0gUG9saXNoIChgXFwncGxcXCdgKSAtIFBvcnR1Z3Vlc2UgKGBcXCdwdFxcJ2ApIC0gUm9tYW5pYW4gKGBcXCdyb1xcJ2ApIC0gU3BhbmlzaCAoYFxcJ2VzXFwnYCkgLSBTd2VkaXNoIChgXFwnc3ZcXCdgKSAtIFZpZXRuYW1lc2UgKGBcXCd2aVxcJ2ApICBXaGVuIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJlZCBoZXJlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmcgaW4gdGhlIGN1c3RvbWl6YXRpb24sIG9yIHRoZSBjdXN0b21pemF0aW9uIHdpbGwgbm90IGJlIGFwcGxpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiBQbGFpZC1zdXBwb3J0ZWQgY291bnRyeSBjb2RlcyB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW5zdGl0dXRpb25zIGZyb20gYWxsIGxpc3RlZCBjb3VudHJpZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgY29tcGxldGUgbWFwcGluZyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMgYnkgY291bnRyeSwgc2VlIGh0dHBzOi8vc3VwcG9ydC5wbGFpZC5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjc4OTU4MjY5NDc3MzUtV2hhdC1QbGFpZC1wcm9kdWN0cy1hcmUtc3VwcG9ydGVkLWluLWVhY2gtY291bnRyeS1hbmQtcmVnaW9uLiBGb3IgYWNjZXNzIHRvIGFkZGl0aW9uYWwgY291bnRyaWVzIGJleW9uZCB3aGF0IHlvdSBoYXZlIGJlZW4gYXBwcm92ZWQgZm9yLCBbY29udGFjdCBzYWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vY29udGFjdC8pLCB5b3VyIGFjY291bnQgbWFuYWdlciwgb3Igc3VwcG9ydC4gIElmIHVzaW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgYGNvdW50cnlfY29kZXNgIHNob3VsZCBiZSBzZXQgdG8gdGhlIGNvdW50cnkgd2hlcmUgeW91ciBjb21wYW55IGlzIGJhc2VkLCBub3QgdGhlIGNvdW50cnkgd2hlcmUgeW91ciB1c2VyIGlzIGxvY2F0ZWQuIEZvciBhbGwgb3RoZXIgcHJvZHVjdHMsIGBjb3VudHJ5X2NvZGVzYCByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB5b3VyIHVzZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIElmIExpbmsgaXMgbGF1bmNoZWQgd2l0aCBtdWx0aXBsZSBjb3VudHJ5IGNvZGVzLCBvbmx5IHByb2R1Y3RzIHRoYXQgeW91IGFyZSBlbmFibGVkIGZvciBpbiBhbGwgY291bnRyaWVzIHdpbGwgYmUgdXNlZCBieSBMaW5rLiBXaGlsZSBhbGwgY291bnRyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gU2FuZGJveCwgaW4gUHJvZHVjdGlvbiBvbmx5IHRoZSBjb3VudHJpZXMgeW91IGhhdmUgcmVxdWVzdGVkIGFjY2VzcyBmb3IgYXJlIHNob3duLiBUbyByZXF1ZXN0IGFjY2VzcyB0byBhZGRpdGlvbmFsIGNvdW50cmllcywgW2ZpbGUgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiAgSWYgdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIG1ha2Ugc3VyZSB0aGUgY291bnRyeSBjb2RlcyBpbiB0aGUgY3VzdG9taXphdGlvbiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgaW4gYGNvdW50cnlfY29kZXNgLCBvciB0aGUgY3VzdG9taXphdGlvbiBtYXkgbm90IGJlIGFwcGxpZWQuICBJZiB1c2luZyB0aGUgQXV0aCBmZWF0dXJlcyBJbnN0YW50IE1hdGNoLCBJbnN0YW50IE1pY3JvLWRlcG9zaXRzLCBTYW1lLURheSBNaWNyby1kZXBvc2l0cywgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBvciBEYXRhYmFzZSBBdXRoLCBgY291bnRyeV9jb2Rlc2AgbXVzdCBiZSBzZXQgdG8gYFtcXCdVU1xcJ11gLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIEEgYHVzZXJfaWRgIGdlbmVyYXRlZCB1c2luZyBgL3VzZXIvY3JlYXRlYC4gUmVxdWlyZWQgZm9yIGludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIFBsYWlkIFByb3RlY3QsIE11bHRpLUl0ZW0gTGluaywgb3IgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIE9uZSBvZiBlaXRoZXIgdGhlIGB1c2VyX2lkYCBvciB0aGUgYHVzZXJgIGZpZWxkIGlzIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB0aGF0IHRoZSBsaW5rZWQgSXRlbSBtdXN0IHN1cHBvcnQuIElmIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCBzaG91bGQgYmUgb21pdHRlZCAodW5sZXNzIHlvdSBhcmUgdXNpbmcgdXBkYXRlIG1vZGUgdG8gYWRkIGEgY3JlZGl0IHByb2R1Y3QsIHN1Y2ggYXMgQXNzZXRzLCBTdGF0ZW1lbnRzLCBJbmNvbWUsIG9yIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgdG8gYW4gZXhpc3RpbmcgSXRlbSk7IGF0IGxlYXN0IG9uZSBgcHJvZHVjdGAgaXMgcmVxdWlyZWQgb3RoZXJ3aXNlLiAgVG8gbWF4aW1pemUgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYW5kIGFjY291bnRzIGF2YWlsYWJsZSwgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIG1pbmltYWwgcHJvZHVjdCBzZXQgcmVxdWlyZWQgZm9yIHlvdXIgdXNlIGNhc2UsIGFzIHRoZSBwcm9kdWN0cyBzcGVjaWZpZWQgd2lsbCBsaW1pdCB3aGljaCBpbnN0aXR1dGlvbnMgYW5kIGFjY291bnQgdHlwZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8geW91ciB1c2VycyBpbiBMaW5rLiBPbmx5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgKmFsbCogcmVxdWVzdGVkIHByb2R1Y3RzIGNhbiBiZSBzZWxlY3RlZDsgaWYgYSB1c2VyIGF0dGVtcHRzIHRvIHNlbGVjdCBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgYSBsaXN0ZWQgcHJvZHVjdCwgYSBcXFwiQ29ubmVjdGl2aXR5IG5vdCBzdXBwb3J0ZWRcXFwiIGVycm9yIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gTGluay4gRm9yIGVhY2ggc3BlY2lmaWVkIHByb2R1Y3QsIHRoZSBJdGVtIGNvbm5lY3RlZCBieSB0aGUgdXNlciBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNvbXBhdGlibGUgYWNjb3VudC4gRm9yIGRldGFpbHMgb24gY29tcGF0aWJsZSBwcm9kdWN0IC8gYWNjb3VudCB0eXBlIGNvbWJpbmF0aW9ucywgc2VlIFt0aGUgYWNjb3VudCB0eXBlL3Byb2R1Y3Qgc3VwcG9ydCBtYXRyaXhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtLXByb2R1Y3Qtc3VwcG9ydC1tYXRyaXgpLiAgVG8gYWRkIHByb2R1Y3RzIHdpdGhvdXQgbGltaXRpbmcgdGhlIGluc3RpdHV0aW9uIGxpc3Qgb3IgYWNjb3VudCB0eXBlcywgdXNlIHRoZSBbYG9wdGlvbmFsX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1vcHRpb25hbC1wcm9kdWN0cykgb3IgIFtgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1yZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpIGZpZWxkcy4gUHJvZHVjdHMgY2FuIGFsc28gYmUgYWRkZWQgdG8gYW4gSXRlbSBieSBjYWxsaW5nIHRoZSBwcm9kdWN0IGVuZHBvaW50IGFmdGVyIG9idGFpbmluZyBhbiBhY2Nlc3MgdG9rZW47IHRoaXMgbWF5IHJlcXVpcmUgdGhlIHByb2R1Y3QgdG8gYmUgbGlzdGVkIGluIHRoZSBbYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1hZGRpdGlvbmFsLWNvbnNlbnRlZC1wcm9kdWN0cykgYXJyYXkuIEZvciBkZXRhaWxzLCBzZWUgW0Nob29zaW5nIHdoZW4gdG8gaW5pdGlhbGl6ZSBwcm9kdWN0c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8pLiAgYGJhbGFuY2VgIGlzICpub3QqIGEgdmFsaWQgdmFsdWUsIHRoZSBCYWxhbmNlIHByb2R1Y3QgZG9lcyBub3QgcmVxdWlyZSBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluaXRpYWxpemVkIHdoZW4gYW55IG90aGVyIHByb2R1Y3QgaXMgaW5pdGlhbGl6ZWQuICBJZiBsYXVuY2hpbmcgTGluayB3aXRoIENSQSBwcm9kdWN0cywgYGNyYV9iYXNlX3JlcG9ydGAgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuICBOb3RlIHRoYXQsIHVubGVzcyB5b3UgaGF2ZSBvcHRlZCB0byBkaXNhYmxlIEluc3RhbnQgTWF0Y2ggc3VwcG9ydCwgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IE1hdGNoIHdpbGwgYWxzbyBiZSBzaG93biBpbiBMaW5rIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBldmVuIHRob3VnaCB0aGVzZSBpbnN0aXR1dGlvbnMgZG8gbm90IGNvbnRhaW4gYGF1dGhgIGluIHRoZWlyIHByb2R1Y3QgYXJyYXkuICBJbiBQcm9kdWN0aW9uLCB5b3Ugd2lsbCBiZSBiaWxsZWQgZm9yIGVhY2ggcHJvZHVjdCB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE5vdGUgdGhhdCBhIHByb2R1Y3QgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSBhbiBJdGVtIG9uY2UgdGhlIEl0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGF0IHByb2R1Y3QuIFRvIHN0b3AgYmlsbGluZyBvbiBhbiBJdGVtIGZvciBzdWJzY3JpcHRpb24tYmFzZWQgcHJvZHVjdHMsIHN1Y2ggYXMgTGlhYmlsaXRpZXMsIEludmVzdG1lbnRzLCBhbmQgVHJhbnNhY3Rpb25zLCByZW1vdmUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZSBvbmx5IGlmIHRoZSBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudChzKSBzZWxlY3RlZCBieSB0aGUgdXNlciBzdXBwb3J0IHRoZSBwcm9kdWN0LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIHN0aWxsIGJlIHNob3duIGluIExpbmsuIFRoZSBwcm9kdWN0cyB3aWxsIG9ubHkgYmUgZXh0cmFjdGVkIGFuZCBiaWxsZWQgaWYgdGhlIHVzZXIgc2VsZWN0cyBhbiBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudCB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlbS4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXlzLiBUaGUgYHByb2R1Y3RzYCBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHByb2R1Y3QuICBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIHRoaXMgZmVhdHVyZSwgc2VlIFtSZXF1aXJlZCBpZiBTdXBwb3J0ZWQgUHJvZHVjdHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI3JlcXVpcmVkLWlmLXN1cHBvcnRlZC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHRoYXQgd2lsbCBlbmhhbmNlIHRoZSBjb25zdW1lclxcJ3MgdXNlIGNhc2UsIGJ1dCB0aGF0IHlvdXIgYXBwIGNhbiBmdW5jdGlvbiB3aXRob3V0LiBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gZmV0Y2ggZGF0YSBmb3IgdGhlc2UgcHJvZHVjdHMgb24gYSBiZXN0LWVmZm9ydCBiYXNpcywgYW5kIGZhaWx1cmUgdG8gc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIG5vdCBhZmZlY3QgSXRlbSBjcmVhdGlvbi4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5cy4gVGhlIGBwcm9kdWN0c2AgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiAgRm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyB0aGlzIGZlYXR1cmUsIHNlZSBbT3B0aW9uYWwgUHJvZHVjdHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI29wdGlvbmFsLXByb2R1Y3RzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9uYWxfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgYWRkaXRpb25hbCBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIGNvbGxlY3QgY29uc2VudCBmb3IgdG8gc3VwcG9ydCB5b3VyIHVzZSBjYXNlLiBUaGVzZSBwcm9kdWN0cyB3aWxsIG5vdCBiZSBiaWxsZWQgdW50aWwgeW91IHN0YXJ0IHVzaW5nIHRoZW0gYnkgY2FsbGluZyB0aGUgcmVsZXZhbnQgZW5kcG9pbnRzLiAgYGJhbGFuY2VgIGlzICpub3QqIGEgdmFsaWQgdmFsdWUsIHRoZSBCYWxhbmNlIHByb2R1Y3QgZG9lcyBub3QgcmVxdWlyZSBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGhhdmUgY29uc2VudCBjb2xsZWN0ZWQuICBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIHN0aWxsIGJlIHNob3duIGluIExpbmsuICBUaGVyZSBzaG91bGQgYmUgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIHRoZSBgcHJvZHVjdHNgIG9yIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgIGFycmF5cy4gIElmIHlvdSBpbmNsdWRlIGBzaWduYWxgIGluIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBbYC9zaWduYWwvcHJlcGFyZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3NpZ25hbC8jc2lnbmFscHJlcGFyZSkgYmVmb3JlIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhbiBJdGVtIGluIG9yZGVyIHRvIGdldCB0aGUgbW9zdCBhY2N1cmF0ZSByZXN1bHRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW2Avc2lnbmFsL3ByZXBhcmVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9zaWduYWwvI3NpZ25hbHByZXBhcmUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIFVSTCB0byB3aGljaCBhbnkgd2ViaG9va3Mgc2hvdWxkIGJlIHNlbnQuIE5vdGUgdGhhdCB3ZWJob29rcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIChlLXdhbGxldCB0cmFuc2FjdGlvbnMgb25seSksIFRyYW5zZmVyLCBCYW5rIFRyYW5zZmVyIChpbmNsdWRpbmcgQXV0aCBtaWNyby1kZXBvc2l0IG5vdGlmaWNhdGlvbiB3ZWJob29rcyksIE1vbml0b3IsIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBEYXNoYm9hcmQgaW5zdGVhZC4gSW4gdXBkYXRlIG1vZGUsIHRoaXMgZmllbGQgd2lsbCBub3QgaGF2ZSBhbiBlZmZlY3Q7IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgYW4gZXhpc3RpbmcgSXRlbSwgdXNlIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIHRvIHVwZGF0ZSBvciByZWZlcmVuY2UsIHVzZWQgd2hlbiB1cGRhdGluZywgbW9kaWZ5aW5nLCBvciBhY2Nlc3NpbmcgYW4gZXhpc3RpbmcgYGFjY2Vzc190b2tlbmAuIFVzZWQgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB1cGRhdGUgbW9kZSwgd2hlbiBjb21wbGV0aW5nIHRoZSBTYW1lLURheSBNaWNyby1kZXBvc2l0IChtYW51YWwpIGZsb3csIG9yIChvcHRpb25hbGx5KSB3aGVuIGluaXRpYWxpemluZyBMaW5rIGZvciBhIHJldHVybmluZyB1c2VyIGFzIHBhcnQgb2YgdGhlIFRyYW5zZmVyIFVJIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY2VzcyB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpdGVtcyB0byB1cGRhdGUgaW4gTGluayB1cGRhdGUgbW9kZSBmb3IgdGhlIEFzc2V0cyBwcm9kdWN0LiBVc2luZyB0aGlzIGluc3RlYWQgb2YgdGhlIGBhY2Nlc3NfdG9rZW5gIGZpZWxkIGFsbG93cyB0aGUgdXBkYXRpbmcgb2YgbXVsdGlwbGUgaXRlbXMgYXQgb25jZS4gVGhpcyBmZWF0dXJlIGlzIGluIGNsb3NlZCBiZXRhLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIExpbmsgY3VzdG9taXphdGlvbiBmcm9tIHRoZSBQbGFpZCBEYXNoYm9hcmQgdG8gYmUgYXBwbGllZCB0byBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYGRlZmF1bHRgIGN1c3RvbWl6YXRpb24gd2lsbCBiZSB1c2VkLiBXaGVuIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCB0aGUgbGFuZ3VhZ2UgaW4gdGhlIGN1c3RvbWl6YXRpb24gbXVzdCBtYXRjaCB0aGUgbGFuZ3VhZ2Ugc2VsZWN0ZWQgdmlhIHRoZSBgbGFuZ3VhZ2VgIHBhcmFtZXRlciwgYW5kIHRoZSBjb3VudHJpZXMgaW4gdGhlIGN1c3RvbWl6YXRpb24gc2hvdWxkIG1hdGNoIHRoZSBjb3VudHJ5IGNvZGVzIHNlbGVjdGVkIHZpYSBgY291bnRyeV9jb2Rlc2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfY3VzdG9taXphdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXBwZWFyYW5jZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBlYXJhbmNlX21vZGU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXBwZWFyYW5jZU1vZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgVVJJIGluZGljYXRpbmcgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIGEgdXNlciBzaG91bGQgYmUgZm9yd2FyZGVkIGFmdGVyIGNvbXBsZXRpbmcgdGhlIExpbmsgZmxvdzsgdXNlZCB0byBzdXBwb3J0IE9BdXRoIGF1dGhlbnRpY2F0aW9uIGZsb3dzIHdoZW4gbGF1bmNoaW5nIExpbmsgaW4gdGhlIGJyb3dzZXIgb3IgYW5vdGhlciBhcHAuIFRoZSBgcmVkaXJlY3RfdXJpYCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFdoZW4gdXNlZCBpbiBQcm9kdWN0aW9uLCBtdXN0IGJlIGFuIGh0dHBzIFVSSS4gTm90ZSB0aGF0IGFueSByZWRpcmVjdCBVUkkgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIHJlZGlyZWN0IFVSSXMgbGlzdCBpbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIElmIGluaXRpYWxpemluZyBvbiBBbmRyb2lkLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgc3BlY2lmaWVkIGluc3RlYWQgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBcXCdzIEFuZHJvaWQgcGFja2FnZS4gUmVxdWlyZWQgaWYgdXNpbmcgdGhlIGBsaW5rX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgb24gQW5kcm9pZC4gQW55IHBhY2thZ2UgbmFtZSBzcGVjaWZpZWQgaGVyZSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgQW5kcm9pZCBwYWNrYWdlIG5hbWVzIHNldHRpbmcgb24gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBXaGVuIGNyZWF0aW5nIGEgYGxpbmtfdG9rZW5gIGZvciBpbml0aWFsaXppbmcgTGluayBvbiBvdGhlciBwbGF0Zm9ybXMsIGBhbmRyb2lkX3BhY2thZ2VfbmFtZWAgbXVzdCBiZSBsZWZ0IGJsYW5rIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbmRyb2lkX3BhY2thZ2VfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhcmRfc3dpdGNoPzogTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQWNjb3VudEZpbHRlcnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZpbHRlcnM/OiBMaW5rVG9rZW5BY2NvdW50RmlsdGVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuRVVDb25maWd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGV1X2NvbmZpZz86IExpbmtUb2tlbkVVQ29uZmlnO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGNlcnRhaW4gbGVnYWN5IHVzZSBjYXNlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9jb25maWd1cmF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95bWVudD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBiYXNlX3JlcG9ydD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyYV9vcHRpb25zPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U/OiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGh9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRoPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXBkYXRlPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cztcbiAgICAvKipcbiAgICAgKiBBIHRoaXJkIHBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBMaW5rVG9rZW5JbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuSW52ZXN0bWVudHNBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfYXV0aD86IExpbmtUb2tlbkludmVzdG1lbnRzQXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGhvc3RlZF9saW5rPzogTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGluaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogTGlua1Rva2VuVHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhc2hmbG93X3JlcG9ydD86IExpbmtUb2tlbkNhc2hmbG93UmVwb3J0O1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgcmVxdWVzdCBhIENSQSBjb25uZWN0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JhX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5PzogTGlua1Rva2VuQ3JlYXRlSWRlbnRpdHk7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBpbmRpY2F0ZXMgdGhhdCBjbGllbnQgc3VwcG9ydHMgbGlua2luZyBGaW5hbmNlS2l0IC8gQXBwbGVDYXJkIGl0ZW1zLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmluYW5jZWtpdF9zdXBwb3J0ZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgZW5hYmxlIGxpbmtpbmcgbXVsdGlwbGUgaXRlbXMgaW4gdGhlIHNhbWUgTGluayBzZXNzaW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5hYmxlX211bHRpX2l0ZW1fbGluaz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1c2VyIHRva2VuIGdlbmVyYXRlZCB1c2luZyBgL3VzZXIvY3JlYXRlYC4gQW55IEl0ZW0gY3JlYXRlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgUGxhaWQgUHJvdGVjdCwgTXVsdGktSXRlbSBMaW5rLCBvciBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQgYmVmb3JlIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIGluc3RlYWQgb2YgdGhlIGB1c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQnkgZGVmYXVsdCwgTGluayB3aWxsIG9ubHkgZGlzcGxheSBhY2NvdW50IHR5cGVzIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBhbGwgcHJvZHVjdHMgc3VwcGxpZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLiBZb3UgY2FuIGZ1cnRoZXIgbGltaXQgdGhlIGFjY291bnRzIHNob3duIGluIExpbmsgYnkgdXNpbmcgYGFjY291bnRfZmlsdGVyc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBzaG93biBpbiBMaW5rLiBPbmx5IHRoZSBzcGVjaWZpZWQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gVGhpcyBmaWx0ZXJpbmcgYXBwbGllcyB0byBib3RoIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3IChpZiBlbmFibGVkKSBhbmQgdGhlIEluc3RpdHV0aW9uIFNlbGVjdCB2aWV3LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgc2VsZWN0ZWQgc3VidHlwZXMgd2lsbCBiZSBvbWl0dGVkIGZyb20gTGluay4gVG8gaW5kaWNhdGUgdGhhdCBhbGwgc3VidHlwZXMgc2hvdWxkIGJlIHNob3duLCB1c2UgdGhlIHZhbHVlIGBcXFwiYWxsXFxcImAuIElmIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBmaWx0ZXIgaXMgdXNlZCwgYW55IGFjY291bnQgdHlwZSBmb3Igd2hpY2ggYSBmaWx0ZXIgaXMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGVudGlyZWx5IG9taXR0ZWQgZnJvbSBMaW5rLiAgRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiAgRm9yIGluc3RpdHV0aW9ucyB1c2luZyBPQXV0aCwgdGhlIGZpbHRlciB3aWxsIG5vdCBhZmZlY3QgdGhlIGxpc3Qgb2YgaW5zdGl0dXRpb25zIG9yIGFjY291bnRzIHNob3duIGJ5IHRoZSBiYW5rIGluIHRoZSBPQXV0aCB3aW5kb3cuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgY3JlZGl0PzogTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgbG9hbj86IExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIGRlc2lyZWQgYXBwZWFyYW5jZSBtb2RlIGZvciBMaW5rLCB1c2VkIHRvIGZvcmNlIGxpZ2h0IG9yIGRhcmsgbW9kZXMgb3Igc2V0IExpbmsgdG8gY2hhbmdlIGRlcGVuZGluZyBvbiB1c2VyIHN5c3RlbSBzZXR0aW5ncy4gQ3VycmVudGx5IGluIGNsb3NlZCBiZXRhLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFwcGVhcmFuY2VNb2RlIHtcbiAgICBMaWdodCA9ICdMSUdIVCcsXG4gICAgRGFyayA9ICdEQVJLJyxcbiAgICBTeXN0ZW0gPSAnU1lTVEVNJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQXV0aCBwcm9kdWN0LiBUaGlzIGZpZWxkIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIGV4dGVuZGVkIEF1dGggZmxvd3MgZm9yIHRoZSByZXN1bHRpbmcgTGluayBzZXNzaW9uLiBPbWl0dGluZyBhbnkgZmllbGQgd2lsbCByZXN1bHQgaW4gYSBkZWZhdWx0IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgeW91ciBhY2NvdW50IG1hbmFnZXIuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciB0aGF0IHdpbGwgYXBwbHkgaWYgeW91IGhhdmUgbm90IHJlcXVlc3RlZCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBhcHBseSBhIGRpZmZlcmVudCBkZWZhdWx0LiBJZiB5b3UgaGF2ZSBlbmFibGVkIHRoZSBbRGFzaGJvYXJkIEFjY291bnQgVmVyaWZpY2F0aW9uIHBhbmVdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9hY2NvdW50LXZlcmlmaWNhdGlvbiksIHRoZSBzZXR0aW5ncyBlbmFibGVkIHRoZXJlIHdpbGwgb3ZlcnJpZGUgYW55IHNldHRpbmdzIGluIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBBdXRoIFR5cGUgU2VsZWN0IGlzIGVuYWJsZWQgZm9yIHRoZSBMaW5rIHNlc3Npb24sIGFsbG93aW5nIHRoZSBlbmQgdXNlciB0byBjaG9vc2UgYmV0d2VlbiBsaW5raW5nIHZpYSBhIGNyZWRlbnRpYWxzLWJhc2VkIGZsb3cgKGkuZS4gSW5zdGFudCBBdXRoLCBJbnN0YW50IE1hdGNoLCBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMpIG9yIGEgbWFudWFsIGZsb3cgdGhhdCBkb2VzIG5vdCByZXF1aXJlIGxvZ2luIChhbGwgb3RoZXIgQXV0aCBmbG93cykgcHJpb3IgdG8gc2VsZWN0aW5nIHRoZWlyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gRGVmYXVsdCBiZWhhdmlvciBpcyBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGF1dGhfdHlwZV9zZWxlY3RfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGZsb3cuIERlZmF1bHQgYmVoYXZpb3IgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBhdXRvbWF0ZWRfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBJbnN0YW50IE1hdGNoIGZsb3cuIEluc3RhbnQgTWF0Y2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0LiBJbnN0YW50IE1hdGNoIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoaXMgZmllbGQgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBpbnN0YW50X21hdGNoX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3cuICBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgc2FtZV9kYXlfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBJbnN0YW50IE1pY3JvLWRlcG9zaXRzIGZsb3cuICBEZWZhdWx0IGJlaGF2aW9yIGZvciBQbGFpZCB0ZWFtcyBjcmVhdGVkIGFmdGVyIE5vdmVtYmVyIDIwMjMgaXMgYGZhbHNlYDsgZGVmYXVsdCBiZWhhdmlvciBmb3IgUGxhaWQgdGVhbXMgY3JlYXRlZCBiZWZvcmUgdGhhdCBkYXRlIGlzIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBpbnN0YW50X21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoYXQgdHlwZSBvZiBbUmVyb3V0ZSB0byBDcmVkZW50aWFsc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL2Zsb3ctb3B0aW9ucy8jcmVtb3ZpbmctbWFudWFsLXZlcmlmaWNhdGlvbi1lbnRyeS1wb2ludHMtd2l0aC1yZXJvdXRlLXRvLWNyZWRlbnRpYWxzKSBwYW5lIHNob3VsZCBiZSB1c2VkIGluIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSBTYW1lLURheSBNaWNyby1kZXBvc2l0cyBmbG93LiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBPUFRJT05BTGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICByZXJvdXRlX3RvX2NyZWRlbnRpYWxzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhSZXJvdXRlVG9DcmVkZW50aWFsc0VudW07XG4gICAgLyoqXG4gICAgICogRGF0YWJhc2UgTWF0Y2ggaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgd2l0aCBEYXRhYmFzZSBBdXRoLiBVc2UgdGhlIFtBY2NvdW50IFZlcmlmaWNhdGlvbiBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9hY2NvdW50LXZlcmlmaWNhdGlvbikgdG8gZW5hYmxlIERhdGFiYXNlIEF1dGguXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkYXRhYmFzZV9tYXRjaF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBEYXRhYmFzZSBJbnNpZ2h0cyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCB3aXRoIERhdGFiYXNlIEF1dGguIFVzZSB0aGUgW0FjY291bnQgVmVyaWZpY2F0aW9uIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2FjY291bnQtdmVyaWZpY2F0aW9uKSB0byBlbmFibGUgRGF0YWJhc2UgQXV0aC4gSW4gQ2FuYWRhLCBEYXRhYmFzZSBBdXRoIGlzIGluIGVhcmx5IGF2YWlsYWJpbGl0eSBhbmQgY2Fubm90IHlldCBiZSBtYW5hZ2VkIHZpYSB0aGUgRGFzaGJvYXJkOyBpdCBtdXN0IGJlIGVuYWJsZWQgYnkgcGFzc2luZyBgZGF0YWJhc2VfaW5zaWdodHNfZW5hYmxlZDogdHJ1ZWAgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkYXRhYmFzZV9pbnNpZ2h0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGF1dGhfdHlwZV9zZWxlY3RfZW5hYmxlZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZsb3dfdHlwZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgU01TIG1pY3JvLWRlcG9zaXRzIHZlcmlmaWNhdGlvbi4gRGVmYXVsdCBiZWhhdmlvciBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgc21zX21pY3JvZGVwb3NpdHNfdmVyaWZpY2F0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoUmVyb3V0ZVRvQ3JlZGVudGlhbHNFbnVtIHtcbiAgICBPZmYgPSAnT0ZGJyxcbiAgICBPcHRpb25hbCA9ICdPUFRJT05BTCcsXG4gICAgRm9yY2VkID0gJ0ZPUkNFRCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhGbG93VHlwZUVudW0ge1xuICAgIEZsZXhpYmxlQXV0aCA9ICdGTEVYSUJMRV9BVVRIJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEJhc2UgUmVwb3J0IHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGFzc2V0c2AgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIHRoZSBjbGllbnQgaXMgQ1JBLWVuYWJsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggUGxhaWQgQ2hlY2sgcHJvZHVjdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiBQbGFpZCBDaGVjayBwcm9kdWN0cy4gTWF4aW11bSBpcyA3MzE7IG1pbmltdW0gaXMgMTgwLiBJZiBhIHZhbHVlIGxvd2VyIHRoYW4gMTgwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMTgwIGRheXMgb2YgaGlzdG9yeSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRheXMgb2YgZGF0YSByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1aXJlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgcGFydG5lcl9pbnNpZ2h0cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgYmFzZV9yZXBvcnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBjYXNoZmxvd19pbnNpZ2h0cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNMZW5kU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgbGVuZF9zY29yZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zTGVuZFNjb3JlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc05ldHdvcmtJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBuZXR3b3JrX2luc2lnaHRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNOZXR3b3JrSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgaW52ZXN0bWVudCBkYXRhIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgbGlua2VkIGFjY291bnQocykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9pbnZlc3RtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0luY29tZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGluY29tZV9pbnNpZ2h0cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHM7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEJhc2UgUmVwb3J0IHByb2R1Y3QsIHNwZWNpZmljYWxseSB0aGUgYGNsaWVudF9yZXBvcnRfaWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0R1NFT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZ3NlX29wdGlvbnM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRHU0VPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVwb3J0IG11c3QgaW5jbHVkZSBpZGVudGl0eSBpbmZvcm1hdGlvbi4gSWYgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgdGhlIHJlcG9ydCB3aWxsIGZhaWwuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIHJlcXVpcmVfaWRlbnRpdHk/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRIb21lTGVuZGluZ1JlcG9ydE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGhvbWVfbGVuZGluZ19yZXBvcnRfb3B0aW9ucz86IENyYUNoZWNrUmVwb3J0SG9tZUxlbmRpbmdSZXBvcnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHRvIGNyZWF0ZSByZXBvcnRzIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIEdTRXMgZm9yIG1vcnRnYWdlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0R1NFT3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydEdTRU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCB0eXBlcyBvZiByZXBvcnRzIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSB0byBHU0VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxHU0VSZXBvcnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0R1NFT3B0aW9uc1xuICAgICAqL1xuICAgIHJlcG9ydF90eXBlczogQXJyYXk8R1NFUmVwb3J0VHlwZT47XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENhc2hmbG93IEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93QXR0cmlidXRlc1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBDUkEgSW5jb21lIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0luY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lSW5zaWdodHNGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfaW5zaWdodHNfZmlsdGVyPzogSW5jb21lSW5zaWdodHNGaWx0ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVJbnNpZ2h0c1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpbmNvbWVfaW5zaWdodHNfdmVyc2lvbjogSW5jb21lSW5zaWdodHNWZXJzaW9uIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQ1JBIExlbmRTY29yZSBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0xlbmRTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zTGVuZFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRMZW5kU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0xlbmRTY29yZVxuICAgICAqL1xuICAgIGxlbmRfc2NvcmVfdmVyc2lvbj86IFBsYWlkTGVuZFNjb3JlVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENSQSBOZXR3b3JrIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zTmV0d29ya0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNOZXR3b3JrSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrSW5zaWdodHNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc05ldHdvcmtJbnNpZ2h0c1xuICAgICAqL1xuICAgIG5ldHdvcmtfaW5zaWdodHNfdmVyc2lvbj86IE5ldHdvcmtJbnNpZ2h0c1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cyBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21WZXJzaW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmlzbV92ZXJzaW9ucz86IFByaXNtVmVyc2lvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNGaWNvSW5wdXR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgZmljbz86IENyYVBhcnRuZXJJbnNpZ2h0c0ZpY29JbnB1dCB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENyZWRpdCBQYXJ0bmVyIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gY29tcHV0ZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cy4gRGVmYXVsdHMgdG8gMTgwIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIChEZXByZWNhdGVkKSBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBEZXBvc2l0IFN3aXRjaCAoYmV0YSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZGVwb3NpdF9zd2l0Y2hgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGRlcG9zaXRfc3dpdGNoX2lkYCBwcm92aWRlZCBieSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgRW1wbG95bWVudCBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBlbXBsb3ltZW50YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBlbXBsb3ltZW50IGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X3NvdXJjZV90eXBlcz86IEFycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZTtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBCYW5rIEVtcGxveW1lbnQuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGVtcGxveW1lbnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCBgYmFua2AgaXMgc3BlY2lmaWVkIGluIGBlbXBsb3ltZW50X3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb24gZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgY29uc2VudD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgYWdyZWVkIHRvIGEgcHJpdmFjeSBwb2xpY3kgc3BlY2lmeWluZyB0aGF0IHRoZWlyIGRhdGEgd2lsbCBiZSBzaGFyZWQgd2l0aCBQbGFpZCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzLiAgSWYgYGdhdmVfY29uc2VudGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIGBhY2NlcHRfdG9zYCBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBza2lwcGVkYCBhbmQgdGhlIGVuZCB1c2VyXFwncyBzZXNzaW9uIHdpbGwgc3RhcnQgYXQgdGhlIG5leHQgc3RlcCByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZ2F2ZV9jb25zZW50PzogYm9vbGVhbjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSW5jb21lIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGluY29tZV92ZXJpZmljYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCBvZiB0aGUgdmVyaWZpY2F0aW9uIGluc3RhbmNlLCBhcyBwcm92aWRlZCBieSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYC4gUmVwbGFjZWQgYnkgdGhlIHVzZXIgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgb2YgYW4gYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgYXMgcHJvdmlkZWQgYnkgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gUHJvdmlkaW5nIGFuIGBhc3NldF9yZXBvcnRfaWRgIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHVzZXIgdGhyb3VnaCBhIHN0cmVhbWxpbmVkIGZsb3cuIElmIHByb3ZpZGVkLCB0aGUgYmFuayBsaW5raW5nIGZsb3cgd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIHRoYXQgYSB1c2VyIGhhcyBwcmV2aW91c2x5IGNvbm5lY3RlZCB3aXRoLiBEYXRhIGZyb20gdGhlc2UgaW5zdGl0dXRpb25zIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIGRvY3VtZW50IGRhdGEgcmVjZWl2ZWQgZHVyaW5nIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBoZWxwIHZlcmlmeSB0aGF0IHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgYXJlIGFjY3VyYXRlLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGVzZSBJdGVtcyBkdXJpbmcgTGluaywgaXQgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciB0aGlzIExpbmsgc2Vzc2lvbi4gIFRoaXMgZmllbGQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgcGF5cm9sbGAgaW5jb21lIHNvdXJjZSB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZTtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdGVkX2luY29tZV9zb3VyY2VzPzogQXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIEJhbmsgSW5jb21lLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIG11bHRpcGxlIEl0ZW1zIHRvIGJlIGFkZGVkIGluIHRoZSBMaW5rIHNlc3Npb24uIFRoaXMgc2V0dGluZyBpcyBkZXByZWNhdGVkIGFuZCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbW9yZSBnZW5lcmFsIGBlbmFibGVfbXVsdGlfaXRlbV9saW5rYCBzZXR0aW5nLCB3aGljaCBzdXBwb3J0cyBhbGwgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbmFibGVfbXVsdGlwbGVfaXRlbXM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBQYXlyb2xsIEluY29tZSAoaW5jbHVkaW5nIERvY3VtZW50IEluY29tZSkuIEZ1cnRoZXIgY3VzdG9taXphdGlvbiBvcHRpb25zIGZvciBEb2N1bWVudCBJbmNvbWUsIHN1Y2ggYXMgY3VzdG9taXppbmcgd2hpY2ggZG9jdW1lbnQgdHlwZXMgbWF5IGJlIHVwbG9hZGVkLCBhcmUgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBbTGluayBDdXN0b21pemF0aW9uIHBhbmVdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rKSBpbiB0aGUgRGFzaGJvYXJkLiAoUmVxdWlyZXMgUHJvZHVjdGlvbiBlbmFibGVtZW50LilcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiB0byBlbmFibGUgZm9yIHRoZSBMaW5rIHNlc3Npb24uIElmIG5vbmUgYXJlIHNwZWNpZmllZCwgdGhlbiB1c2VycyB3aWxsIHNlZSBib3RoIGRvY3VtZW50IGFuZCBkaWdpdGFsIHBheXJvbGwgaW5jb21lLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGZsb3dfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gTGluayB0b2tlbiB3aWxsIGJlIHVzZWQgZm9yIHVwZGF0ZSBtb2RlLiBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGlzX3VwZGF0ZV9tb2RlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBVbmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIEl0ZW0gdG8gdXBkYXRlIHdpdGguICBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gICAgICovXG4gICAgaXRlbV9pZF90b191cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBhbmFseXNpcyB0byBlbmFibGUgZm9yIGRvY3VtZW50IHVwbG9hZHMuIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCB0aGVuIGRvY3Mgd2lsbCB1bmRlcmdvIE9DUiBwYXJzaW5nIG9ubHkuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIHBhcnNpbmdfY29uZmlnPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz4gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBQYXkgQnkgQmFuayBmbG93LiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIHRvIGNvbmZpZ3VyZSB0aGUgdXNlciBleHBlcmllbmNlLCBhbmQgY3VycmVudGx5IHJlcXVpcmVzIHRoZSBhbW91bnQgZmllbGQgdG8gYmUgc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2ZlciB0aGF0IHByb3ZpZGVzIHRoZSBwYXltZW50IGNvbnRleHQuIFRoZSBtYXggbGVuZ3RoIGlzIDI1Ni5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHBheW1lbnRfaW5pdGlhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuIEVpdGhlciBgcGF5bWVudF9pZGAgb3IgYGNvbnNlbnRfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb25zZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFN0YXRlbWVudHMgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgdGhlIHN0YXRlbWVudHMgcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjAtMTAtMzBcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMC0xMC0zMFxcXCIuIFlvdSBjYW4gcmVxdWVzdCB1cCB0byB0d28geWVhcnMgb2YgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFRyYW5zZmVyIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgcmV0dXJuZWQgYnkgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgaW50ZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaWRgIHJldHVybmVkIGJ5IHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludC4gVXNlZCB0byBpbmRpY2F0ZSBMaW5rIHNlc3Npb24gdG8gY29tcGxldGUgcmVxdWlyZWQgdXNlciBhY3Rpb24gaW4gb3JkZXIgdG8gbWFrZSBhIGRlY2lzaW9uIGZvciB0aGUgYXV0aG9yaXphdGlvbi4gSWYgc2V0LCBgYWNjZXNzX3Rva2VuYCBjYW4gYmUgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCByZXR1cm5lZCBieSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBlbmFibGVzIFt1cGRhdGUgbW9kZSB3aXRoIEFjY291bnQgU2VsZWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvI3VzaW5nLXVwZGF0ZS1tb2RlLXRvLXJlcXVlc3QtbmV3LWFjY291bnRzKSBmb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhIHRoYXQgZG8gbm90IHVzZSBPQXV0aCwgb3IgdGhhdCB1c2UgT0F1dGggYnV0IGRvIG5vdCBoYXZlIHRoZWlyIG93biBhY2NvdW50IHNlbGVjdGlvbiBmbG93LiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyB0aGF0IGhhdmUgYW4gT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdyAoaS5lLiBtb3N0IE9BdXRoLWVuYWJsZWQgaW5zdGl0dXRpb25zKSwgdXBkYXRlIG1vZGUgd2l0aCBBY2NvdW50IFNlbGVjdCB3aWxsIGFsd2F5cyBiZSBlbmFibGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgYWNjb3VudF9zZWxlY3Rpb25fZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogTm90ZTogdGhpcyBmaWVsZCBpcyBub3QgY3VycmVudGx5IHVzZWQuIFBsYWlkIG1heSBlbmFibGUgdGhpcyBmaWVsZCBpbiB0aGUgZnV0dXJlIGlmIDEwMzMtcmVsYXRlZCBleHBpcmF0aW9uIGJlZ2lucyB0byBiZSBlbmZvcmNlZC4gIEJ5IGRlZmF1bHQsIFBsYWlkIHdpbGwgZW5hYmxlIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdyBkdXJpbmcgdXBkYXRlIG1vZGUgZm9yIGFuIEl0ZW0gZW5hYmxlZCBmb3IgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvKSBpZiB0aGUgSXRlbSBleHBpcmVzIHdpdGhpbiBzaXggbW9udGhzLiBEdXJpbmcgYSByZWF1dGhvcml6YXRpb24gZmxvdywgYW4gZW5kIHVzZXIgd2lsbCByZXZpZXcgUGxhaWRcXCdzIGVuZCB1c2VyIHByaXZhY3kgcG9saWN5LCB1c2UgY2FzZSBhbmQgZGF0YSBzY29wZSBjb25zZW50cywgYW5kIGFjY291bnQgYWNjZXNzIGNvbnNlbnRzOyB0aGV5IG1heSBhbHNvIGJlIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb25cXCdzIE9BdXRoIGZsb3cuIEFmdGVyIHRoZSBlbmQgdXNlciBzdWNjZXNzZnVsbHkgY29tcGxldGVzIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdywgdGhlIEl0ZW1cXCdzIGV4cGlyYXRpb24gZGF0ZSB3aWxsIGJlIGV4dGVuZGVkIHRvIDEyIG1vbnRocyBmcm9tIHRoZSB0aW1lIHRoYXQgdGhlIHJlYXV0aG9yaXphdGlvbiB0b29rIHBsYWNlLiBUaGlzIGZpZWxkIGFsbG93cyB5b3UgdG8gb3B0aW9uYWxseSBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWF1dGhvcml6YXRpb24gc2NoZWR1bGluZyBsb2dpYyB0byBlaXRoZXIgZm9yY2libHkgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlYXV0aG9yaXphdGlvbiBmbG93IGZvciBhIGdpdmVuIHVwZGF0ZSBtb2RlIHNlc3Npb24uIFRoaXMgZmllbGQgZG9lcyBub3QgaW1wYWN0IHRoZSBmbG93IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgaW4gdGhlIEVVIG9yIFVLLiBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIHJlYXV0aG9yaXphdGlvbl9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGEgYHVzZXJfdG9rZW5gIG9yIGB1c2VyX2lkYCBtdXN0IGFsc28gYmUgcHJvdmlkZWQsIGFuZCBMaW5rIHdpbGwgb3BlbiBpbiB1cGRhdGUgbW9kZSBmb3IgdGhlIGdpdmVuIHVzZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAgICAgKi9cbiAgICB1c2VyPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0byBiZSB1cGRhdGVkIGluIHVwZGF0ZSBtb2RlLiBJZiBlbXB0eSBvciBgbnVsbGAsIHRoaXMgZmllbGQgd2lsbCBkZWZhdWx0IHRvIGluaXRpYWxpemluZyB1cGRhdGUgbW9kZSBmb3IgdGhlIG1vc3QgcmVjZW50IHVuaGVhbHRoeSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gQSBgdXNlcl90b2tlbmAgbXVzdCBhbHNvIGJlIHByb3ZpZGVkIHRvIHVzZSB0aGlzIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlciB3aG8gd2lsbCBiZSBsaW5raW5nIHRoZWlyIGFjY291bnQuICoqUmVxdWlyZWQqKiBpZiBgdXNlcl9pZGAgaXNuXFwndCBpbmNsdWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlciB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC4gSXQgaXMgY3VycmVudGx5IHVzZWQgYXMgYSBtZWFucyBvZiBzZWFyY2hpbmcgbG9ncyBmb3IgdGhlIGdpdmVuIHVzZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZSwgdXNlZCBmb3IgW21pY3JvLWRlcG9zaXQgYmFzZWQgdmVyaWZpY2F0aW9uIGZsb3dzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS4gRm9yIGEgc21hbGwgbnVtYmVyIG9mIGN1c3RvbWVycyBvbiBsZWdhY3kgZmxvd3MsIHByb3ZpZGluZyB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBtaWNyby1kZXBvc2l0LWJhc2VkIGZsb3dzLiBGb3IgYWxsIG90aGVyIGN1c3RvbWVycywgdGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gUHJvdmlkaW5nIHRoZSB1c2VyXFwncyBuYW1lIGluIHRoaXMgZmllbGQgd2hlbiB1c2luZyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiB3aWxsIHN0cmVhbWxpbmUgdGhlIGVuZCB1c2VyIGV4cGVyaWVuY2UsIGFzIHRoZSB1c2VyIHdpbGwgbm90IGJlIHByb21wdGVkIHRvIGVudGVyIHRoZWlyIG5hbWUgZHVyaW5nIHRoZSBMaW5rIGZsb3c7IFBsYWlkIHdpbGwgdXNlIHRoZSBwcm92aWRlZCBsZWdhbCBuYW1lIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXQuIElmIHN1cHBsaWVkLCB3aWxsIGJlIHVzZWQgd2hlbiBhcHBsaWNhYmxlIHRvIHByZWZpbGwgcGhvbmUgbnVtYmVyIGZpZWxkcyBpbiBMaW5rIGZvciB0aGUgW3JldHVybmluZyB1c2VyIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikgYW5kIHRoZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uKS4gUGhvbmUgbnVtYmVyIGlucHV0IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHZhbGlkIG51bWJlciByYW5nZXM7IG51bWJlciBzdHJpbmdzIHRoYXQgZG8gbm90IG1hdGNoIGEgcmVhbC13b3JsZCBwaG9uZSBudW1iZXJpbmcgc2NoZW1lIG1heSBjYXVzZSB0aGUgcmVxdWVzdCB0byBmYWlsLCBldmVuIGluIHRoZSBTYW5kYm94IHRlc3QgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHBob25lIG51bWJlciB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhIHBob25lIG51bWJlciB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb25cXCd0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuIENhbiBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggW0lkZW50aXR5IFZlcmlmaWNhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgZW1haWwgYWRkcmVzcyB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhbiBlbWFpbCBhZGRyZXNzIHRoYXQgeW91IGhhdmUgdmVyaWZpZWQuIElmIHlvdSBoYXZlIHBlcmZvcm1lZCB2ZXJpZmljYXRpb24gYnV0IGRvblxcJ3QgaGF2ZSB0aGUgdGltZSwgeW91IG1heSBzdXBwbHkgYSBzaWduYWwgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBVTklYIGVwb2NoLiAgIEV4YW1wbGU6IGAyMDIwLTAxLTAxVDAwOjAwOjAwWmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc192ZXJpZmllZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIGFuZCBub3QgY3VycmVudGx5IHVzZWQsIHVzZSB0aGUgYGlkX251bWJlcmAgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcInl5eXktbW0tZGRcXFwiLiBDYW4gYmUgdXNlZCB0byBwcmVmaWxsIExpbmsgZmllbGRzIHdoZW4gdXNlZCB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyB1c2VyIHN0YXRlZCBpbmNvbWUgc291cmNlcyBmb3IgdGhlIEluY29tZSBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBjb3JyZXNwb25kaW5nIHRvIGFuIGluY29tZSBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgcGVyIGN5Y2xlIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfcGVyX2N5Y2xlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgYW5udWFsbHkgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9hbm51YWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV90eXBlPzogVXNlclN0YXRlZEluY29tZVNvdXJjZVBheVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3k7XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBhbmQgdGltZSBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBCeSBkZWZhdWx0LCBhIGBsaW5rX3Rva2VuYCBjcmVhdGVkIHRvIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgdGhhdCB3aWxsIGJlIGV4Y2hhbmdlZCBmb3IgYSBuZXcgYGFjY2Vzc190b2tlbmAgZXhwaXJlcyBhZnRlciA0IGhvdXJzLCBhbmQgYSBgbGlua190b2tlbmAgY3JlYXRlZCBmb3IgYW4gZXhpc3RpbmcgSXRlbSAoc3VjaCBhcyB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gIGJ5IGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlKSBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIElmIHVzaW5nIFtIb3N0ZWQgTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLyksIHRoZSBgbGlua190b2tlbmAgd2lsbCBleHBpcmUgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgSG9zdGVkIExpbmsgVVJMLCBhbmQgeW91IGNhbiBjdXN0b21pemUgdGhlIGR1cmF0aW9uIHVzaW5nIHRoZSBgaG9zdGVkX2xpbmsudXJsX2xpZmV0aW1lX3NlY29uZHNgIG9wdGlvbiBpbiB0aGUgcmVxdWVzdC4gSWYgdXNpbmcgTGluayBEZWxpdmVyeSAoYmV0YSksIHRoZSBgbGlua190b2tlbmAgd2lsbCBleHBpcmUgYnkgZGVmYXVsdCBhZnRlciAyNCBob3VycyBpZiBzZW50IHZpYSBTTVMgYW5kIGFmdGVyIDcgZGF5cyBpZiBzZW50IHZpYSBlbWFpbC4gSWYgdXNpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCBMaW5rIHRva2VuIGV4cGlyYXRpb24gd2lsbCBub3QgYmUgZW5mb3JjZWQ7IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBMaW5rIHNlc3Npb24gY2FuIGJlIGNyZWF0ZWQgd2l0aCBhbiBleHBpcmVkIExpbmsgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIG9mIGEgUGxhaWQtaG9zdGVkIExpbmsgZmxvdyB0aGF0IHdpbGwgdXNlIHRoZSBMaW5rIHRva2VuIHJldHVybmVkIGJ5IHRoaXMgcmVxdWVzdC4gT25seSBwcmVzZW50IGlmIHRoZSBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIEhvc3RlZCBMaW5rLiBUbyBlbmFibGUgdGhlIHNlc3Npb24gZm9yIEhvc3RlZCBMaW5rLCBzZW5kIGEgYGhvc3RlZF9saW5rYCBvYmplY3QgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBob3N0ZWRfbGlua191cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEVVIGZsb3dzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWcge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgb3BlbiBMaW5rIHdpdGhvdXQgYW4gaW5pdGlhbCBVSS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuRVVDb25maWdcbiAgICAgKi9cbiAgICBoZWFkbGVzcz86IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBhcmd1bWVudHMgb3JpZ2luYWxseSBwcm92aWRlZCB0byB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvZHVjdHNgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5pdGlhbF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgd2ViaG9va2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY291bnRyeV9jb2Rlc2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIGBsYW5ndWFnZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEZpbHRlcnNSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IEFjY291bnRGaWx0ZXJzUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWRpcmVjdF91cmlgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X25hbWVgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIExpbmtUb2tlbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IExpbmsgc2Vzc2lvbnMgY3JlYXRlZCB1c2luZyB0aGlzIGBsaW5rX3Rva2VuYC4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbnM/OiBBcnJheTxMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGxpbmsgc2Vzc2lvbi4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIGZvciB0aGUgbGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpcnN0IHN0YXJ0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgc3RhcnRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpbmlzaGVkLCBpZiBhdmFpbGFibGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZmluaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9uX3N1Y2Nlc3M/OiBMaW5rU2Vzc2lvblN1Y2Nlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvbl9leGl0PzogTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGV4aXQ/OiBMaW5rU2Vzc2lvbkV4aXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgY3VzdG9tZXItcmVsYXRlZCBMaW5rIGV2ZW50c1xuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRzPzogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25SZXN1bHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVzdWx0cz86IExpbmtTZXNzaW9uUmVzdWx0cyB8IG51bGw7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50cyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhbGxvdyBzZWxmLWN1c3RvZHkgY3J5cHRvIHdhbGxldHMgdG8gYmUgYWRkZWQgd2l0aG91dCByZXF1aXJpbmcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbGxvd191bnZlcmlmaWVkX2NyeXB0b193YWxsZXRzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGVudGVyIEludmVzdG1lbnRzIGFjY291bnQgYW5kIGhvbGRpbmdzIGluZm9ybWF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFsbG93X21hbnVhbF9lbnRyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIE1vdmUgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGgge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hbnVhbCBlbnRyeSBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYW51YWxfZW50cnlfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hc2tlZCBudW1iZXIgbWF0Y2ggZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgbWFza2VkX251bWJlcl9tYXRjaF9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgc3RhdGVkIGFjY291bnQgbnVtYmVyIGZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIHN0YXRlZF9hY2NvdW50X251bWJlcl9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZmVlIGFuZCBjb250cmlidXRpb24gZGV0YWlscyBmb3IgNDAxayBhY2NvdW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICByb2xsb3Zlcl80MDFrX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3QgZm9yIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gVGhlIG1vcmUgdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZXF1ZXN0ZWQsIHRoZSBsb25nZXIgdGhlIGhpc3RvcmljYWwgdXBkYXRlIHBvbGwgd2lsbCB0YWtlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA5MCBkYXlzLiBJbiBQcm9kdWN0aW9uLCBpZiBhIHZhbHVlIHVuZGVyIDMwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMzAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLiBPbmNlIFRyYW5zYWN0aW9ucyBoYXMgYmVlbiBhZGRlZCB0byBhbiBJdGVtLCB0aGlzIHZhbHVlIGNhbm5vdCBiZSB1cGRhdGVkLiAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlblRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBXZWJob29rIGluZGljYXRpbmcgdGhhdCB0aGUgc3RhdHVzIG9mIHRoZSBkZWxpdmVyeSBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiB0byBhIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVMSVZFUllfU1RBVFVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X21ldGFkYXRhOiBMaW5rRGVsaXZlcnlNZXRhZGF0YTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBtb3J0Z2FnZSBsb2FuIGFncmVlbWVudCBiZXR3ZWVuIG9uZSBvciBtb3JlIGJvcnJvd2VycyBhbmQgYSBtb3J0Z2FnZSBsZW5kZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogTG9hbklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBsb2FuIGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtbG9hbikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuQWNjb3VudFN1YnR5cGUge1xuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIE92ZXJkcmFmdCA9ICdvdmVyZHJhZnQnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGxvYW4gZGlzYnVyc2VtZW50IHRyYW5zYWN0aW9ucyByZWNlaXZlZCBieSB0aGUgdXNlciwgdHJhY2tpbmcgaW5jb21pbmcgZnVuZHMgZnJvbSBsb2FuIHByb3ZpZGVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbkRpc2J1cnNlbWVudHNJbmRpY2F0b3JzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkRpc2J1cnNlbWVudHNJbmRpY2F0b3JzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgdmFsdWUgb2YgaW5mbG93IHRyYW5zYWN0aW9ucyBjYXRlZ29yaXplZCBhcyBgTE9BTl9ESVNCVVJTRU1FTlRTYCwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydCB3aXRoaW4gdGhlIHJlcXVlc3RlZCB0aW1lIHdpbmRvdy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlsZWQgY2F0ZWdvcmllcyB2aWV3IG9mIGFsbCB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgTE9BTl9ESVNCVVJTRU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz59XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGNhdGVnb3J5X2RldGFpbHM/OiBBcnJheTxDYXRlZ29yeUV4cGVuc2VzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9udGhseUF2ZXJhZ2V9XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIG1vbnRobHlfYXZlcmFnZT86IE1vbnRobHlBdmVyYWdlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVcCB0byAzIHRvcCBzZXJ2aWNlIHByb3ZpZGVycyB0aGF0IHRoZSB1c2VyIGhhZCB0aGUgbW9zdCB0cmFuc2FjdGlvbnMgZm9yIGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0b3RhbCBzcGVuZC4gIElmIHRoZSB1c2VyIGhhcyBub3QgcmVjZWl2ZWQgbW9uZXkgZnJvbSBhbnkgcHJvdmlkZXIgaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCB0aGlzIGxpc3Qgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbkRpc2J1cnNlbWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdG9wX3Byb3ZpZGVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX0RJU0JVUlNFTUVOVFNgIGNyZWRpdCBjYXRlZ29yeSwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb250aGx5IHN1bW1hcmllcyBvZiB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgTE9BTl9ESVNCVVJTRU1FTlRTYCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxNb250aGx5U3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIExvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIG1vbnRobHlfc3VtbWFyaWVzPzogQXJyYXk8TW9udGhseVN1bW1hcnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0aGF0IGZhbGxzIGludG8gdGhlIGBMT0FOX0RJU0JVUlNFTUVOVFNgIGNyZWRpdCBjYXRlZ29yeSwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2xhc3Rfb2NjdXJyZW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHVzZXJcXCdzIG1vbnRobHkgaW5mbG93cyB0aGF0IHdhcyByZWNlaXZlZCBvbiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX0RJU0JVUlNFTUVOVFNgIGNyZWRpdCBjYXRlZ29yeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LCBhY3Jvc3MgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgcmVwb3J0LiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMDAgaW5kaWNhdGVzIHRoYXQgMTAwJSBvZiB0aGUgaW5mbG93cyB3ZXJlIHNwZW50IG9uIHRyYW5zYWN0aW9ucyB0aGF0IGZhbGwgaW50byB0aGUgYExPQU5fRElTQlVSU0VNRU5UU2AgY3JlZGl0IGNhdGVnb3J5LiBJZiB0aGVyZVxcJ3Mgbm8gYXZhaWxhYmxlIGluY29tZSBmb3IgdGhlIGdpdmVuIHRpbWUgcGVyaW9kLCB0aGlzIGZpZWxkIHZhbHVlIHdpbGwgYmUgYC0xYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlX29mX2luY29tZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBsb2FuYC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5GaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuRmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbkZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PExvYW5BY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIFRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgbG9hbiBieSB2YXJpb3VzIHBhcnRpZXMgdG8gdGhlIHRyYW5zYWN0aW9uIG9yIG90aGVyIG9yZ2FuaXphdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyXG4gICAgICovXG4gICAgTG9hbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBMb2FuSWRlbnRpZmllclR5cGU6IExvYW5JZGVudGlmaWVyVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBsb2FuIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuSWRlbnRpZmllclR5cGUge1xuICAgIExlbmRlckxvYW4gPSAnTGVuZGVyTG9hbicsXG4gICAgVW5pdmVyc2FsTG9hbiA9ICdVbml2ZXJzYWxMb2FuJ1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgY3VycmVudCBhbmQgcHJldmlvdXMgaWRlbnRpZmllcnMgZm9yIHRoaXMgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogTG9hbklkZW50aWZpZXI7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgbG9hbiBwYXltZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuUGF5bWVudHNDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuUGF5bWVudHNDb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbG9hbiBwYXltZW50cyBtYWRlIGluIHRoZSAzMCBkYXlzIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGRhdGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNDb3VudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGJhc2VsaW5lX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgbG9hbiBwYXltZW50cyBtYWRlIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNDb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW50X2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEluc2lnaHRzIGludG8gbG9hbiBwYXltZW50IHRyYW5zYWN0aW9ucyBtYWRlIGJ5IHRoZSB1c2VyLCB0cmFja2luZyBvdXRnb2luZyBwYXltZW50cyB0byBsb2FuIHByb3ZpZGVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5QYXltZW50c0luZGljYXRvcnMge1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB2YWx1ZSBvZiBvdXRmbG93IHRyYW5zYWN0aW9ucyBjYXRlZ29yaXplZCBhcyBgTE9BTl9QQVlNRU5UU2AsIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQgd2l0aGluIHRoZSByZXF1ZXN0ZWQgdGltZSB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb250aGx5QXZlcmFnZX1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIG1vbnRobHlfYXZlcmFnZT86IE1vbnRobHlBdmVyYWdlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxlZCBjYXRlZ29yaWVzIHZpZXcgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX1BBWU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz59XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9kZXRhaWxzPzogQXJyYXk8Q2F0ZWdvcnlFeHBlbnNlcz47XG4gICAgLyoqXG4gICAgICogVXAgdG8gMyB0b3Agc2VydmljZSBwcm92aWRlcnMgdGhhdCB0aGUgdXNlciBoYWQgdGhlIG1vc3QgdHJhbnNhY3Rpb25zIGZvciBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdG90YWwgc3BlbmQuICBJZiB0aGUgdXNlciBoYXMgbm90IHNwZW50IG1vbmV5IG9uIGFueSBwcm92aWRlciBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIHRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgdG9wX3Byb3ZpZGVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX1BBWU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnksIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgc3VtbWFyaWVzIG9mIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCBmYWxsIGludG8gdGhlIGBMT0FOX1BBWU1FTlRTYCBjcmVkaXQgY2F0ZWdvcnkgd2l0aGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9udGhseVN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgbW9udGhseV9zdW1tYXJpZXM/OiBBcnJheTxNb250aGx5U3VtbWFyeT47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHRoYXQgZmFsbHMgaW50byB0aGUgYExPQU5fUEFZTUVOVFNgIGNyZWRpdCBjYXRlZ29yeSwgYWNyb3NzIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNJbmRpY2F0b3JzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9sYXN0X29jY3VycmVuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB1c2VyXFwncyBtb250aGx5IGluZmxvd3MgdGhhdCB3YXMgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgTE9BTl9QQVlNRU5UU2AgY3JlZGl0IGNhdGVnb3J5IHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3csIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSByZXBvcnQuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwMCBpbmRpY2F0ZXMgdGhhdCAxMDAlIG9mIHRoZSBpbmZsb3dzIHdlcmUgc3BlbnQgb24gdHJhbnNhY3Rpb25zIHRoYXQgZmFsbCBpbnRvIHRoZSBgTE9BTl9QQVlNRU5UU2AgY3JlZGl0IGNhdGVnb3J5LiBJZiB0aGVyZVxcJ3Mgbm8gYXZhaWxhYmxlIGluY29tZSBmb3IgdGhlIGdpdmVuIHRpbWUgcGVyaW9kLCB0aGlzIGZpZWxkIHZhbHVlIHdpbGwgYmUgYC0xYFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlX29mX2luY29tZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgdW5pcXVlIGxvYW4gcGF5bWVudCBtZXJjaGFudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bmlxdWUgbG9hbiBwYXltZW50IG1lcmNoYW50cyBkZXRlY3RlZCBpbiB0aGUgMzAgZGF5cyBiZWZvcmUgdGhlIHN1YnNjcmlwdGlvbiBkYXRlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGJhc2VsaW5lX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgdW5pcXVlIGxvYW4gcGF5bWVudCBtZXJjaGFudHMgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c01lcmNoYW50Q291bnRzXG4gICAgICovXG4gICAgY3VycmVudF9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbG9hbnMgdGhhdCBhcmUgcGFydCBvZiBhIHNpbmdsZSBkZWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2Fuc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbnNcbiAgICAgKi9cbiAgICBMT0FOOiBMb2FuO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZS4gTG9jYXRpb24gZGF0YSBpcyBwcm92aWRlZCBvbmx5IGZvciB0cmFuc2FjdGlvbnMgYXQgcGh5c2ljYWwgbG9jYXRpb25zLCBub3QgZm9yIG9ubGluZSB0cmFuc2FjdGlvbnMuIExvY2F0aW9uIGRhdGEgYXZhaWxhYmlsaXR5IGRlcGVuZHMgcHJpbWFyaWx5IG9uIHRoZSBtZXJjaGFudCBhbmQgaXMgbW9zdCBsaWtlbHkgdG8gYmUgcG9wdWxhdGVkIGZvciB0cmFuc2FjdGlvbnMgYXQgbGFyZ2UgcmV0YWlsIGNoYWluczsgc21hbGwsIGxvY2FsIGJ1c2luZXNzZXMgYXJlIGxlc3MgbGlrZWx5IHRvIGhhdmUgbG9jYXRpb24gZGF0YSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBhZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGl0dWRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGxhdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbG9uZ2l0dWRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGxvbjogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgZGVmaW5lZCBzdG9yZSBudW1iZXIgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgc3RvcmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG11bHRpLWZhY3RvciBhdXRoZW50aWNhdGlvbiBzZXR0aW5ncyB0byB1c2Ugd2l0aCB0aGlzIHRlc3QgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNRkFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNRkEge1xuICAgIC8qKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgYGRldmljZWAsIGBzZWxlY3Rpb25zYCwgb3IgYHF1ZXN0aW9uc2AuICBJZiB2YWx1ZSBpcyBgZGV2aWNlYCwgdGhlIE1GQSBhbnN3ZXIgaXMgYDEyMzRgLiAgSWYgdmFsdWUgaXMgYHNlbGVjdGlvbnNgLCB0aGUgTUZBIGFuc3dlciBpcyBhbHdheXMgdGhlIGZpcnN0IG9wdGlvbi4gIElmIHZhbHVlIGlzIGBxdWVzdGlvbnNgLCB0aGUgTUZBIGFuc3dlciBpcyAgYGFuc3dlcl88aT5fPGo+YCBmb3IgdGhlIGotdGggcXVlc3Rpb24gaW4gdGhlIGktdGggcm91bmQsIHN0YXJ0aW5nIGZyb20gMC4gRm9yIGV4YW1wbGUsIHRoZSBhbnN3ZXIgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIGluIHRoZSBzZWNvbmQgcm91bmQgaXMgYGFuc3dlcl8xXzBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2Ygcm91bmRzIG9mIHF1ZXN0aW9ucy4gUmVxdWlyZWQgaWYgdmFsdWUgb2YgYHR5cGVgIGlzIGBxdWVzdGlvbnNgLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBxdWVzdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgcXVlc3Rpb25zIHBlciByb3VuZC4gUmVxdWlyZWQgaWYgdmFsdWUgb2YgYHR5cGVgIGlzIGBxdWVzdGlvbnNgLiBJZiB2YWx1ZSBvZiB0eXBlIGlzIGBzZWxlY3Rpb25zYCwgZGVmYXVsdCB2YWx1ZSBpcyAyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uc19wZXJfcm91bmQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2Ygcm91bmRzIG9mIHNlbGVjdGlvbnMsIHVzZWQgaWYgYHR5cGVgIGlzIGBzZWxlY3Rpb25zYC4gRGVmYXVsdHMgdG8gMS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25fcm91bmRzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGF2YWlsYWJsZSBhbnN3ZXJzIHBlciBxdWVzdGlvbiwgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbnNgLiBEZWZhdWx0cyB0byAyLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25zX3Blcl9xdWVzdGlvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBTdW1tYXJ5IG9iamVjdCByZWZsZWN0aW5nIHRoZSBtYXRjaCByZXN1bHQgb2YgdGhlIGFzc29jaWF0ZWQgZGF0YVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNYXRjaFN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXRjaFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBNYXRjaFN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIG1hdGNoIHR5cGUgYmV0d2VlbiBkYXRhIHByb3ZpZGVkIGJ5IHVzZXIgYW5kIGRhdGEgY2hlY2tlZCBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlLiAgIGBtYXRjaGAgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgd2FzIGEgc3Ryb25nIG1hdGNoIGFnYWluc3QgZXh0ZXJuYWwgZGF0YS4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIGFnYWluc3QgZXh0ZXJuYWwgZGF0YS4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gcGVyZm9ybSBhIGNoZWNrIGFnYWluc3QgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgYW5kIGl0IGRpZCBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBmaW5kIGV4dGVybmFsIGRhdGEgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2lucHV0YCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgdW5hYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBiZWNhdXNlIG5vIGluZm9ybWF0aW9uIHdhcyBwcm92aWRlZCBmb3IgdGhpcyBmaWVsZCBieSB0aGUgZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBNYXRjaFN1bW1hcnlDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJyxcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0J1xufVxuXG4vKipcbiAqIEluc2lnaHRzIGludG8gYSB1c2VyXFwncyB0b3AgbWVyY2hhbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNZXJjaGFudEluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIGlkIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggbWVyY2hhbnQgb2YgdGhpcyB0eXBlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9kZXRhaWxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdW0gb2Ygb3V0ZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBpbmZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93czogbnVtYmVyO1xufVxuLyoqXG4gKiBBbGxvd3Mgc3BlY2lmeWluZyB0aGUgbWV0YWRhdGEgb2YgdGhlIHRlc3QgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNZXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBvZmZpY2lhbCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbGltaXRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbWFzay4gU2hvdWxkIGJlIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZyBvZiAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIFRoaXMgYWxsb3dzIHlvdSB0byBtb2RlbCBhIG1hc2sgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIChzdWNoIGFzIHdpdGggYSB2aXJ0dWFsIGFjY291bnQgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIHJlYXNvbiB5b3UgYXJlIGdlbmVyYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgZm9yIHRoaXMgdXNlci4gIGBBQ0NPVU5UX1JFVklFV19DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjb25zdW1lciBjcmVkaXQgdHJhbnNhY3Rpb24gZm9yIHRoZSByZXZpZXcgb3IgY29sbGVjdGlvbiBvZiBhbiBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHN1Y2ggYXMgd2hlbiBhbiBpbmRpdmlkdWFsIGFncmVlcyB0byBhY3QgYXMgYSBndWFyYW50b3Igb3IgYXNzdW1lcyBwZXJzb25hbCBsaWFiaWxpdHkgZm9yIGEgY29uc3VtZXIsIGJ1c2luZXNzLCBvciBjb21tZXJjaWFsIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBNb25pdG9yaW5nQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2Uge1xuICAgIEFjY291bnRSZXZpZXdDcmVkaXQgPSAnQUNDT1VOVF9SRVZJRVdfQ1JFRElUJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25PdGhlciA9ICdXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGluY29tZSBzdWJjYXRlZ29yeSBvZiB0aGUgcmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsTW9udGhseUluY29tZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9tb250aGx5X2luY29tZTogVG90YWxNb250aGx5SW5jb21lSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVNvdXJjZXNDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50czogSW5jb21lU291cmNlc0NvdW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9yZWNhc3RlZE1vbnRobHlJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfbW9udGhseV9pbmNvbWU6IEZvcmVjYXN0ZWRNb250aGx5SW5jb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaXN0b3JpY2FsQW5udWFsSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2FubnVhbF9pbmNvbWU6IEhpc3RvcmljYWxBbm51YWxJbmNvbWU7XG4gICAgLyoqXG4gICAgICogVGhlIGluY29tZSBzb3VyY2VzIGZvciB0aGlzIEl0ZW0uIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgc2luZ2xlIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9uaXRvcmluZ0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzOiBBcnJheTxNb25pdG9yaW5nSW5jb21lU291cmNlPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3J5OiBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgZGV0ZWN0ZWQgdHJhbnNhY3Rpb24gZGF0ZSBmb3IgdGhpcyBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGxhc3RfdHJhbnNhY3Rpb25fZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBNb25pdG9yaW5nIEluc2lnaHRzIGZvciB0aGUgZ2l2ZW4gSXRlbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5jb21lSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZTogTW9uaXRvcmluZ0luY29tZUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nTG9hbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuczogTW9uaXRvcmluZ0xvYW5JbnNpZ2h0cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgTW9uaXRvcmluZyBJbnNpZ2h0cyBJdGVtXFwncyBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNJdGVtU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0l0ZW1TdGF0dXNDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNJdGVtU3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzX2NvZGU6IE1vbml0b3JpbmdJdGVtU3RhdHVzQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIHJlYXNvbiBmb3Igd2h5IGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnQgaXMgbm90IGF2YWlsYWJsZS4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIHdoZW4gdGhlIGBzdGF0dXNfY29kZWAgaXMgbm90IGBBVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEVudW0gZm9yIHRoZSBzdGF0dXMgb2YgdGhlIGluc2lnaHRzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBNb25pdG9yaW5nSW5zaWdodHNTdGF0dXMge1xuICAgIEF2YWlsYWJsZSA9ICdBVkFJTEFCTEUnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnXG59XG5cbi8qKlxuICogRW51bSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbVxcJ3MgaW5zaWdodHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1vbml0b3JpbmdJdGVtU3RhdHVzQ29kZSB7XG4gICAgQXZhaWxhYmxlID0gJ0FWQUlMQUJMRScsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCcsXG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGxvYW4gZXhwb3N1cmUgc3ViY2F0ZWdvcnkgb2YgdGhlIHJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0xvYW5JbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5QYXltZW50c0NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0xvYW5JbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvYW5fcGF5bWVudHNfY291bnRzOiBMb2FuUGF5bWVudHNDb3VudHM7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBsb2FuIGRpc2J1cnNlbWVudHMgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdMb2FuSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuX2Rpc2J1cnNlbWVudHNfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdMb2FuSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuX3BheW1lbnRfbWVyY2hhbnRzX2NvdW50czogTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHM7XG59XG4vKipcbiAqIFRoZSBtb250aGx5IGF2ZXJhZ2UgYW1vdW50IGNhbGN1bGF0ZWQgYnkgZGl2aWRpbmcgdGhlIHRvdGFsIGJ5IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzIGluIHRoZSB0aW1lIHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9udGhseUF2ZXJhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb250aGx5QXZlcmFnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgYXZlcmFnZSBhbW91bnQgb2YgYWxsIHRoZSBhZ2dyZWdhdGVkIHRyYW5zYWN0aW9ucyBvZiB0aGUgZ2l2ZW4gY2F0ZWdvcnksIGFjcm9zcyBhbGwgdGhlIGFjY291bnRzIGZvciB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cuICBUaGUgYXZlcmFnZSBpcyBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZSB0b3RhbCBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9ucyBieSB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBpbiB0aGUgZ2l2ZW4gdGltZSB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9udGhseUF2ZXJhZ2VcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb250aGx5QXZlcmFnZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9udGhseUF2ZXJhZ2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBNb250aGx5IHN1bW1hcnkgb2YgdHJhbnNhY3Rpb25zIHdpdGhpbiBhIHNwZWNpZmljIHRpbWUgcGVyaW9kLCBzaG93aW5nIGFnZ3JlZ2F0ZWQgYW1vdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9udGhseVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb250aGx5U3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIG1vbnRoIGZvciB0aGUgZ2l2ZW4gcmVwb3J0IHRpbWUgd2luZG93LiBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIG1vbnRoIGZvciB0aGUgZ2l2ZW4gcmVwb3J0IHRpbWUgd2luZG93LiBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Ftb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgTW9udGhseVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBBbW91bnRXaXRoQ3VycmVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgaW50ZXJlc3QgcmF0ZSBmb3IgdGhlIG1vcnRnYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlSW50ZXJlc3RSYXRlIHtcbiAgICAvKipcbiAgICAgKiBQZXJjZW50YWdlIHZhbHVlIChpbnRlcmVzdCByYXRlIG9mIGN1cnJlbnQgbW9ydGdhZ2UsIG5vdCBBUFIpIG9mIGludGVyZXN0IHBheWFibGUgb24gYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbnRlcmVzdCBjaGFyZ2VkIChmaXhlZCBvciB2YXJpYWJsZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgbW9ydGdhZ2UgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUxpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBvdXRzdGFuZGluZyBhbW91bnQgY2hhcmdlZCBmb3IgbGF0ZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgY3VycmVudF9sYXRlX2ZlZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgaGVsZCBpbiBlc2Nyb3cgdG8gcGF5IHRheGVzIGFuZCBpbnN1cmFuY2Ugb24gYmVoYWxmIG9mIHRoZSBib3Jyb3dlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGVzY3Jvd19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciBoYXMgcHJpdmF0ZSBtb3J0Z2FnZSBpbnN1cmFuY2UgaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wbWk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciB3aWxsIHBheSBhIHBlbmFsdHkgZm9yIGVhcmx5IHBheW9mZiBvZiBtb3J0Z2FnZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBoYXNfcHJlcGF5bWVudF9wZW5hbHR5OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9ydGdhZ2VJbnRlcmVzdFJhdGV9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaW50ZXJlc3RfcmF0ZTogTW9ydGdhZ2VJbnRlcmVzdFJhdGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGxvYW4sIGZvciBleGFtcGxlIGBjb252ZW50aW9uYWxgLCBgZml4ZWRgLCBvciBgdmFyaWFibGVgLiBUaGlzIGZpZWxkIGlzIHByb3ZpZGVkIGRpcmVjdGx5IGZyb20gdGhlIGxvYW4gc2VydmljZXIgYW5kIGRvZXMgbm90IGhhdmUgYW4gZW51bWVyYXRlZCBzZXQgb2YgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90eXBlX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZ1bGwgZHVyYXRpb24gb2YgbW9ydGdhZ2UgYXMgYXQgb3JpZ2luYXRpb24gKGUuZy4gYDEwIHllYXJgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxvYW5fdGVybTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPcmlnaW5hbCBkYXRlIG9uIHdoaWNoIG1vcnRnYWdlIGlzIGR1ZSBpbiBmdWxsLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG1hdHVyaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbmV4dCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9tb250aGx5X3BheW1lbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1ZSBkYXRlIGZvciB0aGUgbmV4dCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fcHJpbmNpcGFsX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbG9hbiAocHJpbmNpcGFsICsgaW50ZXJlc3QpIHBhc3QgZHVlIGZvciBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgcGFzdF9kdWVfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwcm9wZXJ0eV9hZGRyZXNzOiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfaW50ZXJlc3RfcGFpZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgWVREIHByaW5jaXBhbCBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgeXRkX3ByaW5jaXBhbF9wYWlkOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmaWVsZHMgZGVzY3JpYmluZyBwcm9wZXJ0eSBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpdmUgb3IgbmluZSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgKGV4YW1wbGUgXFxcIk5DXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgKGV4YW1wbGUgXFxcIjU2NCBNYWluIFN0cmVldCwgQXB0IDE1XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIHJpc2sgc2lnbmFscyBhbmQgcmVsZXZhbnQgbWV0YWRhdGEgZm9yIGEgc2V0IG9mIHVwbG9hZGVkIGRvY3VtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYXR0cmlidXRlcyB0aGF0IGNvdWxkIGluZGljYXRlIGlmIGEgZG9jdW1lbnQgaXMgZnJhdWR1bGVudFxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZXM6IEFycmF5PFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZT47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYXR0cmlidXRlcyB0aGF0IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGZyYXVkIHJpc2sgd2l0aCBhIHNldCBvZiBkb2N1bWVudHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIG5hbWUgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBuYW1lIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOYW1lTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgbmFtZS4gMTAwIGlzIGEgcGVyZmVjdCBzY29yZSwgOTktODUgbWVhbnMgYSBzdHJvbmcgbWF0Y2gsIDg0LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55IHNjb3JlIGxlc3MgdGhhbiA3MCBpcyBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIG5hbWUgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGZpcnN0IG9yIGxhc3QgbmFtZSBjb21wbGV0ZWx5IG1hdGNoZWQsIGxpa2VseSBhIGZhbWlseSBtZW1iZXJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19maXJzdF9uYW1lX29yX2xhc3RfbmFtZV9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIG5pY2tuYW1lIG1hdGNoZWQsIGV4YW1wbGUgSmVubmlmZXIgYW5kIEplbm4uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfbmlja25hbWVfbWF0Y2g/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJcyBgdHJ1ZWAgaWYgdGhlIG5hbWUgb24gZWl0aGVyIG9mIHRoZSBuYW1lcyB0aGF0IHdhcyBtYXRjaGVkIGZvciB0aGUgc2NvcmUgY29udGFpbmVkIHN0cmluZ3MgaW5kaWNhdGl2ZSBvZiBhIGJ1c2luZXNzIG5hbWUsIHN1Y2ggYXMgXFxcIkNPUlBcXFwiLCBcXFwiTExDXFxcIiwgXFxcIklOQ1xcXCIsIG9yIFxcXCJMVERcXFwiLiBBIGB0cnVlYCByZXN1bHQgZ2VuZXJhbGx5IGluZGljYXRlcyB0aGF0IGFuIGFjY291bnRcXCdzIG5hbWUgaXMgYSBidXNpbmVzcyBuYW1lLiBIb3dldmVyLCBhIGBmYWxzZWAgcmVzdWx0IGRvZXMgbm90IG1lYW4gdGhlIGFjY291bnQgbmFtZSBpcyBub3QgYSBidXNpbmVzcyBuYW1lLCBhcyBzb21lIGJ1c2luZXNzZXMgZG8gbm90IHVzZSB0aGVzZSBzdHJpbmdzIGluIHRoZSBuYW1lcyB1c2VkIGZvciB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfYnVzaW5lc3NfbmFtZV9kZXRlY3RlZD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIG5lZ2F0aXZlIGJhbGFuY2Ugb2NjdXJyZW5jZXMsIGluY2x1ZGluZyBmcmVxdWVuY3ksIGR1cmF0aW9uLCBhbmQgbWluaW11bSBiYWxhbmNlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5lZ2F0aXZlQmFsYW5jZUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmVnYXRpdmVCYWxhbmNlSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0aGF0IGNhdXNlZCBhbnkgYWNjb3VudCBpbiB0aGUgcmVwb3J0IHRvIGhhdmUgYSBuZWdhdGl2ZSBiYWxhbmNlLiAgVGhpcyB2YWx1ZSBpcyBpbmNsdXNpdmUgb2YgdGhlIGRhdGUgb2YgdGhlIGxhc3QgbmVnYXRpdmUgYmFsYW5jZSwgbWVhbmluZyB0aGF0IGlmIHRoZSBsYXN0IG5lZ2F0aXZlIGJhbGFuY2Ugb2NjdXJyZWQgdG9kYXksIHRoaXMgdmFsdWUgd2lsbCBiZSBgMGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmVnYXRpdmVCYWxhbmNlSW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2xhc3Rfb2NjdXJyZW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBhZ2dyZWdhdGVkIGRheXMgdGhhdCB0aGUgYWNjb3VudHMgaW4gdGhlIHJlcG9ydCBoYXMgaGFkIGEgbmVnYXRpdmUgYmFsYW5jZSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUgd2luZG93LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5lZ2F0aXZlQmFsYW5jZUluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIE5lZ2F0aXZlQmFsYW5jZUluc2lnaHRzXG4gICAgICovXG4gICAgbWluaW11bV9iYWxhbmNlPzogQW1vdW50V2l0aEN1cnJlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3VtbWFyeSBvZiB0aGUgbmVnYXRpdmUgYmFsYW5jZSBvY2N1cnJlbmNlcyBmb3IgdGhpcyBhY2NvdW50LiAgSWYgdGhlIHVzZXIgaGFzIG5vdCBoYWQgYSBuZWdhdGl2ZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50IGluIHRoZSBnaXZlbiB0aW1lIHdpbmRvdywgdGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkuXG4gICAgICogQHR5cGUge0FycmF5PE5lZ2F0aXZlQmFsYW5jZU9jY3VycmVuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBOZWdhdGl2ZUJhbGFuY2VJbnNpZ2h0c1xuICAgICAqL1xuICAgIG9jY3VycmVuY2VzPzogQXJyYXk8TmVnYXRpdmVCYWxhbmNlT2NjdXJyZW5jZT47XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9mIGEgbmVnYXRpdmUgYmFsYW5jZSBwZXJpb2QsIGluY2x1ZGluZyBzdGFydCBhbmQgZW5kIGRhdGVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZWdhdGl2ZUJhbGFuY2VPY2N1cnJlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmVnYXRpdmVCYWxhbmNlT2NjdXJyZW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGZpcnN0IHRyYW5zYWN0aW9uIHRoYXQgY2F1c2VkIHRoZSBhY2NvdW50IHRvIGhhdmUgYSBuZWdhdGl2ZSBiYWxhbmNlLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmVnYXRpdmVCYWxhbmNlT2NjdXJyZW5jZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHRoYXQgY2F1c2VkIHRoZSBhY2NvdW50IHRvIGhhdmUgYSBuZWdhdGl2ZSBiYWxhbmNlLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoaXMgZGF0ZSBpcyBpbmNsdXNpdmUsIG1lYW5pbmcgdGhhdCB0aGlzIHdhcyB0aGUgbGFzdCBkYXRlIHRoYXQgdGhlIGFjY291bnQgaGFkIGEgbmVnYXRpdmUgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZWdhdGl2ZUJhbGFuY2VPY2N1cnJlbmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIE5lZ2F0aXZlQmFsYW5jZU9jY3VycmVuY2VcbiAgICAgKi9cbiAgICBtaW5pbXVtX2JhbGFuY2U/OiBBbW91bnRXaXRoQ3VycmVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0UGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsPzogVG90YWw7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIE5ldHdvcmsgSW5zaWdodHMuIFJlcXVpcmVkIGlmIHVzaW5nIE5ldHdvcmsgSW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrSW5zaWdodHNWZXJzaW9uIHtcbiAgICBOaTEgPSAnTkkxJ1xufVxuXG4vKipcbiAqIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL25ldHdvcmsvc3RhdHVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IE5ldHdvcmtTdGF0dXNHZXRVc2VyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiBhIHRlbXBsYXRlIGRlZmluZWQgaW4gUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGZpZWxkIGlzIHVzZWQgaWYgeW91IGhhdmUgYWRkaXRpb25hbCBjcml0ZXJpYSB0aGF0IHlvdSB3YW50IHRvIGNoZWNrIGFnYWluc3QgKGUuZy4gTGF5ZXIgZWxpZ2liaWxpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbmV0d29yay9zdGF0dXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXR3b3JrX3N0YXR1czogTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTmV0d29ya1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxheWVyPzogTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgTGF5ZXItcmVsYXRlZCBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZUxheWVyIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgTGF5ZXIgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXJcbiAgICAgKi9cbiAgICBlbGlnaWJsZTogYm9vbGVhbjtcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIG92ZXJhbGwgbmV0d29yayBzdGF0dXMgb2YgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFJldHVybmluZ1VzZXIgPSAnUkVUVVJOSU5HX1VTRVInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyIGZvciB0aGUgbmV0d29yayBzdGF0dXMgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIgaW4gW0UuMTY0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FLjE2NCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gUGxhaWQgZGV0ZWN0cyBhIG5ldyBhY2NvdW50LiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIHlvdSBjYW4gcHJvbXB0IHlvdXIgdXNlcnMgdG8gc2hhcmUgbmV3IGFjY291bnRzIHdpdGggeW91IHRocm91Z2ggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvI3VzaW5nLXVwZGF0ZS1tb2RlLXRvLXJlcXVlc3QtbmV3LWFjY291bnRzKSAoVVMvQ0Egb25seSkuIElmIHRoZSBlbmQgdXNlciBoYXMgb3B0ZWQgbm90IHRvIHNoYXJlIG5ldyBhY2NvdW50cyB3aXRoIFBsYWlkIHZpYSB0aGVpciBpbnN0aXR1dGlvblxcJ3MgT0F1dGggc2V0dGluZ3MsIFBsYWlkIHdpbGwgbm90IGRldGVjdCBuZXcgYWNjb3VudHMgYW5kIHRoaXMgd2ViaG9vayB3aWxsIG5vdCBmaXJlLiBGb3IgZW5kIHVzZXIgYWNjb3VudHMgaW4gdGhlIEVVIGFuZCBVSywgdXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCB5b3UgY2FuIHByb21wdCB5b3VyIHVzZXIgdG8gcmUtbGluayB0aGVpciBhY2NvdW50IGFuZCB0aGVuIGRlbGV0ZSB0aGUgb2xkIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpZXIgbnVtYmVyIGRhdGEgdXNlZCB0byBjb25maWd1cmUgdGhlIHRlc3QgYWNjb3VudC4gQWxsIHZhbHVlcyBhcmUgb3B0aW9uYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBXaWxsIGJlIHVzZWQgZm9yIHRoZSBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJvdXRpbmcgbnVtYmVyLiBUbyB0ZXN0IGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAsIHNldCB0aGlzIHRvIDMyMjI3MTYyNyB0byBmb3JjZSBhIGB0cnVlYCByZXN1bHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2hfd2lyZV9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgZWZ0X2JyYW5jaGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9pbnN0aXR1dGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFRlQgYnJhbmNoIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfaW5zdGl0dXRpb25gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnRfYnJhbmNoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSAoQklDKS4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBpbnRlcm5hdGlvbmFsX2liYW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2JpYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLiBJZiBubyBhY2NvdW50IG51bWJlciBpcyBzcGVjaWZpZWQgdmlhIGBhY2NvdW50YCwgd2lsbCBhbHNvIGJlIHVzZWQgYXMgdGhlIGFjY291bnQgbnVtYmVyIGJ5IGRlZmF1bHQuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9iaWNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2liYW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQmFjcyBzb3J0IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYmFjc19zb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudCBhY2NvdW50IHZpYSBBQ0FUUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDQVRTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDQVRTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNBVFNcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllcnMgZm9yIHRoZSBjbGVhcmluZ2hvdXNlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaW4gb3JkZXIgb2YgcmVsZXZhbmNlLiBJZiB0aGlzIGFycmF5IGlzIGVtcHR5LCBjYWxsIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAgd2l0aCB0aGUgYGl0ZW0uaW5zdGl0dXRpb25faWRgIHRvIGdldCB0aGUgRFRDIG51bWJlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgZHRjX251bWJlcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVTIGFjY291bnQgdmlhIEFDSCBvciB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNIXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDSCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgQXQgY2VydGFpbiBpbnN0aXR1dGlvbnMsIGluY2x1ZGluZyBDaGFzZSwgUE5DLCBhbmQgVVMgQmFuaywgeW91IHdpbGwgcmVjZWl2ZSBhIFxcXCJ0b2tlbml6ZWRcXFwiIGFjY291bnQgbnVtYmVyLCB3aGljaCBpcyBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IG51bWJlci4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0aGlzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiBhbmQgb24gaG93IHRvIGF2b2lkIGZyYXVkLCB1c2VyIGNvbmZ1c2lvbiwgYW5kIEFDSCByZXR1cm5zLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBudW1iZXIgaXMgdG9rZW5pemVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgaXNfdG9rZW5pemVkX2FjY291bnRfbnVtYmVyPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpZiB0aGUgaW5zdGl0dXRpb24gaXMga25vd24gdG8gdXNlIGEgc2VwYXJhdGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci4gTWFueSBpbnN0aXR1dGlvbnMgZG8gbm90IGhhdmUgYSBzZXBhcmF0ZSB3aXJlIHJvdXRpbmcgbnVtYmVyIGFuZCB1c2UgdGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3Igd2lyZXMgaW5zdGVhZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gaGF2ZSB0aGUgZW5kIHVzZXIgbWFudWFsbHkgY29uZmlybSB0aGVpciB3aXJlIHJvdXRpbmcgbnVtYmVyIGJlZm9yZSBzZW5kaW5nIGFueSB3aXJlcyB0byB0aGVpciBhY2NvdW50LCBlc3BlY2lhbGx5IGlmIHRoaXMgZmllbGQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIGludG8gdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9pbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBvdXQgb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9vdXQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVVMgYWNjb3VudCB2aWEgQUNIIG9yIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0hOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0hOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnQuICBBdCBjZXJ0YWluIGluc3RpdHV0aW9ucywgaW5jbHVkaW5nIENoYXNlLCBQTkMsIGFuZCBVUyBCYW5rLCB5b3Ugd2lsbCByZWNlaXZlIGEgXFxcInRva2VuaXplZFxcXCIgYWNjb3VudCBudW1iZXIsIHdoaWNoIGlzIG5vdCB0aGUgdXNlclxcJ3MgYWN0dWFsIGFjY291bnQgbnVtYmVyLiBGb3IgaW1wb3J0YW50IGRldGFpbHMgb24gaG93IHRoaXMgbWF5IGltcGFjdCB5b3VyIGludGVncmF0aW9uIGFuZCBvbiBob3cgdG8gYXZvaWQgZnJhdWQsIHVzZXIgY29uZnVzaW9uLCBhbmQgQUNIIHJldHVybnMsIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgbnVtYmVyIGlzIHRva2VuaXplZCBieSB0aGUgaW5zdGl0dXRpb24uIEZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiBob3cgdG9rZW5pemVkIGFjY291bnQgbnVtYmVycyBtYXkgaW1wYWN0IHlvdXIgaW50ZWdyYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgaXNfdG9rZW5pemVkX2FjY291bnRfbnVtYmVyPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBrbm93biB0byB1c2UgYSBzZXBhcmF0ZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBNYW55IGluc3RpdHV0aW9ucyBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHdpcmUgcm91dGluZyBudW1iZXIgYW5kIHVzZSB0aGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB3aXJlcyBpbnN0ZWFkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBoYXZlIHRoZSBlbmQgdXNlciBtYW51YWxseSBjb25maXJtIHRoZWlyIHdpcmUgcm91dGluZyBudW1iZXIgYmVmb3JlIHNlbmRpbmcgYW55IHdpcmVzIHRvIHRoZWlyIGFjY291bnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBmaWVsZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBpbnRvIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9pbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBvdXQgb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnQgYWNjb3VudCB2aWEgQVRPTi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FUT05cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQVRPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCYWNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYWNzIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYWNzIHNvcnQgY29kZSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVSyBiYW5rIGFjY291bnQgdmlhIEJhY3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhY3MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFjcyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBDYW5hZGlhbiBiYW5rIGFjY291bnQgdmlhIEVGVC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0VGVFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBicmFuY2g6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGJyYW5jaCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSUJBTk51bGxhYmxlIHtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCdXNpbmVzcyBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBudW1iZXJzIHVzaW5nIHRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgYW5kIEJJQy9TV0lGVCBjb2RlIGZvcm1hdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQnVzaW5lc3MgSWRlbnRpZmllciBDb2RlLCBhbHNvIGtub3duIGFzIFNXSUZUIGNvZGUsIGZvciB0aGlzIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSAoQklDKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgZnJvbSBhIDQwMWsgYWNjb3VudCB0byBhbm90aGVyIDQwMWsgYWNjb3VudCBvciBJUkEgdmlhIHRoZSBtYW51YWwgNDAxayByb2xsb3ZlciBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzUmV0aXJlbWVudDQwMWtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzUmV0aXJlbWVudDQwMWsge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1JldGlyZW1lbnQ0MDFrXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGFuIG51bWJlciBmb3IgdGhlIGVtcGxveWVyXFwncyA0MDFrIHJldGlyZW1lbnQgcGxhblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNSZXRpcmVtZW50NDAxa1xuICAgICAqL1xuICAgIHBsYW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1JldGlyZW1lbnQ0MDFrXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbn1cbi8qKlxuICogT0F1dGggZXJyb3IgY29kZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT0F1dGhFcnJvckNvZGUge1xuICAgIEludmFsaWRSZXF1ZXN0ID0gJ2ludmFsaWRfcmVxdWVzdCcsXG4gICAgSW52YWxpZENsaWVudCA9ICdpbnZhbGlkX2NsaWVudCcsXG4gICAgSW52YWxpZEdyYW50ID0gJ2ludmFsaWRfZ3JhbnQnLFxuICAgIFVuYXV0aG9yaXplZENsaWVudCA9ICd1bmF1dGhvcml6ZWRfY2xpZW50JyxcbiAgICBJbnZhbGlkU2NvcGUgPSAnaW52YWxpZF9zY29wZScsXG4gICAgVW5zdXBwb3J0ZWRHcmFudFR5cGUgPSAndW5zdXBwb3J0ZWRfZ3JhbnRfdHlwZSdcbn1cblxuLyoqXG4gKiBPQXV0aCBlcnJvciByZXNwb25zZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPQXV0aEVycm9yUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPQXV0aEVycm9yUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPQXV0aEVycm9yQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhFcnJvclJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBPQXV0aEVycm9yQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoRXJyb3JSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJJIGlkZW50aWZ5aW5nIHRoZSBzcGVjaWZpYyBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoRXJyb3JSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yX3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhFcnJvclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBPQXV0aCBncmFudCBiZWluZyByZXF1ZXN0ZWQ6ICBgY2xpZW50X2NyZWRlbnRpYWxzYCBhbGxvd3MgZXhjaGFuZ2luZyBhIGNsaWVudCBpZCBhbmQgY2xpZW50IHNlY3JldCBmb3IgYSByZWZyZXNoIGFuZCBhY2Nlc3MgdG9rZW4uIGByZWZyZXNoX3Rva2VuYCBhbGxvd3MgcmVmcmVzaGluZyBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYSByZWZyZXNoIHRva2VuLiBXaGVuIHVzaW5nIHRoaXMgZ3JhbnQgdHlwZSwgb25seSB0aGUgYHJlZnJlc2hfdG9rZW5gIGZpZWxkIGlzIHJlcXVpcmVkIChhbG9uZyB3aXRoIHRoZSBgY2xpZW50X2lkYCBhbmQgYGNsaWVudF9zZWNyZXRgKS4gYHVybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOnRva2VuLWV4Y2hhbmdlYCBhbGxvd3MgZXhjaGFuZ2luZyBhIHN1YmplY3QgdG9rZW4gZm9yIGFuIE9BdXRoIHRva2VuLiBXaGVuIHVzaW5nIHRoaXMgZ3JhbnQgdHlwZSwgdGhlIGBhdWRpZW5jZWAsIGBzdWJqZWN0X3Rva2VuYCBhbmQgYHN1YmplY3RfdG9rZW5fdHlwZWAgZmllbGRzIGFyZSByZXF1aXJlZC4gVGhlc2UgZ3JhbnRzIGFyZSBkZWZpbmVkIGluIHRoZWlyIHJlc3BlY3RpdmUgUkZDcy4gYHJlZnJlc2hfdG9rZW5gIGFuZCBgY2xpZW50X2NyZWRlbnRpYWxzYCBhcmUgZGVmaW5lZCBpbiBSRkMgNjc0OSBhbmQgYHVybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOnRva2VuLWV4Y2hhbmdlYCBpcyBkZWZpbmVkIGluIFJGQyA4NjkzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT0F1dGhHcmFudFR5cGUge1xuICAgIFJlZnJlc2hUb2tlbiA9ICdyZWZyZXNoX3Rva2VuJyxcbiAgICBVcm5pZXRmcGFyYW1zb2F1dGhncmFudFR5cGV0b2tlbkV4Y2hhbmdlID0gJ3VybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOnRva2VuLWV4Y2hhbmdlJyxcbiAgICBDbGllbnRDcmVkZW50aWFscyA9ICdjbGllbnRfY3JlZGVudGlhbHMnXG59XG5cbi8qKlxuICogT0F1dGggdG9rZW4gaW50cm9zcGVjdCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhJbnRyb3NwZWN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQW4gT0F1dGggdG9rZW4gb2YgYW55IHR5cGUgKGByZWZyZXNoX3Rva2VuYCwgYGFjY2Vzc190b2tlbmAsIGV0YylcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5IGFzIGVpdGhlciBgc2VjcmV0YCBvciBgY2xpZW50X3NlY3JldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhJbnRyb3NwZWN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkgYXMgZWl0aGVyIGBzZWNyZXRgIG9yIGBjbGllbnRfc2VjcmV0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBPQXV0aCB0b2tlbiBpbnRyb3NwZWN0IHJlc3BvbnNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhJbnRyb3NwZWN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gaW5kaWNhdG9yIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBwcmVzZW50ZWQgdG9rZW4gaXMgY3VycmVudGx5IGFjdGl2ZS4gQSBgdHJ1ZWAgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIHRva2VuIGhhcyBiZWVuIGlzc3VlZCwgaGFzIG5vdCBiZWVuIHJldm9rZWQsIGFuZCBpcyB3aXRoaW4gdGhlIHRpbWUgd2luZG93IG9mIHZhbGlkaXR5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHNjb3BlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlbiwgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gW2h0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjc0OSNzZWN0aW9uLTMuM10oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NzQ5I3NlY3Rpb24tMy4zKS4gQ3VycmVudGx5IGFjY2VwdGVkIHZhbHVlcyBhcmU6ICBgdXNlcjpyZWFkYCBhbGxvd3MgcmVhZGluZyB1c2VyIGRhdGEuIGB1c2VyOndyaXRlYCBhbGxvd3Mgd3JpdGluZyB1c2VyIGRhdGEuIGBleGNoYW5nZWAgYWxsb3dzIGV4Y2hhbmdpbmcgYSB0b2tlbiB1c2luZyB0aGUgYHVybjpwbGFpZDpwYXJhbXM6b2F1dGg6dXNlci10b2tlbmAgc3ViamVjdCB0b2tlbiB0eXBlLiBgbWNwOmRhc2hib2FyZGAgYWxsb3dzIGFjY2VzcyB0byB0aGUgTUNQIGRhc2hib2FyZCBzZXJ2ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhJbnRyb3NwZWN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29wZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHBpcmF0aW9uIHRpbWUgYXMgVU5JWCB0aW1lc3RhbXAgc2luY2UgSmFudWFyeSAxIDE5NzAgVVRDXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhJbnRyb3NwZWN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHA/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSXNzdWVkIGF0IHRpbWUgYXMgVU5JWCB0aW1lc3RhbXAgc2luY2UgSmFudWFyeSAxIDE5NzAgVVRDXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhJbnRyb3NwZWN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpYXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3ViamVjdCBvZiB0aGUgdG9rZW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN1Yj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBdWRpZW5jZSBvZiB0aGUgdG9rZW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJc3N1ZXIgb2YgdGhlIHRva2VuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhJbnRyb3NwZWN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgdG9rZW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRva2VuX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVXNlciBJRCBvZiB0aGUgdG9rZW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aEludHJvc3BlY3RSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoSW50cm9zcGVjdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPQXV0aCB0b2tlbiByZXZva2UgcmVxdWVzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPQXV0aFJldm9rZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPQXV0aFJldm9rZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEFuIE9BdXRoIHRva2VuIG9mIGFueSB0eXBlIChgcmVmcmVzaF90b2tlbmAsIGBhY2Nlc3NfdG9rZW5gLCBldGMpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkgYXMgZWl0aGVyIGBzZWNyZXRgIG9yIGBjbGllbnRfc2VjcmV0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5IGFzIGVpdGhlciBgc2VjcmV0YCBvciBgY2xpZW50X3NlY3JldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdWNjZXNzZnVsIE9BdXRoIHRva2VuIHJldm9rZSByZXNwb25zZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPQXV0aFJldm9rZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhSZXZva2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoUmV2b2tlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBzdWJqZWN0IHRva2VuLiBgdXJuOnBsYWlkOnBhcmFtczp0b2tlbnM6dXNlcmAgYWxsb3dzIGV4Y2hhbmdpbmcgYSBQbGFpZC1pc3N1ZWQgdXNlciB0b2tlbiBmb3IgYW4gT0F1dGggdG9rZW4uIFdoZW4gdXNpbmcgdGhpcyB0b2tlbiB0eXBlLCBgYXVkaWVuY2VgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfaWRgLiBgc3ViamVjdF90b2tlbmAgbXVzdCBiZSBhIFBsYWlkLWlzc3VlZCB1c2VyIHRva2VuIGlzc3VlZCBmcm9tIHRoZSBgL3VzZXIvY3JlYXRlYCBlbmRwb2ludC4gYHVybjpwbGFpZDpwYXJhbXM6b2F1dGg6dXNlci10b2tlbmAgYWxsb3dzIGV4Y2hhbmdpbmcgYSByZWZyZXNoIHRva2VuIGZvciBhbiBPQXV0aCB0b2tlbiB0byBhbm90aGVyIGBjbGllbnRfaWRgLiBUaGUgb3RoZXIgYGNsaWVudF9pZGAgaXMgcHJvdmlkZWQgaW4gYGF1ZGllbmNlYC4gYHN1YmplY3RfdG9rZW5gIG11c3QgYmUgYW4gT0F1dGggcmVmcmVzaCB0b2tlbiBpc3N1ZWQgZnJvbSB0aGUgYC9vYXV0aC90b2tlbmAgZW5kcG9pbnQuIGB1cm46cGxhaWQ6cGFyYW1zOmNyZWRpdDptdWx0aS11c2VyYCBhbGxvd3MgZXhjaGFuZ2luZyBhIFBsYWlkLWlzc3VlZCB1c2VyIHRva2VuIGZvciBhbiBPQXV0aCB0b2tlbi4gV2hlbiB1c2luZyB0aGlzIHRva2VuIHR5cGUsIGBhdWRpZW5jZWAgbWF5IGJlIGEgY2xpZW50IGlkIG9yIGEgc3VwcG9ydGVkIENSQSBwYXJ0bmVyIFVSTi4gYGF1ZGllbmNlYCBzdXBwb3J0cyBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGNsaWVudHMuIFdoZW4gbXVsdGlwbGUgY2xpZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBgYXVkaWVuY2VgIGEgbXVsdGktcGFydHkgdG9rZW4gaXMgY3JlYXRlZCB3aGljaCBjYW4gYmUgdXNlZCBieSBhbGwgcGFydGllcyBpbiB0aGUgYXVkaWVuY2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVpciBgY2xpZW50X2lkYCBhbmQgYGNsaWVudF9zZWNyZXRgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT0F1dGhTdWJqZWN0VG9rZW5UeXBlIHtcbiAgICBUb2tlbnN1c2VyID0gJ3VybjpwbGFpZDpwYXJhbXM6dG9rZW5zOnVzZXInLFxuICAgIE9hdXRodXNlclRva2VuID0gJ3VybjpwbGFpZDpwYXJhbXM6b2F1dGg6dXNlci10b2tlbicsXG4gICAgQ3JlZGl0bXVsdGlVc2VyID0gJ3VybjpwbGFpZDpwYXJhbXM6Y3JlZGl0Om11bHRpLXVzZXInXG59XG5cbi8qKlxuICogT0F1dGggdG9rZW4gZ3JhbnQgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT0F1dGhUb2tlblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPQXV0aFRva2VuUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09BdXRoR3JhbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVxdWVzdFxuICAgICAqL1xuICAgIGdyYW50X3R5cGU6IE9BdXRoR3JhbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5IGFzIGVpdGhlciBgc2VjcmV0YCBvciBgY2xpZW50X3NlY3JldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5IGFzIGVpdGhlciBgc2VjcmV0YCBvciBgY2xpZW50X3NlY3JldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBzY29wZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9rZW4sIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGluIFtodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY3NDkjc2VjdGlvbi0zLjNdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjc0OSNzZWN0aW9uLTMuMykuIEN1cnJlbnRseSBhY2NlcHRlZCB2YWx1ZXMgYXJlOiAgYHVzZXI6cmVhZGAgYWxsb3dzIHJlYWRpbmcgdXNlciBkYXRhLiBgdXNlcjp3cml0ZWAgYWxsb3dzIHdyaXRpbmcgdXNlciBkYXRhLiBgZXhjaGFuZ2VgIGFsbG93cyBleGNoYW5naW5nIGEgdG9rZW4gdXNpbmcgdGhlIGB1cm46cGxhaWQ6cGFyYW1zOm9hdXRoOnVzZXItdG9rZW5gIHN1YmplY3QgdG9rZW4gdHlwZS4gYG1jcDpkYXNoYm9hcmRgIGFsbG93cyBhY2Nlc3MgdG8gdGhlIE1DUCBkYXNoYm9hcmQgc2VydmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2NvcGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVmcmVzaCB0b2tlbiBmb3IgT0F1dGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnJlc2hfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJJIG9mIHRoZSB0YXJnZXQgcmVzb3VyY2Ugc2VydmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICByZXNvdXJjZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVc2VkIHdoZW4gZXhjaGFuZ2luZyBhIHRva2VuLiBUaGUgbWVhbmluZyBkZXBlbmRzIG9uIHRoZSBgc3ViamVjdF90b2tlbl90eXBlYDogIC0gRm9yIGB1cm46cGxhaWQ6cGFyYW1zOnRva2Vuczp1c2VyYDogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF9pZGAuIC0gRm9yIGB1cm46cGxhaWQ6cGFyYW1zOm9hdXRoOnVzZXItdG9rZW5gOiBUaGUgb3RoZXIgYGNsaWVudF9pZGAgdG8gZXhjaGFuZ2UgdG9rZW5zIHRvLiAtIEZvciBgdXJuOnBsYWlkOnBhcmFtczpjcmVkaXQ6bXVsdGktdXNlcmA6ICBhIGBjbGllbnRfaWRgIG9yIG9uZSBvZiB0aGUgc3VwcG9ydGVkIENSQSBwYXJ0bmVyIFVSTnM6IGB1cm46cGxhaWQ6cGFyYW1zOmNyYS1wYXJ0bmVyOmV4cGVyaWFuYCwgYHVybjpwbGFpZDpwYXJhbXM6Y3JhLXBhcnRuZXI6ZmFubmllLW1hZWAsIG9yIGB1cm46cGxhaWQ6cGFyYW1zOmNyYS1wYXJ0bmVyOmZyZWRkaWUtbWFjYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGllbmNlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRva2VuIHJlcHJlc2VudGluZyB0aGUgc3ViamVjdC4gVGhlIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgYHN1YmplY3RfdG9rZW5fdHlwZWAuIEZvciBgdXJuOnBsYWlkOnBhcmFtczp0b2tlbnM6dXNlcmAsIHRoZSBgc3ViamVjdF90b2tlbmAgbXVzdCBiZSBhIFBsYWlkLWlzc3VlZCB1c2VyIHRva2VuIGZyb20gdGhlIGAvdXNlci9jcmVhdGVgIGVuZHBvaW50LiBGb3IgYHVybjpwbGFpZDpwYXJhbXM6b2F1dGg6dXNlci10b2tlbmAsIHRoZSBgc3ViamVjdF90b2tlbmAgbXVzdCBiZSBhbiBPQXV0aCByZWZyZXNoIHRva2VuIGlzc3VlZCBmcm9tIHRoZSBgL29hdXRoL3Rva2VuYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVxdWVzdFxuICAgICAqL1xuICAgIHN1YmplY3RfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09BdXRoU3ViamVjdFRva2VuVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlcXVlc3RcbiAgICAgKi9cbiAgICBzdWJqZWN0X3Rva2VuX3R5cGU/OiBPQXV0aFN1YmplY3RUb2tlblR5cGU7XG59XG4vKipcbiAqIE9BdXRoIHRva2VuIGdyYW50IHN1Y2Nlc3MgcmVzcG9uc2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT0F1dGhUb2tlblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhUb2tlblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG9rZW4gZm9yIE9BdXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT0F1dGhUb2tlblJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVmcmVzaCB0b2tlbiBmb3IgT0F1dGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIHRva2VuLiBgQmVhcmVyYCBmb3IgT0F1dGggYWNjZXNzIHRva2Vucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b2tlbl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZSByZW1haW5pbmcgaW4gc2Vjb25kcyBiZWZvcmUgZXhwaXJhdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPQXV0aFRva2VuUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmVzX2luOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9BdXRoVG9rZW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFZhbGlkIHZhbHVlcyBhcmUgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT21pdHRhYmxlVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBvcHRpb24gc2VjdXJpdHkuICBGb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZGF0YSBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgaWYgdGhlIEl0ZW0gaXMgdXNpbmcgYSBbY3VzdG9tIFNhbmRib3ggdXNlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgYW5kIHRoZSBgdGlja2VyYCBmaWVsZCBvZiB0aGUgY3VzdG9tIHNlY3VyaXR5IGZvbGxvd3MgdGhlIFtPQ0MgT3B0aW9uIFN5bWJvbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3B0aW9uX3N5bWJvbCNUaGVfT0NDX09wdGlvbl9TeW1ib2wpIHN0YW5kYXJkIHdpdGggbm8gc3BhY2VzLiBGb3IgYW4gZXhhbXBsZSBvZiBzaW11bGF0aW5nIHRoaXMgaW4gU2FuZGJveCwgc2VlIHRoZSBbY3VzdG9tIFNhbmRib3ggR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vcGxhaWQvc2FuZGJveC1jdXN0b20tdXNlcnMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcHRpb25Db250cmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIG9wdGlvbiBjb250cmFjdC4gSXQgaXMgb25lIG9mOiAgYHB1dGA6IGZvciBQdXQgb3B0aW9uIGNvbnRyYWN0cyAgYGNhbGxgOiBmb3IgQ2FsbCBvcHRpb24gY29udHJhY3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBjb250cmFjdF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpa2UgcHJpY2UgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBwZXIgc2hhcmUgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBzdHJpa2VfcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGlja2VyIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IGZvciB0aGlzIG9wdGlvbiBjb250cmFjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIHVuZGVybHlpbmdfc2VjdXJpdHlfdGlja2VyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGZ1bmRzLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGJ5IGxvY2FsIHJlZ3VsYXRpb24gZm9yIGNlcnRhaW4gYnVzaW5lc3NlcyAoZS5nLiBtb25leSByZW1pdHRhbmNlKSB0byBzZW5kIHBheW91dHMgdG8gcmVjaXBpZW50cyBpbiB0aGUgRVUgYW5kIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb3VyY2Ugb2YgdGhlIGZ1bmRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGZ1bGxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIGZyb20gd2hpY2ggdGhlIGZ1bmRzIGFyZSBzb3VyY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSwgYWxzbyBrbm93biBhcyBTV0lGVCBjb2RlLCBmb3IgdGhpcyBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRpbmdGdW5kU291cmNlXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3JcXCdzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB0cmFuc2ZlciBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeSB7XG4gICAgT25jZVBlck1vbnRoID0gJ29uY2VfcGVyX21vbnRoJyxcbiAgICBUd2ljZVBlck1vbnRoID0gJ3R3aWNlX3Blcl9tb250aCcsXG4gICAgT25jZVBlcldlZWsgPSAnb25jZV9wZXJfd2VlaycsXG4gICAgRGFpbHkgPSAnZGFpbHknXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3Igb3RoZXIgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1vdGhlcikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdGhlckFjY291bnRTdWJ0eXBlIHtcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgb3RoZXJgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3RoZXJGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdGhlckZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIHVudXN1YWxseSBsYXJnZSB0cmFuc2FjdGlvbnMgdGhhdCBleGNlZWQgdHlwaWNhbCBzcGVuZGluZyBwYXR0ZXJucyBmb3IgdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE91dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE91dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgd2hvc2UgdmFsdWUgaXMgYWJvdmUgdGhlIHRocmVzaG9sZCBvZiBub3JtYWwgYW1vdW50cyBmb3IgYSBnaXZlbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE91dGxpZXJUcmFuc2FjdGlvbnNJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Ftb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgT3V0bGllclRyYW5zYWN0aW9uc0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogQW1vdW50V2l0aEN1cnJlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVcCB0byAzIHRvcCBjYXRlZ29yaWVzIG9mIGV4cGVuc2VzIGluIHRoaXMgZ3JvdXAuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5RXhwZW5zZXM+fVxuICAgICAqIEBtZW1iZXJvZiBPdXRsaWVyVHJhbnNhY3Rpb25zSW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3BfY2F0ZWdvcmllcz86IEFycmF5PENhdGVnb3J5RXhwZW5zZXM+O1xufVxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgcGF5cm9sbDpgIFBheXJvbGwgYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIGJlIGNhbGN1bGF0ZWQgZnJvbSBvdGhlciB0ZXN0IGRhdGEgaW4gb3JkZXIgdG8gYWNoaWV2ZSBtb3JlIGNvbnNpc3RlbnQsIHJlYWxpc3RpYyB0ZXN0IGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZUFjY291bnRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3ZlcnJpZGVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHR5cGU6IE92ZXJyaWRlQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIHN0YXJ0IHdpdGggdGhpcyBhbW91bnQgYXMgdGhlIGN1cnJlbnQgYmFsYW5jZS4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBhbHdheXMgaGF2ZSB0aGlzIGFtb3VudCBhcyBpdHMgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS4gQ2Fubm90IGJlIHNldCB0b2dldGhlciB3aXRoIGBoYXNfbnVsbF9hdmFpbGFibGVfYmFsYW5jZWAuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBmb3JjZV9hdmFpbGFibGVfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBhY2NvdW50IHdpbGwgYWx3YXlzIGhhdmUgbnVsbCBhcyBpdHMgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS4gQ2Fubm90IGJlIHNldCB0b2dldGhlciB3aXRoIGBmb3JjZV9hdmFpbGFibGVfYmFsYW5jZWAuIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaGFzX251bGxfYXZhaWxhYmxlX2JhbGFuY2U6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSVNPLTQyMTcgY3VycmVuY3kgY29kZS4gSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgYmUgZGVub21pbmF0ZWQgaW4gdGhlIGdpdmVuIGN1cnJlbmN5LiBUcmFuc2FjdGlvbnMgd2lsbCBhbHNvIGJlIGluIHRoaXMgY3VycmVuY3kgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG1ldGE6IE1ldGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb25PdmVycmlkZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvbGRpbmdzT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBob2xkaW5ncz86IEhvbGRpbmdzT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9ucz86IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpZGVudGl0eTogT3duZXJPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBsaWFiaWxpdHk6IExpYWJpbGl0eU92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmZsb3dNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGluZmxvd19tb2RlbDogSW5mbG93TW9kZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5jb21lPzogSW5jb21lT3ZlcnJpZGU7XG59XG4vKipcbiAqIERhdGEgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gT25seSB0aGUgYG5hbWVzYCBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3duZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lciB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJbiB0aGUgY2FzZSBvZiBhIGpvaW50IGFjY291bnQsIFBsYWlkIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHJlcG9ydCB0aGUgbmFtZXMgb2YgYWxsIGFjY291bnQgaG9sZGVycy4gIElmIGFuIEl0ZW0gY29udGFpbnMgbXVsdGlwbGUgYWNjb3VudHMgd2l0aCBkaWZmZXJlbnQgb3duZXIgbmFtZXMsIHNvbWUgaW5zdGl0dXRpb25zIHdpbGwgcmVwb3J0IGFsbCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaW4gZWFjaCBhY2NvdW50XFwncyBgbmFtZXNgIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8UGhvbmVOdW1iZXI+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEVtYWlsPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PEVtYWlsPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IHRoZSB2YXJpb3VzIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPjtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgb3duZXIgb3Igb3duZXJzIG9mIGFuIGFjY291bnQuIEFueSBmaWVsZHMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGRlZmF1bHQgU2FuZGJveCBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3duZXJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhlc2Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbmFtZXMgb2YgaW5kaXZpZHVhbHMsIGV2ZW4gZm9yIGJ1c2luZXNzIGFjY291bnRzLiBOb3RlIHRoYXQgdGhlIHNhbWUgbmFtZSBkYXRhIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEVtYWlsPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBIb3cgYW4gYXNzZXQgaXMgb3duZWQuICBgYXNzb2NpYXRpb25gOiBPd25lcnNoaXAgYnkgYSBjb3Jwb3JhdGlvbiwgcGFydG5lcnNoaXAsIG9yIHVuaW5jb3Jwb3JhdGVkIGFzc29jaWF0aW9uLCBpbmNsdWRpbmcgZm9yLXByb2ZpdCBhbmQgbm90LWZvci1wcm9maXQgb3JnYW5pemF0aW9ucy4gYGluZGl2aWR1YWxgOiBPd25lcnNoaXAgYnkgYW4gaW5kaXZpZHVhbC4gYGpvaW50YDogSm9pbnQgb3duZXJzaGlwIGJ5IG11bHRpcGxlIHBhcnRpZXMuIGB0cnVzdGA6IE93bmVyc2hpcCBieSBhIHJldm9jYWJsZSBvciBpcnJldm9jYWJsZSB0cnVzdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE93bmVyc2hpcFR5cGUge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgSW5kaXZpZHVhbCA9ICdpbmRpdmlkdWFsJyxcbiAgICBKb2ludCA9ICdqb2ludCcsXG4gICAgQXNzb2NpYXRpb24gPSAnYXNzb2NpYXRpb24nLFxuICAgIFRydXN0ID0gJ3RydXN0J1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGEgcG9zdCBvZmZpY2UgYm94LiBXaWxsIGJlIGB5ZXNgIHdoZW4gYSBQLk8uIGJveCBpcyBkZXRlY3RlZCwgYG5vYCB3aGVuIFBsYWlkIGNvbmZpcm1lZCB0aGUgYWRkcmVzcyBpcyBub3QgYSBQLk8uIGJveCwgYW5kIGBub19kYXRhYCB3aGVuIFBsYWlkIHdhcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIGFkZHJlc3MgaXMgYSBQLk8uIGJveC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBPQm94U3RhdHVzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0dWRlbnRcXCdzIGVsaWdpYmlsaXR5IGluIHRoZSBQdWJsaWMgU2VydmljZSBMb2FuIEZvcmdpdmVuZXNzIHByb2dyYW0uIFRoaXMgaXMgb25seSByZXR1cm5lZCBpZiB0aGUgaW5zdGl0dXRpb24gaXMgRmVkTG9hbiAoYGluc18xMTY1MjdgKS4gU2luY2UgRmVkTG9hbiBubyBsb25nZXIgc2VydmljZXMgc3R1ZGVudCBsb2FucywgdGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmV0dXJuZWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQU0xGU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUFNMRlN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGVzdGltYXRlZCBkYXRlIGJvcnJvd2VyIHdpbGwgaGF2ZSBjb21wbGV0ZWQgMTIwIHF1YWxpZnlpbmcgbW9udGhseSBwYXltZW50cy4gUmV0dXJuZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgZXN0aW1hdGVkX2VsaWdpYmlsaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUFNMRlN0YXR1c1xuICAgICAqL1xuICAgIHBheW1lbnRzX21hZGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHJlbWFpbmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfcmVtYWluaW5nOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlZmluZSBzcGVjaWZpYyBwYXJ0aWVzIHRvIGEgZGVhbC4gVGhpcyBpbmNsdWRlcyB0aGUgZGlyZWN0IHBhcnRpY2lwYXRpbmcgcGFydGllcywgc3VjaCBhcyBib3Jyb3dlciBhbmQgc2VsbGVyIGFuZCB0aGUgaW5kaXJlY3QgcGFydGllcyBzdWNoIGFzIHRoZSBjcmVkaXQgcmVwb3J0IHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGllcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydGllc1xuICAgICAqL1xuICAgIFBBUlRZOiBBcnJheTxQYXJ0eT47XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIgYmVpbmcgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgZW5kIGN1c3RvbWVyIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIEl0IHdpbGwgbm90IGJlIHNob3duIHRvIGVuZCB1c2Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFydG5lciBoYXMgY29tcGxldGVkIGF0dGVzdGF0aW9uIG9mIGRpbGlnZW5jZSBmb3IgdGhlIGVuZCBjdXN0b21lciB0byBiZSBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfZGlsaWdlbmNlX2F0dGVzdGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9kdWN0cyB0byBiZSBlbmFibGVkIGZvciB0aGUgZW5kIGN1c3RvbWVyLiBJZiBlbXB0eSBvciBgbnVsbGAsIHRoaXMgZmllbGQgd2lsbCBkZWZhdWx0IHRvIHRoZSBwcm9kdWN0cyBlbmFibGVkIGZvciB0aGUgcmVzZWxsZXIgYXQgdGhlIHRpbWUgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhlIGVuZCBjdXN0b21lclxcJ3MgZGVmYXVsdCBMaW5rIGN1c3RvbWl6YXRpb24gd2lsbCBiZSBzZXQgdG8gbWF0Y2ggdGhlIHBhcnRuZXJcXCdzLiBZb3UgY2FuIGFsd2F5cyBjaGFuZ2UgdGhlIGVuZCBjdXN0b21lclxcJ3MgTGluayBjdXN0b21pemF0aW9uIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFNlZSB0aGUgW0xpbmsgQ3VzdG9taXphdGlvbiBkb2NzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvY3VzdG9taXphdGlvbi8pIGZvciBtb3JlIGluZm9ybWF0aW9uLiBJZiB5b3UgcmVxdWlyZSB0aGUgYWJpbGl0eSB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBlbmQgY3VzdG9tZXJzIHVzaW5nIG11bHRpcGxlIGRpZmZlcmVudCBMaW5rIGN1c3RvbWl6YXRpb24gcHJvZmlsZXMsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIgZm9yIGFzc2lzdGFuY2UuICBJbXBvcnRhbnQ6IERhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZyAoRFRNKSB1c2UgY2FzZXMgd2lsbCBub3QgYmUgY29waWVkIHRvIHRoZSBlbmQgY3VzdG9tZXJcXCdzIExpbmsgY3VzdG9taXphdGlvbiB1bmxlc3MgdGhlICoqUHVibGlzaCBjaGFuZ2VzKiogYnV0dG9uIGlzIGNsaWNrZWQgYWZ0ZXIgdGhlIHVzZSBjYXNlcyBhcmUgYXBwbGllZC4gTGluayB3aWxsIG5vdCB3b3JrIGluIFByb2R1Y3Rpb24gdW5sZXNzIHRoZSBlbmQgY3VzdG9tZXJcXCdzIERUTSB1c2UgY2FzZXMgYXJlIGNvbmZpZ3VyZWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8pLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQmFzZTY0LWVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVuZCBjdXN0b21lclxcJ3MgbG9nby4gTXVzdCBiZSBhIFBORyBvZiBzaXplIDEwMjR4MTAyNCB1bmRlciA0TUIuIFRoZSBsb2dvIHdpbGwgYmUgc2hhcmVkIHdpdGggZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgc2hvd24gdG8gdGhlIGVuZCB1c2VyIGR1cmluZyBMaW5rIGZsb3dzLiBBIGxvZ28gaXMgcmVxdWlyZWQgaWYgYGNyZWF0ZV9saW5rX2N1c3RvbWl6YXRpb25gIGlzIGB0cnVlYC4gSWYgYGNyZWF0ZV9saW5rX2N1c3RvbWl6YXRpb25gIGlzIGBmYWxzZWAgYW5kIHRoZSBsb2dvIGlzIG9taXR0ZWQsIHRoZSBwYXJ0bmVyXFwncyBsb2dvIHdpbGwgYmUgdXNlZCBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2UgYSBzdG9jayBsb2dvIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbG9nbz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBsZWdhbCBuYW1lLiBUaGlzIHdpbGwgYmUgc2hhcmVkIHdpdGggZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhcyBwYXJ0IG9mIHRoZSBPQXV0aCByZWdpc3RyYXRpb24gcHJvY2Vzcy4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWdhbF9lbnRpdHlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHdlYnNpdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbi4gVGhpcyB3aWxsIGJlIHNob3duIHRvIGVuZCB1c2VycyB3aGVuIHRoZXkgZ28gdGhyb3VnaCB0aGUgUGxhaWQgTGluayBmbG93LiBUaGUgYXBwbGljYXRpb24gbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbmQgY2Fubm90IG1hdGNoIHRoZSBuYW1lIG9mIGFub3RoZXIgYXBwbGljYXRpb24gYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggUGxhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlY2huaWNhbF9jb250YWN0PzogUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3R9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiaWxsaW5nX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbWVyX3N1cHBvcnRfaW5mbz86IFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm87XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciB0aGUgcGFydG5lciBoYXMgZm9yd2FyZGVkIHRoZSBQbGFpZCBiYW5rIGFkZGVuZHVtIHRvIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19iYW5rX2FkZGVuZHVtX2NvbXBsZXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRzX3VuZGVyX21hbmFnZW1lbnQ/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFVSSXMgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24ocykgd2hlcmUgYSB1c2VyIGNhbiBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciBhbm90aGVyIGFwcC4gVVJJcyBzaG91bGQgbm90IGNvbnRhaW4gYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFdoZW4gdXNlZCBpbiBQcm9kdWN0aW9uLCBVUklzIG11c3QgdXNlIGh0dHBzLiBUbyBtb2RpZnkgcmVkaXJlY3QgVVJJcyBmb3IgYW4gZW5kIGN1c3RvbWVyIGFmdGVyIGNyZWF0aW5nIHRoZW0sIGdvIHRvIHRoZSBlbmQgY3VzdG9tZXJcXCdzIFtBUEkgcGFnZV0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKSBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIGEgZmluYW5jaWFsIGluc3RpdHV0aW9uIGJ5IHJlZ3VsYXRvcnkgYXV0aG9yaXRpZXMsIGlmIGFwcGxpY2FibGUuIEZvciBiYW5rcywgdGhpcyBpcyB0aGUgRkRJQyBDZXJ0aWZpY2F0ZSBOdW1iZXIuIEZvciBjcmVkaXQgdW5pb25zLCB0aGlzIGlzIHRoZSBDcmVkaXQgVW5pb24gQ2hhcnRlciBOdW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZ2lzdHJhdGlvbl9udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uX3NlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lcn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBQYXJ0bmVyRW5kQ3VzdG9tZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmbG93ZG93bl9zdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJGbG93ZG93blN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHF1ZXN0aW9ubmFpcmVfc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgT0F1dGggaW5zdGl0dXRpb25zIHdpdGggd2hpY2ggdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24gaXMgYmVpbmcgcmVnaXN0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM/OiBBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9pZGAgb2YgdGhlIGVuZCBjdXN0b21lciB0byBiZSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciBhbiBlbmQgY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbn1cbi8qKlxuICogVGhlIGVuZCBjdXN0b21lclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldHMgdW5kZXIgbWFuYWdlbWVudCBmb3IgdGhlIGdpdmVuIGVuZCBjdXN0b21lci4gUmVxdWlyZWQgZm9yIGVuZCBjdXN0b21lcnMgd2l0aCBtb250aGx5IHNlcnZpY2UgY29tbWl0bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGJhbmsgYWRkZW5kdW0gYWNjZXB0YW5jZSBmb3IgdGhlIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQmFua0FkZGVuZHVtQWNjZXB0YW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJhbmtBZGRlbmR1bUFjY2VwdGFuY2Uge1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciB0aGUgZW5kIGN1c3RvbWVyIGhhcyBhY2NlcHRlZCB0aGUgYmFuayBhZGRlbmR1bSB0ZXJtcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmFua0FkZGVuZHVtQWNjZXB0YW5jZVxuICAgICAqL1xuICAgIGN1c3RvbWVyX2FjY2VwdGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZW5kIGN1c3RvbWVyIHdoZW4gdGhleSBhY2NlcHRlZCB0aGUgYmFuayBhZGRlbmR1bS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCYW5rQWRkZW5kdW1BY2NlcHRhbmNlXG4gICAgICovXG4gICAgY3VzdG9tZXJfaXBfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHdoZW4gdGhlIGVuZCBjdXN0b21lciBhY2NlcHRlZCB0aGUgYmFuayBhZGRlbmR1bSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJhbmtBZGRlbmR1bUFjY2VwdGFuY2VcbiAgICAgKi9cbiAgICBjdXN0b21lcl9hZ3JlZW1lbnRfdGltZXN0YW1wPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYmlsbGluZyBjb250YWN0IGZvciB0aGUgZW5kIGN1c3RvbWVyLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyBiaWxsaW5nIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gICAgICovXG4gICAgZmFtaWx5X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbn1cbi8qKlxuICogQSBtYXAgb2YgcGVybWlzc2libGUgcHVycG9zZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB1c2UgY2FzZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXNcbiAgICAgKi9cbiAgICBXUklUVEVOX0lOU1RSVUNUSU9OPzogUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFQdXJwb3Nlc1xuICAgICAqL1xuICAgIEVYVEVOU0lPTl9PRl9DUkVESVRfT1JfQUNDT1VOVF9SRVZJRVc/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzXG4gICAgICovXG4gICAgRU1QTE9ZTUVOVD86IFBhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXNcbiAgICAgKi9cbiAgICBJTlNVUkFOQ0VfVU5ERVJXUklUSU5HPzogUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFQdXJwb3Nlc1xuICAgICAqL1xuICAgIExJQ0VOU0VfRUxJR0lCSUxJVFk/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzXG4gICAgICovXG4gICAgUklTS19BU1NFU1NNRU5UPzogUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFQdXJwb3Nlc1xuICAgICAqL1xuICAgIEJVU0lORVNTX05FRURfVFJBTlNBQ1RJT04/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFVc2VDYXNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzXG4gICAgICovXG4gICAgQlVTSU5FU1NfTkVFRF9BQ0NPVU5UX1JFVklFVz86IFBhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzO1xufVxuLyoqXG4gKiBUaGUgQ1JBIHF1ZXN0aW9ubmFpcmUgZm9yIHRoZSBlbmQgY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckNSQVF1ZXN0aW9ubmFpcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDUkFRdWVzdGlvbm5haXJlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ1JBUHVycG9zZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVF1ZXN0aW9ubmFpcmVcbiAgICAgKi9cbiAgICBwdXJwb3Nlcz86IFBhcnRuZXJFbmRDdXN0b21lckNSQVB1cnBvc2VzO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciB0aGUgdGhpcmQgcGFydHkgaXMgaW52b2x2ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVF1ZXN0aW9ubmFpcmVcbiAgICAgKi9cbiAgICBpc190aGlyZF9wYXJ0eV9pbnZvbHZlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSB0ZWNobmljYWwgc2VydmljZSBwcm92aWRlciBpcyBpbnZvbHZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ1JBUXVlc3Rpb25uYWlyZVxuICAgICAqL1xuICAgIGlzX3RlY2huaWNhbF9zZXJ2aWNlX3Byb3ZpZGVyX2ludm9sdmVkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQSBDUkEgdXNlIGNhc2UgdW5kZXIgYSBwZXJtaXNzaWJsZSBwdXJwb3NlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZSB7XG4gICAgQ3JlZGl0VW5kZXJ3cml0aW5nID0gJ0NSRURJVF9VTkRFUldSSVRJTkcnLFxuICAgIFRlbmFudFNjcmVlbmluZyA9ICdURU5BTlRfU0NSRUVOSU5HJyxcbiAgICBJbnZlc3Rvck9yU2VydmljZXJPZkNyZWRpdCA9ICdJTlZFU1RPUl9PUl9TRVJWSUNFUl9PRl9DUkVESVQnLFxuICAgIFV0aWxpdGllcyA9ICdVVElMSVRJRVMnLFxuICAgIEJhbmtBY2NvdW50T3BlbmluZyA9ICdCQU5LX0FDQ09VTlRfT1BFTklORycsXG4gICAgSWRlbnRpdHlWZXJpZmljYXRpb25GcmF1ZFByZXZlbnRpb24gPSAnSURFTlRJVFlfVkVSSUZJQ0FUSU9OX0ZSQVVEX1BSRVZFTlRJT04nLFxuICAgIENvbGxlY3Rpb25zRGVidFJlY292ZXJ5ID0gJ0NPTExFQ1RJT05TX0RFQlRfUkVDT1ZFUlknXG59XG5cbi8qKlxuICogVGhlIGxpc3Qgb2YgdXNlIGNhc2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHBlcm1pc3NpYmxlIHB1cnBvc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZXMge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgdXNlIGNhc2VzIGZvciB0aGUgZ2l2ZW4gcGVybWlzc2libGUgcHVycG9zZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZT59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckNSQVVzZUNhc2VzXG4gICAgICovXG4gICAgdXNlX2Nhc2VzPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyQ1JBVXNlQ2FzZT47XG59XG4vKipcbiAqIFRoaXMgaW5mb3JtYXRpb24gaXMgcHVibGljLiBVc2VycyBvZiB5b3VyIGFwcCB3aWxsIHNlZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gbWFuYWdpbmcgY29ubmVjdGlvbnMgYmV0d2VlbiB5b3VyIGFwcCBhbmQgdGhlaXIgYmFuayBhY2NvdW50cyBpbiBQbGFpZCBQb3J0YWwuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGN1c3RvbWVyIHN1cHBvcnQgaW5mbyBpZiBvbWl0dGVkLiBUaGlzIGZpZWxkIGlzIG1hbmRhdG9yeSBmb3IgcGFydG5lcnMgd2hvc2UgUGxhaWQgYWNjb3VudHMgd2VyZSBjcmVhdGVkIGFmdGVyIE5vdmVtYmVyIDI2LCAyMDI0IGFuZCB3aWxsIGJlIG1hbmRhdG9yeSBmb3IgYWxsIHBhcnRuZXJzIGJ5IHRoZSAxMDMzIGNvbXBsaWFuY2UgZGVhZGxpbmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIG1hbmRhdG9yeSBmb3IgcGFydG5lcnMgd2hvc2UgUGxhaWQgYWNjb3VudHMgd2VyZSBjcmVhdGVkIGFmdGVyIE5vdmVtYmVyIDI2LCAyMDI0IGFuZCB3aWxsIGJlIG1hbmRhdG9yeSBmb3IgYWxsIHBhcnRuZXJzIGJ5IHRoZSAxMDMzIGNvbXBsaWFuY2UgZGVhZGxpbmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGNvbnRhY3RfdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBsaW5rX3VwZGF0ZV91cmw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGFkZGVuZHVtIHRvIHRoZSBQbGFpZCBNU0EgKFxcXCJmbG93ZG93blxcXCIpIGZvciB0aGUgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIEluUmV2aWV3ID0gJ0lOX1JFVklFVycsXG4gICAgTmVnb3RpYXRpb24gPSAnTkVHT1RJQVRJT04nLFxuICAgIENvbXBsZXRlID0gJ0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRoZSBPQXV0aCByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgZW52aXJvbm1lbnRzPzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50cztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbiB3YXMgYXBwcm92ZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlaXIgYXBwbGljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBhcHByb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9lbmFibGVtZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIG5vbi1PQXV0aCBJdGVtIGFkZHMgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGZvciB0aGlzIGluc3RpdHV0aW9uLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gc3VjaCBkYXRlIGhhcyBiZWVuIHNldCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGNsYXNzaWNfZGlzYWJsZW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSByZWdpc3RlcmluZyB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbiB3aXRoIHRoZSBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PFBsYWlkRXJyb3I+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgZXJyb3JzPzogQXJyYXk8UGxhaWRFcnJvcj47XG59XG4vKipcbiAqIFRoZSByZWdpc3RyYXRpb24gc3RhdHVzIGZvciB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cyB7XG4gICAgTm90U3RhcnRlZCA9ICdOT1RfU1RBUlRFRCcsXG4gICAgUHJvY2Vzc2luZyA9ICdQUk9DRVNTSU5HJyxcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRW5hYmxlZCA9ICdFTkFCTEVEJyxcbiAgICBBdHRlbnRpb25SZXF1aXJlZCA9ICdBVFRFTlRJT05fUkVRVUlSRUQnXG59XG5cbi8qKlxuICogUmVnaXN0cmF0aW9uIHN0YXR1c2VzIGJ5IGVudmlyb25tZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICAgICAqL1xuICAgIGRldmVsb3BtZW50PzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uPzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgT0F1dGggc3RhdHVzIG9mIHRoZSB1cGRhdGVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFZhbHVlcyB7XG4gICAgTm90U3RhcnRlZCA9ICdub3Qtc3RhcnRlZCcsXG4gICAgUHJvY2Vzc2luZyA9ICdwcm9jZXNzaW5nJyxcbiAgICBBcHByb3ZlZCA9ICdhcHByb3ZlZCcsXG4gICAgRW5hYmxlZCA9ICdlbmFibGVkJyxcbiAgICBBdHRlbnRpb25SZXF1aXJlZCA9ICdhdHRlbnRpb24tcmVxdWlyZWQnXG59XG5cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgUEFSVE5FUmAgYW5kIGNvZGUgYEVORF9DVVNUT01FUl9PQVVUSF9TVEFUVVNfVVBEQVRFRGAgd2lsbCBiZSBmaXJlZCB3aGVuIGEgcGFydG5lclxcJ3MgZW5kIGN1c3RvbWVyIGhhcyBhbiB1cGRhdGUgb24gdGhlaXIgT0F1dGggcmVnaXN0cmF0aW9uIHN0YXR1cyB3aXRoIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFBBUlRORVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFTkRfQ1VTVE9NRVJfT0FVVEhfU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9uIElEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9uIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBzZWN1cml0eSBxdWVzdGlvbm5haXJlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZVN0YXR1cyB7XG4gICAgTm90U3RhcnRlZCA9ICdOT1RfU1RBUlRFRCcsXG4gICAgUmVjZWl2ZWQgPSAnUkVDRUlWRUQnLFxuICAgIENvbXBsZXRlID0gJ0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRoZSBxdWVzdGlvbm5haXJlcyBmb3IgdGhlIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckNSQVF1ZXN0aW9ubmFpcmV9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVzXG4gICAgICovXG4gICAgY3JhPzogUGFydG5lckVuZEN1c3RvbWVyQ1JBUXVlc3Rpb25uYWlyZTtcbn1cbi8qKlxuICogQSBmaWVsZCB0aGF0IG1heSBiZSByZXF1aXJlZCB0byBiZSBzdWJtaXR0ZWQgZm9yIGVuYWJsZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJSZXF1aXJlbWVudER1ZSB7XG4gICAgTGVnYWxFbnRpdHlOYW1lID0gJ2xlZ2FsX2VudGl0eV9uYW1lJyxcbiAgICBXZWJzaXRlID0gJ3dlYnNpdGUnLFxuICAgIEFwcGxpY2F0aW9uTmFtZSA9ICdhcHBsaWNhdGlvbl9uYW1lJyxcbiAgICBJc0RpbGlnZW5jZUF0dGVzdGVkID0gJ2lzX2RpbGlnZW5jZV9hdHRlc3RlZCcsXG4gICAgVGVjaG5pY2FsQ29udGFjdCA9ICd0ZWNobmljYWxfY29udGFjdCcsXG4gICAgQmlsbGluZ0NvbnRhY3QgPSAnYmlsbGluZ19jb250YWN0JyxcbiAgICBBZGRyZXNzID0gJ2FkZHJlc3MnLFxuICAgIEJhbmtBZGRlbmR1bUFjY2VwdGFuY2UgPSAnYmFua19hZGRlbmR1bV9hY2NlcHRhbmNlJyxcbiAgICBRdWVzdGlvbm5haXJlc0NyYSA9ICdxdWVzdGlvbm5haXJlcy5jcmEnXG59XG5cbi8qKlxuICogVGhlIHNlY3JldHMgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHNcbiAgICAgKi9cbiAgICBzYW5kYm94Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gVGhlIERldmVsb3BtZW50IGVudmlyb25tZW50IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGV2ZWxvcG1lbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIFRoZSBlbmQgY3VzdG9tZXIgd2lsbCBiZSBwcm92aWRlZCB3aXRoIGEgbGltaXRlZCBudW1iZXIgb2YgY3JlZGl0cyB0byB0ZXN0IGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IGJlZm9yZSBmdWxsIGVuYWJsZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqL1xuICAgIHByb2R1Y3Rpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIGVuZCBjdXN0b21lci4gIGBVTkRFUl9SRVZJRVdgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGVuYWJsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFRoZSBlbmQgY3VzdG9tZXIgbXVzdCBiZSBtYW51YWxseSByZXZpZXdlZCBieSB0aGUgUGxhaWQgdGVhbSBiZWZvcmUgaXQgY2FuIGJlIGVuYWJsZWQgaW4gUHJvZHVjdGlvbiwgYXQgd2hpY2ggcG9pbnQgaXRzIHN0YXR1cyB3aWxsIGF1dG9tYXRpY2FsbHkgdHJhbnNpdGlvbiB0byBgUEVORElOR19FTkFCTEVNRU5UYCBvciBgREVOSUVEYC4gIGBQRU5ESU5HX0VOQUJMRU1FTlRgOiBUaGUgZW5kIGN1c3RvbWVyIGlzIHJlYWR5IHRvIGJlIGZ1bGx5IGVuYWJsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIENhbGwgdGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IHRvIGVuYWJsZSB0aGUgZW5kIGN1c3RvbWVyIGluIGZ1bGwgUHJvZHVjdGlvbi4gIGBBQ1RJVkVgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGZ1bGx5IGVuYWJsZWQgaW4gYWxsIGVudmlyb25tZW50cy4gIGBERU5JRURgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGVuYWJsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ1dCBpdCBkaWQgbm90IHBhc3MgcmV2aWV3IGJ5IHRoZSBQbGFpZCB0ZWFtIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGVuYWJsZWQgZm9yIFByb2R1Y3Rpb24gYWNjZXNzLiBUYWxrIHRvIHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyU3RhdHVzIHtcbiAgICBVbmRlclJldmlldyA9ICdVTkRFUl9SRVZJRVcnLFxuICAgIFBlbmRpbmdFbmFibGVtZW50ID0gJ1BFTkRJTkdfRU5BQkxFTUVOVCcsXG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgRGVuaWVkID0gJ0RFTklFRCcsXG4gICAgTW9yZUluZm9ybWF0aW9uTmVlZGVkID0gJ01PUkVfSU5GT1JNQVRJT05fTkVFREVEJ1xufVxuXG4vKipcbiAqIFRoZSB0ZWNobmljYWwgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgdGVjaG5pY2FsIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbmQgY3VzdG9tZXIsIGluY2x1ZGluZyBzZWNyZXRzIGZvciBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgc2VjcmV0cz86IFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHM7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBhcnR5IHRvIGEgdHJhbnNhY3Rpb24uIEluY2x1ZGVzIGRpcmVjdCBwYXJ0aWNpcGFudHMgbGlrZSB0aGUgYm9ycm93ZXIgYW5kIHNlbGxlciBhcyB3ZWxsIGFzIGluZGlyZWN0IHBhcnRpY2lwYW50cyBzdWNoIGFzIHRoZSBmbG9vZCBjZXJ0aWZpY2F0ZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5SW5kaXZpZHVhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIFJPTEVTOiBSb2xlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogSW5kaXZpZHVhbE5hbWU7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIGRlZmluZWQgbGlzdCB0aGF0IGlkZW50aWZpZXMgdGhlIHJvbGUgdGhhdCB0aGUgcGFydHkgcGxheXMgaW4gdGhlIHRyYW5zYWN0aW9uLiBQYXJ0aWVzIG1heSBiZSBlaXRoZXIgYSBwZXJzb24gb3IgbGVnYWwgZW50aXR5LiBBIHBhcnR5IG1heSBwbGF5IG11bHRpcGxlIHJvbGVzIGluIGEgdHJhbnNhY3Rpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0eVJvbGVUeXBlIHtcbiAgICBCb3Jyb3dlciA9ICdCb3Jyb3dlcidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbW9uZXRhcnkgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXkge1xuICAgIC8qKlxuICAgICAqIEEgbnVtZXJpY2FsIGFtb3VudCBvZiBhIHNwZWNpZmljIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3VycmVuY3kgY29kZSwgZS5nLiBVU0RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheUZyZXF1ZW5jeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheUZyZXF1ZW5jeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeVZhbHVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2YWx1ZTogUGF5RnJlcXVlbmN5VmFsdWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5RnJlcXVlbmN5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5RnJlcXVlbmN5VmFsdWUge1xuICAgIE1vbnRobHkgPSAnbW9udGhseScsXG4gICAgU2VtaW1vbnRobHkgPSAnc2VtaW1vbnRobHknLFxuICAgIFdlZWtseSA9ICd3ZWVrbHknLFxuICAgIEJpd2Vla2x5ID0gJ2Jpd2Vla2x5JyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5UGVyaW9kRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGNoZWNrX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duPzogQXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBlbmQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5X2RheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kge1xuICAgIFBheUZyZXF1ZW5jeVVua25vd24gPSAnUEFZX0ZSRVFVRU5DWV9VTktOT1dOJyxcbiAgICBQYXlGcmVxdWVuY3lXZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9XRUVLTFknLFxuICAgIFBheUZyZXF1ZW5jeUJpd2Vla2x5ID0gJ1BBWV9GUkVRVUVOQ1lfQklXRUVLTFknLFxuICAgIFBheUZyZXF1ZW5jeVNlbWltb250aGx5ID0gJ1BBWV9GUkVRVUVOQ1lfU0VNSU1PTlRITFknLFxuICAgIFBheUZyZXF1ZW5jeU1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9NT05USExZJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdG90YWwgZGVkdWN0aW9ucyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBob3VycyBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIb3VybHkgcmF0ZSBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGFuIGVhcm5pbmcgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzVG90YWwge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiB0aGUgZWFybmluZ3MgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBob3VycyB3b3JrZWQgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGhvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViUGF5UGVyaW9kRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBlbmRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgZWFybmluZ3MgYmVmb3JlIHRheC9kZWR1Y3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViUGF5QmFzaXNUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9iYXNpcz86IENyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheSBwZXJpb2Qgc3RhcnRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUYXhwYXllciBJRCBvZiB0aGUgaW5kaXZpZHVhbCByZWNlaXZpbmcgdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YlRheHBheWVySUQge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgSUQsIGUuZy4gXFwnU1NOXFwnLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBtYXNrOyBpLmUuIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHRheHBheWVyIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfbWFzazogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50XG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC4gTWluaW11bSBhY2NlcHRlZCB2YWx1ZSBpcyBgMWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwYXltZW50LiBGb3Igc3RhbmRpbmcgb3JkZXJzIGFuZCBwYXltZW50IGNvbnNlbnRzLCBgXFxcIkdCUFxcXCJgIG11c3QgYmUgdXNlZC4gRm9yIFBvbGFuZCwgRGVubWFyaywgU3dlZGVuIGFuZCBOb3J3YXksIG9ubHkgdGhlIGxvY2FsIGN1cnJlbmN5IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50QW1vdW50Q3VycmVuY3kge1xuICAgIEdicCA9ICdHQlAnLFxuICAgIEV1ciA9ICdFVVInLFxuICAgIFBsbiA9ICdQTE4nLFxuICAgIFNlayA9ICdTRUsnLFxuICAgIERrayA9ICdES0snLFxuICAgIE5vayA9ICdOT0snXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50TnVsbGFibGVcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFJlZnVuZGVkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50VG9SZWZ1bmQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRDaGFubmVsIHtcbiAgICBPbmxpbmUgPSAnb25saW5lJyxcbiAgICBJblN0b3JlID0gJ2luIHN0b3JlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGFtb3VudCBvZiBhIHNpbmdsZSBwYXltZW50IGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFdoZXJlIHRoZSBwYXltZW50IGNvbnNlbnQgcGVyaW9kIHNob3VsZCBzdGFydC4gIElmIHRoZSBpbnN0aXR1dGlvbiBpcyBNb256bywgb25seSBgQ09OU0VOVGAgYWxpZ25tZW50cyBhcmUgc3VwcG9ydGVkLiAgYENBTEVOREFSYDogbGluZSB1cCB3aXRoIGEgY2FsZW5kYXIuICBgQ09OU0VOVGA6IG9uIHRoZSBkYXRlIG9mIGNvbnNlbnQgY3JlYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50IHtcbiAgICBDYWxlbmRhciA9ICdDQUxFTkRBUicsXG4gICAgQ29uc2VudCA9ICdDT05TRU5UJ1xufVxuXG4vKipcbiAqIERlZmluZXMgY29uc2VudCBwYXltZW50cyBsaW1pdGF0aW9ucyBwZXIgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50UGVyaW9kaWNJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50UGVyaW9kaWNBbGlnbm1lbnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBhbGlnbm1lbnQ6IFBheW1lbnRDb25zZW50UGVyaW9kaWNBbGlnbm1lbnQ7XG59XG4vKipcbiAqIE1heGltdW0gY3VtdWxhdGl2ZSBhbW91bnQgZm9yIGFsbCBwYXltZW50cyBpbiB0aGUgc3BlY2lmaWVkIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBQYXltZW50IGNvbnNlbnQgcGVyaW9kaWMgaW50ZXJ2YWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWwge1xuICAgIERheSA9ICdEQVknLFxuICAgIFdlZWsgPSAnV0VFSycsXG4gICAgTW9udGggPSAnTU9OVEgnLFxuICAgIFllYXIgPSAnWUVBUidcbn1cblxuLyoqXG4gKiBMaWZlIHNwYW4gZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIEFmdGVyIHRoZSBgdG9gIGRhdGUgdGhlIHBheW1lbnQgY29uc2VudCBleHBpcmVzIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBmcm9tIHdoaWNoIHRoZSBjb25zZW50IHNob3VsZCBiZSBhY3RpdmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWVcbiAgICAgKi9cbiAgICBmcm9tPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgY29uc2VudCBleHBpcmVzLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gICAgICovXG4gICAgdG8/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgb3B0aW9uYWwgYWRkcmVzcyBvZiB0aGUgcGF5bWVudCByZWNpcGllbnRcXCdzIGJhbmsgYWNjb3VudC4gUmVxdWlyZWQgYnkgbW9zdCBpbnN0aXR1dGlvbnMgb3V0c2lkZSBvZiB0aGUgVUsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgbGVuZ3RoIDEtMiByZXByZXNlbnRpbmcgdGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiA3MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDM1IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgMTYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIENvbnNlbnQgY3JlYXRpb24gdGltZXN0YW1wLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQsIHVzZSB0aGUgXFwndHlwZVxcJyBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2NvcGVzPzogQXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICB0eXBlPzogUGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgcGF5ZXJfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBMaW1pdGF0aW9ucyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBwYXltZW50cyBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50VmFsaWREYXRlVGltZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICB2YWxpZF9kYXRlX3RpbWU/OiBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgbWF4X3BheW1lbnRfYW1vdW50OiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFtb3VudCBsaW1pdGF0aW9ucyBwZXIgcGVyaW9kIG9mIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIHBlcmlvZGljX2Ftb3VudHM6IEFycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+O1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci4gVGhlIGNyZWF0ZWQgY29uc2VudCBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciBmdW5kcyB0byB0aGlzIHJlY2lwaWVudCBvbmx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCBjb25zZW50IHNjb3Blcy5cbiAgICAgKiBAdHlwZSB7U2V0PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2NvcGVzPzogU2V0PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5ZXJfZGV0YWlscz86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlscyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY29uc2VudF9pZGAgcmV0dXJuZWQgZnJvbSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQsIHVzZSB0aGUgXFwndHlwZVxcJyBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzY29wZXM/OiBBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5ZXJfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGF5bWVudCBjb25zZW50IHBheWVyIGRldGFpbHMuIFBheWVyIGBuYW1lYCBhbmQgYWNjb3VudCBgbnVtYmVyc2AgYXJlIHJlcXVpcmVkIHRvIGxvY2sgdGhlIGFjY291bnQgdG8gd2hpY2ggdGhlIGNvbnNlbnQgY2FuIGJlIGNyZWF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheWVyIGFzIGl0IGFwcGVhcnMgaW4gdGhlaXIgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICAgICAqL1xuICAgIG51bWJlcnM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXJcXCdzIGJpcnRoZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXJcXCdzIHBob25lIG51bWJlcnMgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9XG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXllclxcJ3MgZW1haWxzXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICAgICAqL1xuICAgIGVtYWlscz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRoZSBwYXllclxcJ3MgYmFuayBhY2NvdW50IG51bWJlcnMuIEV4YWN0bHkgb25lIG9mIElCQU4gb3IgQmFjcyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNJQkFOTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICAgICAqL1xuICAgIGliYW4/OiBOdW1iZXJzSUJBTk51bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGNvbnNlbnQgcGF5bWVudC4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gSWYgYSByZXF1ZXN0IHRvIGV4ZWN1dGUgYSBjb25zZW50IHBheW1lbnQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcGF5bWVudCBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSBwYXltZW50IHRoYXQgdXNlcyB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXksIGFuZCB3YXMgcmVjZWl2ZWQgd2l0aGluIDQ4IGhvdXJzIG9mIHRoZSBmaXJzdCByZXF1ZXN0LCBmcm9tIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgKHNpbmNlIG5vdCBhbGwgaW5zdGl0dXRpb25zIHN1cHBvcnQgdGhlbSkuIElmIG5vdCBwcm92aWRlZCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGZhbGwgYmFjayB0byB0aGUgcmVmZXJlbmNlIGZyb20gY29uc2VudC4gSW4gb3JkZXIgdG8gdHJhY2sgc2V0dGxlbWVudCB2aWEgUGF5bWVudCBDb25maXJtYXRpb24sIGVhY2ggcGF5bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIHRocm91Z2ggdGhlIEFQSSBpcyBub3QgdW5pcXVlLCBQbGFpZCB3aWxsIGFkanVzdCBpdC4gU29tZSBpbnN0aXR1dGlvbnMgbWF5IGxpbWl0IHRoZSByZWZlcmVuY2UgdG8gbGVzcyB0aGFuIDE4IGNoYXJhY3RlcnMuIElmIG5lY2Vzc2FyeSwgUGxhaWQgd2lsbCBhZGp1c3QgdGhlIHJlZmVyZW5jZSBieSB0cnVuY2F0aW5nIGl0IHRvIGZpdCB0aGUgaW5zdGl0dXRpb25cXCdzIHJlcXVpcmVtZW50cy4gQm90aCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBhbmQgYXV0b21hdGljYWxseSBhZGp1c3RlZCByZWZlcmVuY2VzIChpZiBhbnkpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYHJlZmVyZW5jZWAgYW5kIGBhZGp1c3RlZF9yZWZlcmVuY2VgIGZpZWxkcywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlICYgc3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3BlPzogUGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUgJiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzaW5nX21vZGU/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQcm9jZXNzaW5nTW9kZTtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIERlY2lkZXMgdGhlIG1vZGUgdW5kZXIgd2hpY2ggdGhlIHBheW1lbnQgcHJvY2Vzc2luZyBzaG91bGQgYmUgcGVyZm9ybWVkLCB1c2luZyBgSU1NRURJQVRFYCBhcyBkZWZhdWx0LiAgYElNTUVESUFURWA6IFdpbGwgaW1tZWRpYXRlbHkgZXhlY3V0ZSB0aGUgcGF5bWVudCwgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBBU1BTUCBiZWZvcmUgcmV0dXJuaW5nIHRoZSByZXN1bHQgb2YgdGhlIHBheW1lbnQgaW5pdGlhdGlvbi4gVGhpcyBpcyBpZGVhbCBmb3IgdXNlci1wcmVzZW50IGZsb3dzLiAgIGBBU1lOQ2A6IFdpbGwgYWNjZXB0IGEgcGF5bWVudCBleGVjdXRpb24gcmVxdWVzdCBhbmQgc2NoZWR1bGUgaXQgZm9yIHByb2Nlc3NpbmcsIGltbWVkaWF0ZWx5IHJldHVybmluZyB0aGUgbmV3IGBwYXltZW50X2lkYC4gTGlzdGVuIGZvciB3ZWJob29rcyB0byBvYnRhaW4gcmVhbC10aW1lIHVwZGF0ZXMgb24gdGhlIHBheW1lbnQgc3RhdHVzLiBUaGlzIGlzIGlkZWFsIGZvciBub24gdXNlci1wcmVzZW50IGZsb3dzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50UHJvY2Vzc2luZ01vZGUge1xuICAgIEFzeW5jID0gJ0FTWU5DJyxcbiAgICBJbW1lZGlhdGUgPSAnSU1NRURJQVRFJ1xufVxuXG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgY29uc2VudCBgdHlwZWAgZmllbGQuIENvbnNlbnRzIGFyZSByZXF1aXJlZCB0byBoYXZlIGEgc2luZ2xlIHR5cGUuICBQYXltZW50IGNvbnNlbnQgc2NvcGUuIERlZmluZXMgcG9zc2libGUgZGlyZWN0aW9ucyBmb3IgcGF5bWVudHMgbWFkZSB3aXRoIHRoZSBnaXZlbiBjb25zZW50LiAgYE1FX1RPX01FYDogQWxsb3dzIG1vdmluZyBtb25leSBiZXR3ZWVuIGFjY291bnRzIG93bmVkIGJ5IHRoZSBzYW1lIHVzZXIuICBgRVhURVJOQUxgOiBBbGxvd3MgaW5pdGlhdGluZyBwYXltZW50cyBmcm9tIHRoZSB1c2VyXFwncyBhY2NvdW50IHRvIHRoaXJkIHBhcnRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZSB7XG4gICAgTWVUb01lID0gJ01FX1RPX01FJyxcbiAgICBFeHRlcm5hbCA9ICdFWFRFUk5BTCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBwYXltZW50IGNvbnNlbnQuICBgVU5BVVRIT1JJU0VEYDogQ29uc2VudCBjcmVhdGVkLCBidXQgcmVxdWlyZXMgdXNlciBhdXRob3Jpc2F0aW9uLiAgYFJFSkVDVEVEYDogQ29uc2VudCBhdXRob3Jpc2F0aW9uIHdhcyByZWplY3RlZCBieSB0aGUgYmFuay4gIGBBVVRIT1JJU0VEYDogQ29uc2VudCBpcyBhY3RpdmUgYW5kIHJlYWR5IHRvIGJlIHVzZWQuICBgUkVWT0tFRGA6IENvbnNlbnQgaGFzIGJlZW4gcmV2b2tlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiAgYEVYUElSRURgOiBDb25zZW50IGlzIG5vIGxvbmdlciB2YWxpZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cyB7XG4gICAgVW5hdXRob3Jpc2VkID0gJ1VOQVVUSE9SSVNFRCcsXG4gICAgQXV0aG9yaXNlZCA9ICdBVVRIT1JJU0VEJyxcbiAgICBSZXZva2VkID0gJ1JFVk9LRUQnLFxuICAgIFJlamVjdGVkID0gJ1JFSkVDVEVEJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfSU5JVElBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYENPTlNFTlRfU1RBVFVTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgZm9yIHRoZSBjb25zZW50IGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHR5cGUuIERlZmluZXMgcG9zc2libGUgdXNlIGNhc2UgZm9yIHBheW1lbnRzIG1hZGUgd2l0aCB0aGUgZ2l2ZW4gY29uc2VudC4gIGBTV0VFUElOR2A6IEFsbG93cyBtb3ZpbmcgbW9uZXkgYmV0d2VlbiBhY2NvdW50cyBvd25lZCBieSB0aGUgc2FtZSB1c2VyLiAgYENPTU1FUkNJQUxgOiBBbGxvd3MgaW5pdGlhdGluZyBwYXltZW50cyBmcm9tIHRoZSB1c2VyXFwncyBhY2NvdW50IHRvIHRoaXJkIHBhcnRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRUeXBlIHtcbiAgICBTd2VlcGluZyA9ICdTV0VFUElORycsXG4gICAgQ29tbWVyY2lhbCA9ICdDT01NRVJDSUFMJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIHRoYXQgY2FwdHVyZXMgd2hhdCBzcGVjaWZpYyBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFuIGluc3RpdHV0aW9uIHN1cHBvcnRzIHdoZW4gbWFraW5nIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBwYXltZW50cyBmcm9tIGEgZGlmZmVyZW50IGNvdW50cnkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19pbnRlcm5hdGlvbmFsX3BheW1lbnRzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBTRVBBIEluc3RhbnQgcGF5bWVudHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19zZXBhX2luc3RhbnQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBtYXBwaW5nIG9mIGN1cnJlbmN5IHRvIG1heGltdW0gcGF5bWVudCBhbW91bnQgKGRlbm9taW5hdGVkIGluIHRoZSBzbWFsbGVzdCB1bml0IG9mIGN1cnJlbmN5KSBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgRXhhbXBsZTogYHtcXFwiR0JQXFxcIjogXFxcIjEwMDAwXFxcIn1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIG1heGltdW1fcGF5bWVudF9hbW91bnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyByZXR1cm5pbmcgcmVmdW5kIGRldGFpbHMgd2hlbiBpbml0aWF0aW5nIGEgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3JlZnVuZF9kZXRhaWxzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YW5kaW5nX29yZGVyX21ldGFkYXRhOiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnQgY29uc2VudHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19wYXltZW50X2NvbnNlbnRzOiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdXNlZCB0byByZXN0cmljdCB0aGUgYWNjb3VudHMgdXNlZCBmb3IgcGF5bWVudHMuIElmIHByb3ZpZGVkLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVNPIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmVmdW5kIElEcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBJRCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgd2hlbiBhIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB2aXJ0dWFsIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIGJ5IFBsYWlkIHRvIGVhY2ggcGF5bWVudCBmb3IgdHJhY2tpbmcgYW5kIHJlY29uY2lsaWF0aW9uIHB1cnBvc2VzLiAgTm90ZTogTm90IGFsbCBiYW5rcyBoYW5kbGUgYGVuZF90b19lbmRfaWRgIGNvbnNpc3RlbnRseS4gVG8gZW5zdXJlIGFjY3VyYXRlIG1hdGNoaW5nLCBjbGllbnRzIHNob3VsZCBjb252ZXJ0IGJvdGggdGhlIGluY29taW5nIGBlbmRfdG9fZW5kX2lkYCBhbmQgdGhlIG9uZSBwcm92aWRlZCBieSBQbGFpZCB0byB0aGUgc2FtZSBjYXNlIChlaXRoZXIgbG93ZXIgb3IgdXBwZXIpIGJlZm9yZSBjb21wYXJpc29uLiBGb3IgdmlydHVhbCBhY2NvdW50IHBheW1lbnRzLCBQbGFpZCBtYW5hZ2VzIHRoaXMgZmllbGQgYXV0b21hdGljYWxseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBlbmRfdG9fZW5kX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgKHNpbmNlIG5vdCBhbGwgaW5zdGl0dXRpb25zIHN1cHBvcnQgdGhlbSkuIEluIG9yZGVyIHRvIHRyYWNrIHNldHRsZW1lbnQgdmlhIFBheW1lbnQgQ29uZmlybWF0aW9uLCBlYWNoIHBheW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIHJlZmVyZW5jZS4gSWYgdGhlIHJlZmVyZW5jZSBwcm92aWRlZCB0aHJvdWdoIHRoZSBBUEkgaXMgbm90IHVuaXF1ZSwgUGxhaWQgd2lsbCBhZGp1c3QgaXQuIFNvbWUgaW5zdGl0dXRpb25zIG1heSBsaW1pdCB0aGUgcmVmZXJlbmNlIHRvIGxlc3MgdGhhbiAxOCBjaGFyYWN0ZXJzLiBJZiBuZWNlc3NhcnksIFBsYWlkIHdpbGwgYWRqdXN0IHRoZSByZWZlcmVuY2UgYnkgdHJ1bmNhdGluZyBpdCB0byBmaXQgdGhlIGluc3RpdHV0aW9uXFwncyByZXF1aXJlbWVudHMuIEJvdGggdGhlIG9yaWdpbmFsbHkgcHJvdmlkZWQgYW5kIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgcmVmZXJlbmNlcyAoaWYgYW55KSBjYW4gYmUgZm91bmQgaW4gdGhlIGByZWZlcmVuY2VgIGFuZCBgYWRqdXN0ZWRfcmVmZXJlbmNlYCBmaWVsZHMsIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGb3IgYSBwYXltZW50IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQsIHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIHZhbHVlOiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoZSBpbml0aWFsIHBoYXNlIG9mIHRoZSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVTdGF0dXMge1xuICAgIFBheW1lbnRTdGF0dXNJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJU08gODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX3VwZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFjczogU2VuZGVyQkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHNlbmRlciwgaWYgc3BlY2lmaWVkIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmVmdW5kIElEcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50UmVmdW5kZWR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X3JlZnVuZGVkPzogUGF5bWVudEFtb3VudFJlZnVuZGVkO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIHdhbGxldCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFkanVzdGVkX3NjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IGNvbnNlbnQgSUQgdGhhdCB0aGlzIHBheW1lbnQgd2FzIGluaXRpYXRlZCB3aXRoLiBJcyBwcmVzZW50IG9ubHkgd2hlbiBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBJRCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgd2hlbiBhIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB2aXJ0dWFsIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgUGxhaWQgdG8gZWFjaCBwYXltZW50IGZvciB0cmFja2luZyBhbmQgcmVjb25jaWxpYXRpb24gcHVycG9zZXMuICBOb3RlOiBOb3QgYWxsIGJhbmtzIGhhbmRsZSBgZW5kX3RvX2VuZF9pZGAgY29uc2lzdGVudGx5LiBUbyBlbnN1cmUgYWNjdXJhdGUgbWF0Y2hpbmcsIGNsaWVudHMgc2hvdWxkIGNvbnZlcnQgYm90aCB0aGUgaW5jb21pbmcgYGVuZF90b19lbmRfaWRgIGFuZCB0aGUgb25lIHByb3ZpZGVkIGJ5IFBsYWlkIHRvIHRoZSBzYW1lIGNhc2UgKGVpdGhlciBsb3dlciBvciB1cHBlcikgYmVmb3JlIGNvbXBhcmlzb24uIEZvciB2aXJ0dWFsIGFjY291bnQgcGF5bWVudHMsIFBsYWlkIG1hbmFnZXMgdGhpcyBmaWVsZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX3RvX2VuZF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXltZW50cyB0byByZXR1cm4uIElmIGBjb3VudGAgaXMgbm90IHNwZWNpZmllZCwgYSBtYXhpbXVtIG9mIDEwIHBheW1lbnRzIHdpbGwgYmUgcmV0dXJuZWQsIGJlZ2lubmluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBwYXltZW50IGJlZm9yZSB0aGUgY3Vyc29yIChpZiBzcGVjaWZpZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBcXFwiMjAxOS0xMi0wNlQyMjozNTo0OVpcXFwiKS4gT25seSBwYXltZW50cyBjcmVhdGVkIGJlZm9yZSB0aGUgY3Vyc29yIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELiBJZiBzcGVjaWZpZWQsIG9ubHkgcGF5bWVudHMsIGV4ZWN1dGVkIHVzaW5nIHRoaXMgY29uc2VudCwgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgY2xpZW50X2lkYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudHM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uUGF5bWVudD47XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIHRoYXQsIHdoZW4gdXNlZCBhcyB0aGUgb3B0aW9uYWwgYGN1cnNvcmAgcGFyYW1ldGVyIHRvIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAsIHdpbGwgcmV0dXJuIHRoZSBuZXh0IHVucmV0dXJuZWQgcGF5bWVudCBhcyBpdHMgZmlyc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdG8gcmV2ZXJzZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHdhbGxldCB0cmFuc2FjdGlvbi4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gSWYgYSByZXF1ZXN0IHRvIGV4ZWN1dGUgYSB3YWxsZXQgdHJhbnNhY3Rpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB0aGVuIGFmdGVyIGEgbWluaW11bSBkZWxheSBvZiBvbmUgbWludXRlLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgd2FsbGV0IHRyYW5zYWN0aW9uIGlzIGNyZWF0ZWQuIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBpdCB3aWxsIHByZXZlbnQgYW55IHRyYW5zYWN0aW9uIHRoYXQgdXNlcyB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXksIGFuZCB3YXMgcmVjZWl2ZWQgd2l0aGluIDI0IGhvdXJzIG9mIHRoZSBmaXJzdCByZXF1ZXN0LCBmcm9tIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcmVmdW5kLiBUaGlzIG11c3QgYmUgYW4gYWxwaGFudW1lcmljIHN0cmluZyB3aXRoIDYgdG8gMTggY2hhcmFjdGVycyBhbmQgbXVzdCBub3QgY29udGFpbiBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50VG9SZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50PzogUGF5bWVudEFtb3VudFRvUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHlcXCdzIGJpcnRoZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eV9kYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eV9hZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZWZ1bmRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudC4gIENvcmUgbGlmZWN5Y2xlIHN0YXR1c2VzOiAgKipgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYCoqOiBUcmFuc2l0aW9uYWwuIFRoZSBwYXltZW50IGlzIGF3YWl0aW5nIHVzZXIgaW5wdXQgdG8gY29udGludWUgcHJvY2Vzc2luZy4gSXQgbWF5IHJlLWVudGVyIHRoaXMgc3RhdGUgaWYgYWRkaXRpb25hbCBpbnB1dCBpcyByZXF1aXJlZC4gICoqYFBBWU1FTlRfU1RBVFVTX0FVVEhPUklTSU5HYDoqKiBUcmFuc2l0aW9uYWwuIFRoZSBwYXltZW50IGlzIGJlaW5nIGF1dGhvcmlzZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSXQgd2lsbCBhdXRvbWF0aWNhbGx5IG1vdmUgb24gb25jZSBhdXRob3Jpc2F0aW9uIGNvbXBsZXRlcy4gICoqYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGA6KiogVGhlIHBheW1lbnQgaGFzIGJlZW4gYXV0aG9yaXNlZCBhbmQgYWNjZXB0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSW4gbWFueSBFVSBtYXJrZXRzLCBgUEFZTUVOVF9TVEFUVVNfRVhFQ1VURURgIGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCBhIHBheW1lbnQgd2lsbCByZW1haW4gaW4gYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGAgdW50aWwgdGhlIGZ1bmRzIHNldHRsZSwgbWFraW5nIHRoaXMgYSB0ZXJtaW5hbCBzdWNjZXNzIHN0YXRlIGluIHRob3NlIGNhc2VzLiBBIHBheW1lbnQgaW4gYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHBheW1lbnQ7IGRvIG5vdCBnYXRlIGRvd25zdHJlYW0gcHJvY2Vzc2luZyBvbiByZWFjaGluZyBgUEFZTUVOVF9TVEFUVVNfRVhFQ1VURURgLiBGb3IgYSBmdWxsIGV4cGxhbmF0aW9uIG9mIHBheW1lbnQgc3RhdHVzZXMgYW5kIGhvdyB0byBoYW5kbGUgZWFjaCwgc2VlIHRoZSBbUGF5bWVudCBTdGF0dXMgZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcGF5bWVudC1pbml0aWF0aW9uL3BheW1lbnQtc3RhdHVzLykuICAqKmBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGA6IFRlcm1pbmFsLioqIFRoZSBmdW5kcyBoYXZlIGxlZnQgdGhlIHBheWVyXFwncyBhY2NvdW50IGFuZCB0aGUgcGF5bWVudCBpcyBlbiByb3V0ZSB0byBzZXR0bGVtZW50LiBOb3RlIHRoYXQgdGhpcyBzdGF0dXMgZG9lcyBub3QgY29uZmlybSB0aGF0IGZ1bmRzIGhhdmUgYXJyaXZlZCBpbiB0aGUgcmVjaXBpZW50XFwncyBhY2NvdW50OyBkbyBub3QgdXNlIGl0IGFzIHByb29mIG9mIGZ1bmQgcmVjZWlwdC4gU3VwcG9ydCBpcyBtb3JlIGNvbW1vbiBpbiB0aGUgVUsgdGhhbiBpbiB0aGUgRVU7IHdoZXJlIHVuc3VwcG9ydGVkLCBhIHN1Y2Nlc3NmdWwgcGF5bWVudCByZW1haW5zIGluIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgIGJlZm9yZSBzZXR0bGluZy4gV2hlbiB1c2luZyBQbGFpZCBWaXJ0dWFsIEFjY291bnRzLCBgUEFZTUVOVF9TVEFUVVNfRVhFQ1VURURgIGlzIG5vdCB0ZXJtaW5hbCAtLSB0aGUgcGF5bWVudCB3aWxsIGNvbnRpbnVlIHRvIGBQQVlNRU5UX1NUQVRVU19TRVRUTEVEYCBvbmNlIGZ1bmRzIGFyZSBhdmFpbGFibGUuICAqKmBQQVlNRU5UX1NUQVRVU19TRVRUTEVEYDogVGVybWluYWwuKiogVGhlIGZ1bmRzIGFyZSBhdmFpbGFibGUgaW4gdGhlIHJlY2lwaWVudFxcJ3MgYWNjb3VudC4gT25seSBhdmFpbGFibGUgdG8gY3VzdG9tZXJzIHVzaW5nIFtQbGFpZCBWaXJ0dWFsIEFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3BheW1lbnQtaW5pdGlhdGlvbi92aXJ0dWFsLWFjY291bnRzLykuICBGYWlsdXJlIHN0YXR1c2VzOiAgKipgUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTYDogVGVybWluYWwuKiogVGhlIHBheW1lbnQgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuIE5vIGZ1cnRoZXIgcmV0cmllcyB3aWxsIHN1Y2NlZWQgdW50aWwgdGhlIHBheWVyXFwncyBiYWxhbmNlIGlzIHJlcGxlbmlzaGVkLiAgKipgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYDogVGVybWluYWwgKHJldHJ5YWJsZSkuKiogVGhlIHBheW1lbnQgY291bGQgbm90IGJlIGluaXRpYXRlZCBkdWUgdG8gYSBzeXN0ZW0gZXJyb3Igb3Igb3V0YWdlLiBSZXRyeSBvbmNlIHRoZSByb290IGNhdXNlIGlzIHJlc29sdmVkLiAgKipgUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRGA6IFRlcm1pbmFsIChyZXRyeWFibGUpLioqIFRoZSBwYXltZW50IHdhcyBibG9ja2VkIGJ5IFBsYWlkIChlLmcuLCBmbGFnZ2VkIGFzIHJpc2t5KS4gUmVzb2x2ZSBhbnkgY29tcGxpYW5jZSBvciByaXNrIGlzc3VlcyBhbmQgcmV0cnkuICAqKmBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGA6IFRlcm1pbmFsLioqIFRoZSBwYXltZW50IHdhcyByZWplY3RlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBObyBhdXRvbWF0aWMgcmV0cnkgaXMgcG9zc2libGUuICAqKmBQQVlNRU5UX1NUQVRVU19DQU5DRUxMRURgOiBUZXJtaW5hbC4qKiBUaGUgZW5kIHVzZXIgY2FuY2VsbGVkIHRoZSBwYXltZW50IGR1cmluZyBhdXRob3Jpc2F0aW9uLiAgU3RhbmRpbmctb3JkZXIgc3RhdHVzZXM6ICAqKmBQQVlNRU5UX1NUQVRVU19FU1RBQkxJU0hFRGA6IFRlcm1pbmFsLioqIEEgcmVjdXJyaW5nL3N0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiAgRGVwcmVjYXRlZCAodG8gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlKTogIGBQQVlNRU5UX1NUQVRVU19VTktOT1dOYDogVGhlIHBheW1lbnQgc3RhdHVzIGlzIHVua25vd24uICBgUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuICBgUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cyB7XG4gICAgSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTklUSUFURUQnLFxuICAgIENvbXBsZXRlZCA9ICdQQVlNRU5UX1NUQVRVU19DT01QTEVURUQnLFxuICAgIEluc3VmZmljaWVudEZ1bmRzID0gJ1BBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EUycsXG4gICAgRmFpbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0ZBSUxFRCcsXG4gICAgQmxvY2tlZCA9ICdQQVlNRU5UX1NUQVRVU19CTE9DS0VEJyxcbiAgICBVbmtub3duID0gJ1BBWU1FTlRfU1RBVFVTX1VOS05PV04nLFxuICAgIEV4ZWN1dGVkID0gJ1BBWU1FTlRfU1RBVFVTX0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1BBWU1FTlRfU1RBVFVTX1NFVFRMRUQnLFxuICAgIEF1dGhvcmlzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX0FVVEhPUklTSU5HJyxcbiAgICBDYW5jZWxsZWQgPSAnUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEJyxcbiAgICBFc3RhYmxpc2hlZCA9ICdQQVlNRU5UX1NUQVRVU19FU1RBQkxJU0hFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfUkVKRUNURUQnXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcmV0dXJuZWQgZnJvbSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGBwYXltZW50X3Rva2VuYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIHRoZSBwYXltZW50IGluaXRpYXRpb24gZmxvd1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIHRva2VuIHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuIEEgYHBheW1lbnRfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgMTUgbWludXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF90b2tlbl9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiByZWNpcGllbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVjaXBpZW50LiBXZSByZWNvbW1lbmQgdXNpbmcgc3RyaW5ncyBvZiBsZW5ndGggMTggb3IgbGVzcyBhbmQgYXZvaWQgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggYWxsIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuIElmIEJhY3MgZGF0YSBpcyBub3QgcHJvdmlkZWQsIGFuIElCQU4gaXMgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY2lwaWVudHMgdG8gcmV0dXJuLiBJZiBgY291bnRgIGlzIG5vdCBzcGVjaWZpZWQsIGEgbWF4aW11bSBvZiAxMDAgcmVjaXBpZW50cyB3aWxsIGJlIHJldHVybmVkLCBiZWdpbm5pbmcgd2l0aCB0aGUgcmVjaXBpZW50IGF0IHRoZSBjdXJzb3IgKGlmIHNwZWNpZmllZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHJlY2lwaWVudCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UuIFNldCB0aGlzIGZyb20gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIHRoZSByZXNwb25zZSB3aWxsIG9ubHkgY29udGFpbiB0aGF0IHJlY2lwaWVudCBhbmQgcmVjaXBpZW50cyBjcmVhdGVkIGJlZm9yZSBpdC4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiByZWNpcGllbnRzIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCByZWNpcGllbnRzIGNyZWF0ZWQgZm9yIFBheW1lbnQgSW5pdGlhdGlvblxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhhdCwgd2hlbiB1c2VkIGFzIHRoZSBvcHRpb25hbCBgY3Vyc29yYCBwYXJhbWV0ZXIgdG8gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgLCB3aWxsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZWNpcGllbnQgYXMgaXRzIGZpcnN0IHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yPzogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB2YWxpZCBQYXltZW50IEluaXRpYXRpb24gc3RhbmRpbmcgb3JkZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIGNsb3NlZC1lbmRlZCBzdGFuZGluZyBvcmRlcnMgYnkgcHJvdmlkaW5nIGFuIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX2VuZF9kYXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGBNT05USExZYCBzdGFuZGluZyBvcmRlcnMuIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBuZWdhdGl2ZSBpbnRlZ2VycyAoLTEgdG8gLTUpIGZvciBzZXR0aW5nIHVwIGEgYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX25lZ2F0aXZlX2V4ZWN1dGlvbl9kYXlzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgdmFsaWQgc3RhbmRpbmcgb3JkZXIgaW50ZXJ2YWxzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICB2YWxpZF9zdGFuZGluZ19vcmRlcl9pbnRlcnZhbHM6IEFycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gaW50ZXItYmFuayB0cmFuc2ZlcnMuIElmIHRoZSB0cmFuc2FjdGlvbiB3YXMgbm90IGFuIGludGVyLWJhbmsgdHJhbnNmZXIsIGFsbCBmaWVsZHMgd2lsbCBiZSBgbnVsbGAuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoZSBgcGF5bWVudF9tZXRhYCBrZXkgd2lsbCBhbHdheXMgYXBwZWFyLCBidXQgbm8gZGF0YSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50TWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRNZXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIG51bWJlciBzdXBwbGllZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVmZXJlbmNlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIFBQRCBJRCBmb3IgdGhlIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcHBkX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHJlY2VpdmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydHkgaW5pdGlhdGluZyBhIHdpcmUgdHJhbnNmZXIuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgYSB3aXJlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgYnlfb3JkZXJfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHRyYW5zZmVycywgdGhlIHBhcnR5IHRoYXQgaXMgcGF5aW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLCBlLmcuIFxcJ0FDSFxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheW1lbnQgcHJvY2Vzc29yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2Nlc3Nvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyB1cGRhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGNyZWF0ZWQgYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgZGVsZXRlZCBhdC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgUGF5bWVudCBQcm9maWxlIGhhcyBub3QgYmVlbiBkZWxldGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRlbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRQcm9maWxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50UHJvZmlsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSBkYXRhIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gIGBSRUFEWWA6IFRoaXMgUGF5bWVudCBQcm9maWxlIGlzIHJlYWR5IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLiAgYFBFTkRJTkdgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBpcyBub3QgcmVhZHkgdG8gYmUgdXNlZC4gWW91XFwnbGwgbmVlZCB0byBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQgdG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLiAgYFJFTU9WRURgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBoYXMgYmVlbiByZW1vdmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFByb2ZpbGVTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAnUEVORElORycsXG4gICAgUmVhZHkgPSAnUkVBRFknLFxuICAgIFJlbW92ZWQgPSAnUkVNT1ZFRCdcbn1cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGludGVydmFsIG9mIHRoZSBwYXltZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWwge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBQYXltZW50IHNjaGVtZS4gSWYgbm90IHNwZWNpZmllZCAtIHRoZSBkZWZhdWx0IGluIHRoZSByZWdpb24gd2lsbCBiZSB1c2VkIChlLmcuIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmAgZm9yIEVVKS4gSW4gcmVzcG9uc2VzLCBpZiB0aGUgc2NoZW1lIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC4gVXNpbmcgdW5zdXBwb3J0ZWQgdmFsdWVzIHdpbGwgcmVzdWx0IGluIGEgZmFpbGVkIHBheW1lbnQuICBgTE9DQUxfREVGQVVMVGA6IFRoZSBkZWZhdWx0IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQuICBgTE9DQUxfSU5TVEFOVGA6IFRoZSBpbnN0YW50IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQgKGlmIGFwcGxpY2FibGUpLiBGZWVzIG1heSBiZSBhcHBsaWVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gTWF5IGludm9sdmUgYWRkaXRpb25hbCBmZWVzIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSBhdCBzb21lIGJhbmtzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBMb2NhbERlZmF1bHQgPSAnTE9DQUxfREVGQVVMVCcsXG4gICAgTG9jYWxJbnN0YW50ID0gJ0xPQ0FMX0lOU1RBTlQnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgaGFzIGNoYW5nZWQuIEZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2YgcGF5bWVudCBzdGF0dXNlcyBhbmQgaG93IHRvIGhhbmRsZSBlYWNoLCBzZWUgdGhlIFtQYXltZW50IFN0YXR1cyBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9wYXltZW50LWluaXRpYXRpb24vcGF5bWVudC1zdGF0dXMvKS4gIE5vdGU6IEZvciBzdGFuZGFyZCBQYXltZW50IEluaXRpYXRpb24sIFBsYWlkIHBheW1lbnQgc3RhdHVzZXMgZG8gbm90IGNvbnN0aXR1dGUgcHJvb2YgdGhhdCBmdW5kcyBoYXZlIGFycml2ZWQgaW4gdGhlIHJlY2lwaWVudFxcJ3MgYWNjb3VudCwgYW5kIHlvdSBzaG91bGQgbm90IHVzZSBgbmV3X3BheW1lbnRfc3RhdHVzYCB0byBjb25maXJtIGZ1bmQgc2V0dGxlbWVudC4gRm9yIG9wdGlvbnMgdGhhdCBwcm92aWRlIGNvbmZpcm1hdGlvbiBvZiBmdW5kIHJlY2VpcHQsIHNlZSBbVmlydHVhbCBBY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9wYXltZW50LWluaXRpYXRpb24vdmlydHVhbC1hY2NvdW50cy9wYXltZW50LWNvbmZpcm1hdGlvbi8pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfU1RBVFVTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgZm9yIHRoZSBwYXltZW50IGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19wYXltZW50X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb2xkX3BheW1lbnRfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugd2hlbiBjcmVhdGluZyB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmFsX3JlZmVyZW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYHN0YXJ0X2RhdGVgIHByb3ZpZGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgYSBzdGFuZGluZyBvcmRlci4gSWYgdGhlIHBheW1lbnQgaXMgbm90IGEgc3RhbmRpbmcgb3JkZXIsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIG9yIGlmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWNjb3VudCBsZXZlbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGEge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEluY29tZVJhdGVPZlBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcmF0ZV9vZl9wYXk6IFBheXJvbGxJbmNvbWVSYXRlT2ZQYXk7XG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBwYXlyb2xsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheSBzdHVicyBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFBheVN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgcGF5X3N0dWJzOiBBcnJheTxDcmVkaXRQYXlTdHViPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSBXLTJzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRXMj59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICB3MnM6IEFycmF5PENyZWRpdFcyPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSAxMDk5cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0MTA5OT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBmb3JtMTA5OXM6IEFycmF5PENyZWRpdDEwOTk+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIEZvcm0gSS0yMCBVUyBpbW1pZ3JhdGlvbiBzdHVkZW50IGRvY3VtZW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0STIwPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIGkyMHM6IEFycmF5PENyZWRpdEkyMD47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJhdGUgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEluY29tZVJhdGVPZlBheSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdGUgYXQgd2hpY2ggYW4gZW1wbG95ZWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gICAgICovXG4gICAgcGF5X3JhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgYXQgd2hpY2ggYW4gZW1wbG95ZWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gICAgICovXG4gICAgcGF5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXlyb2xsIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZU9iamVjdD59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU6IEFycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIHBheXJvbGwgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSXRlbVN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB0aGUgcHJvY2Vzc2luZyBzdGF0dXMgZm9yIHRoZSB2ZXJpZmljYXRpb24uICBgVU5LTk9XTmA6IFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIHVzZXIgaGFzIGFwcHJvdmVkIGZvciBzaGFyaW5nLiBUaGUgZGF0YSBpcyBhdmFpbGFibGUgdG8gYmUgcmV0cmlldmVkLiAgYFBST0NFU1NJTkdgOiBUaGUgdmVyaWZpY2F0aW9uIGlzIHN0aWxsIHByb2Nlc3NpbmcuIFRoZSBkYXRhIGlzIG5vdCBhdmFpbGFibGUgeWV0LiAgYEZBSUxFRGA6IFRoZSBwcm9jZXNzaW5nIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuICBgQVBQUk9WQUxfU1RBVFVTX1BFTkRJTkdgOiBUaGUgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkIGJ1dCB0aGUgdXNlciBoYXMgbm90IHlldCBhcHByb3ZlZCB0aGUgc2hhcmluZyBvZiB0aGUgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHByb2Nlc3Npbmdfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZnJhdWQgcmlzayBkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIEl0ZW0gbGlua2VkIGFzIHBhcnQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaW5jb21lIGRvY3VtZW50IGF1dGhlbnRpY2l0eSBkYXRhIHJldHJpZXZlZCBmb3IgZWFjaCBvZiB0aGUgdXNlclxcJ3MgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3Jpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdD47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM6IERlZHVjdGlvbnM7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRvY19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVhcm5pbmdzOiBFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBQYXlzdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X2RldGFpbHM/OiBFbXBsb3ltZW50RGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgbmV0X3BheTogTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlQZXJpb2REZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5c3R1Yl9kZXRhaWxzPzogUGF5c3R1YkRldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZUJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV9icmVha2Rvd24/OiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViWVRERGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX2Vhcm5pbmdzPzogUGF5c3R1YllURERldGFpbHM7XG59XG4vKipcbiAqIEFkZHJlc3Mgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN0YXRlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWR1Y3Rpb24gb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBkZWR1Y3Rpb24sIGFzIHByb3ZpZGVkIG9uIHRoZSBwYXlzdHViLiBGb3IgZXhhbXBsZTogYFxcXCI0MDEoaylcXFwiYCwgYFxcXCJGSUNBIE1FRCBUQVhcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGRlZHVjdGlvbiBpcyBwcmUtdGF4OyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIGlzX3ByZXRheDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkZXRhaWxzIHRoYXQgY2FuIGJlIGZvdW5kIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBCZWdpbm5pbmcgZGF0ZSBvZiB0aGUgcGF5IHBlcmlvZCBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX3N0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZGluZyBkYXRlIG9mIHRoZSBwYXkgcGVyaW9kIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBheSBkYXRlIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciB0aGF0IGdlbmVyYXRlZCB0aGUgcGF5c3R1YiwgZS5nLiBBRFBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheXN0dWJfcHJvdmlkZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlzdHViUGF5RnJlcXVlbmN5IHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5c3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGF0YSBmcm9tIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbXBsb3llZT86IFBheXN0dWJPdmVycmlkZUVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV9icmVha2Rvd24/OiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVOZXRQYXl9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIG5ldF9wYXk/OiBQYXlzdHViT3ZlcnJpZGVOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZURlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM/OiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZWFybmluZ3M/OiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzPzogUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlscztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBicmVha2Rvd24/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw/OiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbCB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgdG90YWwgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50cyB0aGF0IHRoZSBwYXltZW50IHdhcyBkaXN0cmlidXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYmFua19uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXlzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsPzogUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWwge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBob3VycyB3b3JrZWQgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3Vycz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgZm9yIHRoZSB0b3RhbCBlYXJuaW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGVtcGxveWVlIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYHNpbmdsZWAgb3IgYG1hcnJpZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkPzogUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBvZiB0aGUgZW1wbG95ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDUgZGlnaXQgcG9zdGFsIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50cnkgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZU5ldFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZU5ldFBheSB7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5XG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd24/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwYXlfZGF5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBzdGFydCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRheHBheWVyIElEIG9mIHRoZSBpbmRpdmlkdWFsIHJlY2VpdmluZyB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVRheHBheWVySUQge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgSUQsIGUuZy4gXFwnU1NOXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG1hc2s7IGkuZS4gbGFzdCA0IGRpZ2l0cyBvZiB0aGUgdGF4cGF5ZXIgSURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfbWFzaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggdGhlIGVtcGxveWVlIGlzIHBhaWQuIFBvc3NpYmxlIHZhbHVlczogYE1PTlRITFlgLCBgQkktV0VFS0xZYCwgYFdFRUtMWWAsIGBTRU1JLU1PTlRITFlgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5c3R1YlBheUZyZXF1ZW5jeSB7XG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBCaVdlZWtseSA9ICdCSS1XRUVLTFknLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUktTU9OVEhMWScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgb2YgaW5jb21lIGVhcm5lZCB5ZWFyIHRvIGRhdGUsIGFzIGJhc2VkIG9uIHBheXN0dWIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YllURERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogWWVhci10by1kYXRlIGdyb3NzIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBuZXQgKHRha2UgaG9tZSkgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YllURERldGFpbHNcbiAgICAgKi9cbiAgICBuZXRfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaXMgZXhwZWN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkLiBUaGUgd2ViaG9vayB3aWxsIGN1cnJlbnRseSBiZSBmaXJlZCA3IGRheXMgYmVmb3JlIHRoZSBleGlzdGluZyBJdGVtIGlzIHNjaGVkdWxlZCBmb3IgZGlzY29ubmVjdGlvbi4gVGhpcyBjYW4gYmUgcmVzb2x2ZWQgYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBDdXJyZW50bHksIHRoaXMgd2ViaG9vayBpcyBmaXJlZCBvbmx5IGZvciBVUyBvciBDYW5hZGlhbiBpbnN0aXR1dGlvbnM7IGluIHRoZSBVSyBvciBFVSwgeW91IHNob3VsZCBjb250aW51ZSB0byBsaXN0ZW4gZm9yIHRoZSBbYFBFTkRJTkdfRVhQSVJBVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNwZW5kaW5nX2V4cGlyYXRpb24pIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEVORElOR19ESVNDT05ORUNUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIHJlYXNvbjogUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rUmVhc29uO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBJdGVtIGlzIHNjaGVkdWxlZCB0byBkaXNjb25uZWN0LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgZGlzY29ubmVjdF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVhc29uIHdoeSB0aGUgSXRlbSBpcyBhYm91dCB0byBiZSBkaXNjb25uZWN0ZWQuIGBJTlNUSVRVVElPTl9NSUdSQVRJT05gOiBUaGUgaW5zdGl0dXRpb24gaXMgbW92aW5nIHRvIEFQSSBvciB0byBhIGRpZmZlcmVudCBpbnRlZ3JhdGlvbi4gRm9yIGV4YW1wbGUsIHRoaXMgY2FuIG9jY3VyIHdoZW4gYW4gaW5zdGl0dXRpb24gbW92ZXMgZnJvbSBhIG5vbi1PQXV0aCBpbnRlZ3JhdGlvbiB0byBhbiBPQXV0aCBpbnRlZ3JhdGlvbi4gYElOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT05gOiBUaGUgY29uc2VudCBvbiBhbiBJdGVtIGFzc29jaWF0ZWQgd2l0aCBhIFVTIG9yIENBIGluc3RpdHV0aW9uIGlzIGFib3V0IHRvIGV4cGlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1JlYXNvbiB7XG4gICAgTWlncmF0aW9uID0gJ0lOU1RJVFVUSU9OX01JR1JBVElPTicsXG4gICAgVG9rZW5FeHBpcmF0aW9uID0gJ0lOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT04nXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBhY2Nlc3MgY29uc2VudCBpcyBleHBpcmluZyBpbiA3IGRheXMuIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmtcXCdzIHVwZGF0ZSBtb2RlLiBUaGlzIHdlYmhvb2sgaXMgZmlyZWQgb25seSBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgKGluY2x1ZGluZyB0aGUgVUspOyBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgb3IgQ2FuYWRhLCBzZWUgW2BQRU5ESU5HX0RJU0NPTk5FQ1RgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jcGVuZGluZ19kaXNjb25uZWN0KSBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQRU5ESU5HX0VYUElSQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBwZXJzb25hbCBmaW5hbmNlIHVzZSBjYXNlcywgYnV0IG5vdCBsaW1pdGVkIHRvIHN1Y2ggdXNlIGNhc2VzLiAgU2VlIHRoZSBbdGF4b25vbXkgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wZmMtdGF4b25vbXktYWxsLmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gSWYgeW91IGFyZSBtaWdyYXRpbmcgdG8gcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGZyb20gdGhlIGxlZ2FjeSBjYXRlZ29yaWVzLCBhbHNvIHJlZmVyIHRvIHRoZSBbbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9wZmMtbWlncmF0aW9uLykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkge1xuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgcHJpbWFyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZ3JhbnVsYXIgY2F0ZWdvcnkgY29udmV5aW5nIHRoZSB0cmFuc2FjdGlvblxcJ3MgaW50ZW50LiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgZGV0YWlsZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNhdGVnb3JpZXMgYWNjdXJhdGVseSBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24gaW50ZW50LiAgYFZFUllfSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTglIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBISUdIYDogV2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBMT1dgOiBUaGlzIGNhdGVnb3J5IG1heSByZWZsZWN0IHRoZSBpbnRlbnQsIGJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgY2F0ZWdvcmllcyB0aGF0IGFyZSBtb3JlIGFjY3VyYXRlLiBgVU5LTk9XTmA6IFdlIGRvblxcJ3Qga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgdmVyc2lvbj86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoaWNoIHZlcnNpb24gb2YgdGhlIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdGF4b25vbXkgaXMgYmVpbmcgdXNlZC4gW1ZpZXcgUEZDdjIgYW5kIFBGQ3YxIHRheG9ub21pZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wZmMtdGF4b25vbXktYWxsLmNzdikuICBJZiB5b3UgZW5hYmxlZCBUcmFuc2FjdGlvbnMgb3IgRW5yaWNoIGJlZm9yZSBEZWNlbWJlciAzLCAyMDI1IHlvdSB3aWxsIHJlY2VpdmUgdGhlIGB2MWAgdGF4b25vbXkgYnkgZGVmYXVsdCBhbmQgbWF5IHJlcXVlc3QgYHYyYCBieSBleHBsaWNpdGx5IHNldHRpbmcgdGhpcyBmaWVsZCB0byBgdjJgIGluIHRoZSByZXF1ZXN0LiAgSWYgeW91IGVuYWJsZWQgVHJhbnNhY3Rpb25zIG9yIEVucmljaCBvbiBvciBhZnRlciBEZWNlbWJlciAzLCAyMDI1LCB5b3UgbWF5IG9ubHkgcmVjZWl2ZSB0aGUgYHYyYCB0YXhvbm9teS4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb24ge1xuICAgIFYxID0gJ3YxJyxcbiAgICBWMiA9ICd2Midcbn1cblxuLyoqXG4gKiBBIHBob25lIG51bWJlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBwaG9uZSBudW1iZXIgYXMgdGhlIHByaW1hcnkgbnVtYmVyIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBQaG9uZU51bWJlclR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFBob25lTnVtYmVyVHlwZUVudW0ge1xuICAgIEhvbWUgPSAnaG9tZScsXG4gICAgV29yayA9ICd3b3JrJyxcbiAgICBPZmZpY2UgPSAnb2ZmaWNlJyxcbiAgICBNb2JpbGUgPSAnbW9iaWxlJyxcbiAgICBNb2JpbGUxID0gJ21vYmlsZTEnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIHBob25lIG51bWJlciBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIHBob25lIG51bWJlciBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaG9uZU51bWJlck1hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIHBob25lIG51bWJlci4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktNzAgaXMgYSBwYXJ0aWFsIG1hdGNoIChtYXRjaGluZyB0aGUgc2FtZSBwaG9uZSBudW1iZXIgd2l0aCBleHRlbnNpb24gYWdhaW5zdCBvbmUgd2l0aG91dCBleHRlbnNpb24sIGV0Yy4pLCBhbnl0aGluZyBiZWxvdyA3MCBpcyBjb25zaWRlcmVkIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgcGhvbmUgbnVtYmVyIGlzIGEgcGhvbmUgbGluZSBvciBhIGZheCBsaW5lLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGhvbmVUeXBlIHtcbiAgICBQaG9uZSA9ICdwaG9uZScsXG4gICAgRmF4ID0gJ2ZheCdcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpZGVudGl0eSBkb2N1bWVudCBkZXRlY3RlZCBpbiB0aGUgaW1hZ2VzIHByb3ZpZGVkLiBXaWxsIGFsd2F5cyBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgIGBkcml2ZXJzX2xpY2Vuc2VgIC0gQSBkcml2ZXJcXCdzIGxpY2Vuc2UgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnksIGVzdGFibGlzaGluZyBpZGVudGl0eSB3aXRob3V0IGFueSBndWFyYW50ZWUgYXMgdG8gY2l0aXplbnNoaXAsIGFuZCBncmFudGluZyBkcml2aW5nIHByaXZpbGVnZXMgICAgYGlkX2NhcmRgIC0gQSBnZW5lcmFsIG5hdGlvbmFsIGlkZW50aWZpY2F0aW9uIGNhcmQsIGRpc3RpbmN0IGZyb20gZHJpdmVyXFwncyBsaWNlbnNlcyBhcyBpdCBvbmx5IGVzdGFibGlzaGVzIGlkZW50aXR5ICAgIGBwYXNzcG9ydGAgLSBBIHRyYXZlbCBwYXNzcG9ydCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBmb3Igb25lIG9mIGl0cyBjaXRpemVucyAgICBgcmVzaWRlbmNlX3Blcm1pdF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnRlbXBvcmFyaWx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGByZXNpZGVudF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnBlcm1hbmVudGx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGB2aXNhYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gZW50cnkgZm9yIGEgc2hvcnQgZHVyYXRpb24gYW5kIGZvciBhIHNwZWNpZmljIHB1cnBvc2UsIHR5cGljYWxseSBubyBsb25nZXIgdGhhbiA2IG1vbnRocyAgTm90ZTogVGhpcyB2YWx1ZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIElEIHR5cGUgdGhhdCB0aGUgdXNlciBzZWxlY3RzIHdpdGhpbiBMaW5rLiBGb3IgZXhhbXBsZSwgaWYgdGhleSBzZWxlY3QgXFxcIkRyaXZlclxcJ3MgTGljZW5zZVxcXCIgYnV0IHRoZW4gc3VibWl0IGEgcGljdHVyZSBvZiBhIHBhc3Nwb3J0LCB0aGlzIGZpZWxkIHdpbGwgc2F5IGBwYXNzcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeSB7XG4gICAgRHJpdmVyc0xpY2Vuc2UgPSAnZHJpdmVyc19saWNlbnNlJyxcbiAgICBJZENhcmQgPSAnaWRfY2FyZCcsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFJlc2lkZW5jZVBlcm1pdENhcmQgPSAncmVzaWRlbmNlX3Blcm1pdF9jYXJkJyxcbiAgICBSZXNpZGVudENhcmQgPSAncmVzaWRlbnRfY2FyZCcsXG4gICAgVmlzYSA9ICd2aXNhJ1xufVxuXG4vKipcbiAqIERhdGEgZXh0cmFjdGVkIGZyb20gYSB1c2VyLXN1Ym1pdHRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB7XG4gICAgLyoqXG4gICAgICogQWxwaGEtbnVtZXJpYyBJRCBudW1iZXIgZXh0cmFjdGVkIHZpYSBPQ1IgZnJvbSB0aGUgdXNlclxcJ3MgZG9jdW1lbnQgaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogUGh5c2ljYWxEb2N1bWVudENhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgb2YgdGhlIGRvY3VtZW50IGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpc3N1ZSBkYXRlIG9mIHRoZSBkb2N1bWVudCBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZS4gXFxcIlN1YmRpdmlzaW9uXFxcIiBpcyBhIGdlbmVyaWMgdGVybSBmb3IgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIGV0Yy4gRm9yIHRoZSBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpc3N1aW5nX3JlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBzdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnROYW1lTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogRG9jdW1lbnROYW1lTWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXhwaXJhdGlvbkRhdGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IEV4cGlyYXRpb25EYXRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1aW5nQ291bnRyeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogSXNzdWluZ0NvdW50cnk7XG59XG4vKipcbiAqIFVSTHMgZm9yIGRvd25sb2FkaW5nIG9yaWdpbmFsIGFuZCBjcm9wcGVkIGltYWdlcyBmb3IgdGhpcyBkb2N1bWVudCBzdWJtaXNzaW9uLiBUaGUgVVJMcyBhcmUgZGVzaWduZWQgdG8gb25seSBhbGxvdyBkb3dubG9hZGluZywgbm90IGhvdCBsaW5raW5nLCBzbyB0aGUgVVJMIHdpbGwgb25seSBzZXJ2ZSB0aGUgZG9jdW1lbnQgaW1hZ2UgZm9yIDYwIHNlY29uZHMgYmVmb3JlIGV4cGlyaW5nLiBUaGUgZXhwaXJhdGlvbiB0aW1lIGlzIDYwIHNlY29uZHMgYWZ0ZXIgdGhlIGBHRVRgIHJlcXVlc3QgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiBBIG5ldyBleHBpcmluZyBVUkwgaXMgZ2VuZXJhdGVkIHdpdGggZWFjaCByZXF1ZXN0LCBzbyB5b3UgY2FuIGFsd2F5cyByZXJlcXVlc3QgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlmIG9uZSBvZiB5b3VyIFVSTHMgZXhwaXJlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXMge1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIHRoZSB1bmNyb3BwZWQgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGZyb250IG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgb3JpZ2luYWxfZnJvbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgdGhlIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudC4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQgd2FzIG5vdCBjb2xsZWN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIG9yaWdpbmFsX2JhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wcGVkIGltYWdlIGNvbnRhaW5pbmcganVzdCB0aGUgZnJvbnQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBjcm9wcGVkX2Zyb250OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcHBlZCBpbWFnZSBjb250YWluaW5nIGp1c3QgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50LiBNaWdodCBiZSBudWxsIGlmIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudCB3YXMgbm90IGNvbGxlY3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgY3JvcHBlZF9iYWNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcCBvZiBqdXN0IHRoZSB1c2VyXFwncyBmYWNlIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLiBNaWdodCBiZSBudWxsIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGEgZmFjZSBwaG90by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgZmFjZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRXJyb3JzIGFyZSBpZGVudGlmaWVkIGJ5IGBlcnJvcl9jb2RlYCBhbmQgY2F0ZWdvcml6ZWQgYnkgYGVycm9yX3R5cGVgLiBVc2UgdGhlc2UgaW4gcHJlZmVyZW5jZSB0byBIVFRQIHN0YXR1cyBjb2RlcyB0byBpZGVudGlmeSBhbmQgaGFuZGxlIHNwZWNpZmljIGVycm9ycy4gSFRUUCBzdGF0dXMgY29kZXMgYXJlIHNldCBhbmQgcHJvdmlkZSB0aGUgYnJvYWRlc3QgY2F0ZWdvcml6YXRpb24gb2YgZXJyb3JzOiA0eHggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBlcnJvcnMsIGFuZCA1eHggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGVycm9ycywgYW5kIHRoZSBzdGF0dXMgd2lsbCBiZSAyeHggaW4gbm9uLWVycm9yIGNhc2VzLiBBbiBJdGVtIHdpdGggYSBub24tYG51bGxgIGVycm9yIG9iamVjdCB3aWxsIG9ubHkgYmUgcGFydCBvZiBhbiBBUEkgcmVzcG9uc2Ugd2hlbiBjYWxsaW5nIGAvaXRlbS9nZXRgIHRvIHZpZXcgSXRlbSBzdGF0dXMuIE90aGVyd2lzZSwgZXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZDsgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCBhbiBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhaWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYWlkRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgT0F1dGgtYmFzZWQgaXRlbSBlcnJvcnM7IGBudWxsYCB3aWxsIGJlIHJldHVybmVkIG90aGVyd2lzZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gIFBvc3NpYmxlIHZhbHVlczogYE9BVVRIX0lOVkFMSURfVE9LRU5gOiBUaGUgdXNlclxcJ3MgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGhhcyBiZWVuIGludmFsaWRhdGVkLiAgYE9BVVRIX0NPTlNFTlRfRVhQSVJFRGA6IFRoZSB1c2VyXFwncyBhY2Nlc3MgY29uc2VudCBmb3IgdGhpcyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGV4cGlyZWQuICBgT0FVVEhfVVNFUl9SRVZPS0VEYDogVGhlIHVzZXJcXCdzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBpcyBpbnZhbGlkIGJlY2F1c2UgdGhlIHVzZXIgcmV2b2tlZCB0aGVpciBjb25uZWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVxdWVzdCwgdG8gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nIHB1cnBvc2VzLiBUaGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZCBpbiBlcnJvcnMgcHJvdmlkZWQgYnkgd2ViaG9va3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhpcyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIGJlIHByb3ZpZGVkIGZvciB0aGUgYGVycm9yX3R5cGVgIGBBU1NFVF9SRVBPUlRfRVJST1JgIG9yIGBDSEVDS19SRVBPUlRfRVJST1JgLiBgY2F1c2VzYCB3aWxsIGFsc28gbm90IGJlIHBvcHVsYXRlZCBpbnNpZGUgYW4gZXJyb3IgbmVzdGVkIHdpdGhpbiBhIGB3YXJuaW5nYCBvYmplY3QuXG4gICAgICogQHR5cGUge0FycmF5PGFueT59XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHN0YXR1cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIFBsYWlkIGRvY3VtZW50YXRpb24gcGFnZSB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGRvY3VtZW50YXRpb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1Z2dlc3RlZCBzdGVwcyBmb3IgcmVzb2x2aW5nIHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIGFjY291bnQgc3VidHlwZXMgdGhhdCB3ZXJlIHJlcXVlc3RlZCB2aWEgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gQ3VycmVudGx5IG9ubHkgcG9wdWxhdGVkIGZvciBgTk9fQUNDT1VOVFNgIGVycm9ycyBmcm9tIEl0ZW1zIHdpdGggYGludmVzdG1lbnRzX2F1dGhgIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICByZXF1aXJlZF9hY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIGFjY291bnQgc3VidHlwZXMgdGhhdCB3ZXJlIGV4dHJhY3RlZCBidXQgZGlkIG5vdCBtYXRjaCB0aGUgcmVxdWVzdGVkIHN1YnR5cGVzIHZpYSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIGluIGAvbGluay90b2tlbi9jcmVhdGVgLiBDdXJyZW50bHkgb25seSBwb3B1bGF0ZWQgZm9yIGBOT19BQ0NPVU5UU2AgZXJyb3JzIGZyb20gSXRlbXMgd2l0aCBgaW52ZXN0bWVudHNfYXV0aGAgYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHByb3ZpZGVkX2FjY291bnRfc3VidHlwZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBsYWlkRXJyb3JUeXBlIHtcbiAgICBJbnZhbGlkUmVxdWVzdCA9ICdJTlZBTElEX1JFUVVFU1QnLFxuICAgIEludmFsaWRSZXN1bHQgPSAnSU5WQUxJRF9SRVNVTFQnLFxuICAgIEludmFsaWRJbnB1dCA9ICdJTlZBTElEX0lOUFVUJyxcbiAgICBJbnN0aXR1dGlvbkVycm9yID0gJ0lOU1RJVFVUSU9OX0VSUk9SJyxcbiAgICBSYXRlTGltaXRFeGNlZWRlZCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICBBcGlFcnJvciA9ICdBUElfRVJST1InLFxuICAgIEl0ZW1FcnJvciA9ICdJVEVNX0VSUk9SJyxcbiAgICBBc3NldFJlcG9ydEVycm9yID0gJ0FTU0VUX1JFUE9SVF9FUlJPUicsXG4gICAgQmFzZVJlcG9ydEVycm9yID0gJ0JBU0VfUkVQT1JUX0VSUk9SJyxcbiAgICBSZWNhcHRjaGFFcnJvciA9ICdSRUNBUFRDSEFfRVJST1InLFxuICAgIE9hdXRoRXJyb3IgPSAnT0FVVEhfRVJST1InLFxuICAgIFBheW1lbnRFcnJvciA9ICdQQVlNRU5UX0VSUk9SJyxcbiAgICBCYW5rVHJhbnNmZXJFcnJvciA9ICdCQU5LX1RSQU5TRkVSX0VSUk9SJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25FcnJvciA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OX0VSUk9SJyxcbiAgICBNaWNyb2RlcG9zaXRzRXJyb3IgPSAnTUlDUk9ERVBPU0lUU19FUlJPUicsXG4gICAgU2FuZGJveEVycm9yID0gJ1NBTkRCT1hfRVJST1InLFxuICAgIFBhcnRuZXJFcnJvciA9ICdQQVJUTkVSX0VSUk9SJyxcbiAgICBTaWduYWxFcnJvciA9ICdTSUdOQUxfRVJST1InLFxuICAgIFRyYW5zYWN0aW9uc0Vycm9yID0gJ1RSQU5TQUNUSU9OU19FUlJPUicsXG4gICAgVHJhbnNhY3Rpb25FcnJvciA9ICdUUkFOU0FDVElPTl9FUlJPUicsXG4gICAgVHJhbnNmZXJFcnJvciA9ICdUUkFOU0ZFUl9FUlJPUicsXG4gICAgQ2hlY2tSZXBvcnRFcnJvciA9ICdDSEVDS19SRVBPUlRfRVJST1InLFxuICAgIENvbnN1bWVyUmVwb3J0RXJyb3IgPSAnQ09OU1VNRVJfUkVQT1JUX0VSUk9SJyxcbiAgICBVc2VyRXJyb3IgPSAnVVNFUl9FUlJPUicsXG4gICAgSWRlbXBvdGVuY3lFcnJvciA9ICdJREVNUE9URU5DWV9FUlJPUicsXG4gICAgQXNzZXRzRXJyb3IgPSAnQVNTRVRTX0VSUk9SJyxcbiAgICBDcmFNb25pdG9yaW5nRXJyb3IgPSAnQ1JBX01PTklUT1JJTkdfRVJST1InLFxuICAgIENyZWRpdFByb2ZpbGVSZXBvcnRFcnJvciA9ICdDUkVESVRfUFJPRklMRV9SRVBPUlRfRVJST1InLFxuICAgIEVuY29tcGFzc0Vycm9yID0gJ0VOQ09NUEFTU19FUlJPUicsXG4gICAgRW5yaWNoRXJyb3IgPSAnRU5SSUNIX0VSUk9SJyxcbiAgICBGcmF1ZEluc2lnaHRzRXJyb3IgPSAnRlJBVURfSU5TSUdIVFNfRVJST1InLFxuICAgIEZyZWRkaWVNYWNFcnJvciA9ICdGUkVERElFX01BQ19FUlJPUicsXG4gICAgTGlua0RlbGl2ZXJ5RXJyb3IgPSAnTElOS19ERUxJVkVSWV9FUlJPUicsXG4gICAgUHJvZmlsZUVycm9yID0gJ1BST0ZJTEVfRVJST1InLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9uc0Vycm9yID0gJ1JFQ1VSUklOR19UUkFOU0FDVElPTlNfRVJST1InLFxuICAgIFN0YXRlbWVudHNFcnJvciA9ICdTVEFURU1FTlRTX0VSUk9SJyxcbiAgICBUcmFuc2ZlclJlY3VycmluZ0Vycm9yID0gJ1RSQU5TRkVSX1JFQ1VSUklOR19FUlJPUicsXG4gICAgVHJhbnNmZXJSZWZ1bmRFcnJvciA9ICdUUkFOU0ZFUl9SRUZVTkRfRVJST1InXG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIExlbmRTY29yZSB0byB1c2UuIFJlcXVpcmVkIGlmIHVzaW5nIExlbmRTY29yZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBsYWlkTGVuZFNjb3JlVmVyc2lvbiB7XG4gICAgVjEwID0gJ3YxLjAnLFxuICAgIFYyMCA9ICd2Mi4wJyxcbiAgICBMczEgPSAnTFMxJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgc2V0IG9mIGlkcyByZWxhdGVkIHRvIGFuIGVtcGxveWVlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBsYXRmb3JtSWRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1JZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhbiBlbXBsb3llZSBhcyBnaXZlbiBieSB0aGVpciBlbXBsb3llclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgZW1wbG95ZWVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhbiBlbXBsb3llZSBhcyBnaXZlbiBieSB0aGVpciBwYXlyb2xsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbXBsb3llZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcG9zaXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGF0YSBmcm9tIHRoZSBDYXNoU2NvcmXCriBwcm9kdWN0IHJldHVybmVkIGJ5IFByaXNtIERhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtQ2FzaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIGNhc2ggc2NvcmUgbW9kZWwgdXNlZC4gVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBtb2RlbF92ZXJzaW9uYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIGNhc2ggc2NvcmUgbW9kZWwgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIG1vZGVsX3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIHJldHVybmVkIGJ5IFByaXNtIERhdGEuIFJhbmdlcyBmcm9tIDEtOTk5LCB3aXRoIGhpZ2hlciBzY29yZSBpbmRpY2F0aW5nIGxvd2VyIHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29ucyBmb3IgYW4gaW5kaXZpZHVhbCBoYXZpbmcgcmlzayBhY2NvcmRpbmcgdG8gdGhlIGNhc2ggc2NvcmUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgcmVhc29uX2NvZGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmVNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IFByaXNtQ2FzaFNjb3JlTWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIHJldHVybmVkIGJ5IFByaXNtIGZvciB0aGlzIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVcbiAgICAgKi9cbiAgICBlcnJvcl9yZWFzb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGFib3V0IHRoZSBwcm92aWRlZCB0cmFuc2FjdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbUNhc2hTY29yZU1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXhfYWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1pbl9hZ2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGxhdGVzdCBjcmVkaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1pbl9hZ2VfY3JlZGl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBsYXRlc3QgZGViaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1pbl9hZ2VfZGViaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCBkZWJpdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4X2FnZV9kZWJpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgb2xkZXN0IGNyZWRpdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4X2FnZV9jcmVkaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG51bV90cnhuX2NyZWRpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGViaXQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBudW1fdHJ4bl9kZWJpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCAzMCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsMW1fY3JlZGl0X3ZhbHVlX2NudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGluIHRoZSBsYXN0IDMwIGRheXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIGwxbV9kZWJpdF92YWx1ZV9jbnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIENhc2hTY29yZS4gSWYgbm90IHNwZWNpZmllZCwgd2lsbCBkZWZhdWx0IHRvIHYzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJpc21DYXNoU2NvcmVWZXJzaW9uIHtcbiAgICBfNDEgPSAnNC4xJyxcbiAgICBfNCA9ICc0JyxcbiAgICBfM0xpdGUgPSAnM19saXRlJyxcbiAgICBfMyA9ICczJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGRhdGEgZnJvbSB0aGUgQ2FzaFNjb3Jlwq4gRGV0ZWN0IHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21EZXRlY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbURldGVjdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgQ2FzaFNjb3Jlwq4gRGV0ZWN0IG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21EZXRlY3RcbiAgICAgKi9cbiAgICBtb2RlbF92ZXJzaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIHJldHVybmVkIGJ5IFByaXNtIERhdGEuIFJhbmdlcyBmcm9tIDEtOTk5LCB3aXRoIGhpZ2hlciBzY29yZSBpbmRpY2F0aW5nIGxvd2VyIHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21EZXRlY3RcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29ucyBmb3IgYW4gaW5kaXZpZHVhbCBoYXZpbmcgcmlzayBhY2NvcmRpbmcgdG8gdGhlIENhc2hTY29yZcKuIERldGVjdCBzY29yZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21EZXRlY3RcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUNhc2hTY29yZU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbURldGVjdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogUHJpc21DYXNoU2NvcmVNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgcmV0dXJuZWQgYnkgUHJpc20gZm9yIHRoaXMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbURldGVjdFxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGV0ZWN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbURldGVjdFZlcnNpb24ge1xuICAgIF80MSA9ICc0LjEnLFxuICAgIF80ID0gJzQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgZGF0YSBmcm9tIHRoZSBDYXNoU2NvcmXCriBFeHRlbmQgcHJvZHVjdCByZXR1cm5lZCBieSBQcmlzbSBEYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbUV4dGVuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtRXh0ZW5kIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBDYXNoU2NvcmXCriBFeHRlbmQgbW9kZWwgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUV4dGVuZFxuICAgICAqL1xuICAgIG1vZGVsX3ZlcnNpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS4gUmFuZ2VzIGZyb20gMS05OTksIHdpdGggaGlnaGVyIHNjb3JlIGluZGljYXRpbmcgbG93ZXIgcmlzay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUV4dGVuZFxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgQ2FzaFNjb3Jlwq4gRXh0ZW5kIHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUV4dGVuZFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRXh0ZW5kXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRXh0ZW5kXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBFeHRlbmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtRXh0ZW5kVmVyc2lvbiB7XG4gICAgXzQxID0gJzQuMScsXG4gICAgXzQgPSAnNCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIEZpcnN0RGV0ZWN0IHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21GaXJzdERldGVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtRmlyc3REZXRlY3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIEZpcnN0RGV0ZWN0IG1vZGVsIHVzZWQuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgbW9kZWxfdmVyc2lvbmAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIEZpcnN0RGV0ZWN0IG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIG1vZGVsX3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIHJldHVybmVkIGJ5IFByaXNtIERhdGEuIFJhbmdlcyBmcm9tIDEtOTk5LCB3aXRoIGhpZ2hlciBzY29yZSBpbmRpY2F0aW5nIGxvd2VyIHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgRmlyc3REZXRlY3Qgc2NvcmUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUNhc2hTY29yZU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUZpcnN0RGV0ZWN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBlcnJvcl9yZWFzb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIEZpcnN0RGV0ZWN0LiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGRlZmF1bHQgdG8gdjMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbUZpcnN0RGV0ZWN0VmVyc2lvbiB7XG4gICAgXzMgPSAnMycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIEluc2lnaHRzIHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIGluc2lnaHRzIG1vZGVsIHVzZWQuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgbW9kZWxfdmVyc2lvbmAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21JbnNpZ2h0c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIGluc2lnaHRzIG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21JbnNpZ2h0c1xuICAgICAqL1xuICAgIG1vZGVsX3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEluc2lnaHRzIFJlc3VsdCBvYmplY3QgaXMgYSBtYXAgb2YgY2FzaCBmbG93IGF0dHJpYnV0ZXMsIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcsIGFuZCB0aGUgdmFsdWUgaXMgYSBmbG9hdCBvciBzdHJpbmcuIEZvciBhIGZ1bGwgbGlzdCBvZiBhdHRyaWJ1dGVzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBUaGUgYXR0cmlidXRlcyBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIFByaXNtIHZlcnNpb24gdXNlZC5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUluc2lnaHRzXG4gICAgICovXG4gICAgcmVzdWx0Pzogb2JqZWN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtSW5zaWdodHNcbiAgICAgKi9cbiAgICBlcnJvcl9yZWFzb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIEluc2lnaHRzLiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGRlZmF1bHQgdG8gdjMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbUluc2lnaHRzVmVyc2lvbiB7XG4gICAgXzQxID0gJzQuMScsXG4gICAgXzQgPSAnNCcsXG4gICAgXzMgPSAnMycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9ucyBvZiBQcmlzbSBwcm9kdWN0cyB0byBldmFsdWF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbVZlcnNpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21WZXJzaW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtRmlyc3REZXRlY3RWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zXG4gICAgICovXG4gICAgZmlyc3RkZXRlY3Q/OiBQcmlzbUZpcnN0RGV0ZWN0VmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtRGV0ZWN0VmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc1xuICAgICAqL1xuICAgIGRldGVjdD86IFByaXNtRGV0ZWN0VmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc1xuICAgICAqL1xuICAgIGNhc2hzY29yZT86IFByaXNtQ2FzaFNjb3JlVmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtRXh0ZW5kVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc1xuICAgICAqL1xuICAgIGV4dGVuZD86IFByaXNtRXh0ZW5kVmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtSW5zaWdodHNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQsIHVzZSBgcGFydG5lcl9pbnNpZ2h0cy5wcmlzbV92ZXJzaW9uc2AgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbVZlcnNpb25zRGVwcmVjYXRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtRmlyc3REZXRlY3RWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zRGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZpcnN0ZGV0ZWN0PzogUHJpc21GaXJzdERldGVjdFZlcnNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbURldGVjdFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNEZXByZWNhdGVkXG4gICAgICovXG4gICAgZGV0ZWN0PzogUHJpc21EZXRlY3RWZXJzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zRGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhc2hzY29yZT86IFByaXNtQ2FzaFNjb3JlVmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtRXh0ZW5kVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBleHRlbmQ/OiBQcmlzbUV4dGVuZFZlcnNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUluc2lnaHRzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc0RlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbnNpZ2h0cz86IFByaXNtSW5zaWdodHNWZXJzaW9uIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQcm9jZXNzb3JOdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbn1cbi8qKlxuICogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgKmFuZCogb25lIG9yIG1vcmUgYWNjb3VudCB0eXBlcyBiZWluZyByZXF1ZXN0ZWQgaXMgYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IChzdWNoIGFzIGEgY3JlZGl0IGNhcmQpIGFzIENhcGl0YWwgT25lIGRvZXMgbm90IHByb3ZpZGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBJbiB0aGlzIGNhc2UsIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgYXMgd2VsbCBhcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cyBhdCBDYXBpdGFsIE9uZSAoaW5jbHVkaW5nIGFsbCBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cykgdGhpcyBmaWVsZCBpcyBpZ25vcmVkIGFuZCByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGZldGNoZWQuICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBpZ25vcmVkLCBhbmQgbm8gYWNjZXB0YWJsZSBiYWxhbmNlIGlzIGF2YWlsYWJsZSwgYW4gYElOVkFMSURfUkVTVUxUYCBlcnJvciB3aXRoIHRoZSBjb2RlIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQgLSBzaG91bGQgYmUgc2V0IHRvIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHN0b3JhZ2Ugd2l0aCB0aGUgYmFuayB0cmFuc2Zlci4gTWF5IGJlIHVwIHRvIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb24gZGF0YSBpcyBhdmFpbGFibGUgZm9yIGFuIEl0ZW0uIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkIGFuZCBQbGFpZCBoYXMgcHJlcGFyZWQgYXMgbXVjaCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIGRhdGEgYXMgcG9zc2libGUgZm9yIHRoZSBJdGVtLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBiZXlvbmQgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBUaGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50SWRlbnRpdHk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTklUSUFMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIHRoZSBpbnZlc3RtZW50IGFjY291bnQuIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogT2JqZWN0cyBkZXNjcmliaW5nIHRoZSBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXJzIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEludmVzdG1lbnRzQXV0aEdldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhdGFfc291cmNlczogSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXM7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgYWNjb3VudHMgb2YgNDAxayBzdWJ0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWs+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfZGV0YWlsc180MDFrPzogQXJyYXk8SW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrPjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEFjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEludmVzdG1lbnRBY2NvdW50O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50QWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEludmVzdG1lbnRBY2NvdW50O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gSW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaWRlbnRpZnlpbmcgbnVtYmVycyB1c2VkIGZvciBtYWtpbmcgZWxlY3Ryb25pYyB0cmFuc2ZlcnMgdG8gYW5kIGZyb20gdGhlIGBhY2NvdW50YC4gVGhlIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIChBQ0gsIEVGVCwgSUJBTiwgb3IgQmFjcykgdXNlZCB3aWxsIGRlcGVuZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgYWNjb3VudC4gQW4gYWNjb3VudCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIG51bWJlciB0eXBlLiBJZiBhIHBhcnRpY3VsYXIgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgaXMgbm90IHVzZWQgYnkgdGhlIGBhY2NvdW50YCBmb3Igd2hpY2ggYXV0aCBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCwgYSBudWxsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNBQ0hOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgYWNoPzogTnVtYmVyc0FDSE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0VGVE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBlZnQ/OiBOdW1iZXJzRUZUTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGJhY3M/OiBOdW1iZXJzQkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YSBpcyB1cGRhdGVkLiBUaGlzIGluY2x1ZGVzIHdoZW4gYSBuZXcgcmVjdXJyaW5nIHN0cmVhbSBpcyBkZXRlY3RlZCBvciB3aGVuIGEgbmV3IHRyYW5zYWN0aW9uIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHJlY3VycmluZyBzdHJlYW0uIFRoZSBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgIHdlYmhvb2sgd2lsbCBhbHNvIGZpcmUgd2hlbiBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWN1cnJpbmcgc3RyZWFtIGNoYW5nZXMsIHdoaWNoIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uLCB1cGRhdGUsIG9yIHJlbW92YWwgb2YgdHJhbnNhY3Rpb25zIHRvIHRoZSBzdHJlYW0uICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIHVwZGF0ZWQgZGF0YSBjYW4gYmUgZmV0Y2hlZCBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICoqdHJ1ZSoqIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gaXMgYSByZWN1cnJpbmcgdHJhbnNhY3Rpb247ICoqZmFsc2UqKiBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBwYXltZW50IG1ldGhvZCB0byBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24uIGBTQU1FX0RBWV9BQ0hgOiBTYW1lIERheSBBQ0ggYnkgTmFjaGEuIFRoZSBkZWJpdCB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgb24gdGhlIHNhbWUgZGF5LiBgU1RBTkRBUkRfQUNIYDogU3RhbmRhcmQgQUNIIGJ5IE5hY2hhLiBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogSWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMuIFBvc3NpYmxlIHZhbHVlczogIGBTQU1FX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIHJ1bGVzZXQgdG8gdXNlIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZSBhIHJ1bGVzZXQgdXNpbmcgdGhlIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgW1NpZ25hbC0+UnVsZXNdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zaWduYWwvcmlzay1wcm9maWxlcykuIElmIG5vdCBwcm92aWRlZCwgZm9yIGN1c3RvbWVycyB3aG8gYmVnYW4gdXNpbmcgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBiZWZvcmUgT2N0b2JlciAxNSwgMjAyNSwgYnkgZGVmYXVsdCwgbm8gcnVsZXNldCB3aWxsIGJlIHVzZWQ7IGZvciBjdXN0b21lcnMgd2hvIGJlZ2FuIHVzaW5nIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgYWZ0ZXIgdGhhdCBkYXRlLCBvciBmb3IgQmFsYW5jZSBjdXN0b21lcnMsIHRoZSBgZGVmYXVsdGAgcnVsZXNldCB3aWxsIGJlIHVzZWQuIEZvciBtb3JlIGRldGFpbHMsIG9yIHRvIG9wdCBvdXQgb2YgdXNpbmcgYSBydWxlc2V0LCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZXNldF9rZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvcmVfYXR0cmlidXRlcz86IFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1J1bGVzZXR9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlc2V0PzogUnVsZXNldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIFxcXCJSMDFcXFwiKSAgSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIHlvdSByZWNlaXZlIHRoZSByZXR1cm5zIGZyb20geW91ciBwYXltZW50IHByb2Nlc3NvcnMsIGluIElTTyA4NjAxIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybmVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgaW4gTGlua1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNlbnQgdG8gU3RyaXBlIGZvciB1c2UgaW4gbWFraW5nIEFQSSBjYWxscyB0byBQbGFpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmlwZV9iYW5rX2FjY291bnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIGNoYW5nZS4gVGhpcyBjYW4gYmUgZHVlIHRvIGFueSBldmVudCByZXN1bHRpbmcgaW4gbmV3IGNoYW5nZXMsIHN1Y2ggYXMgYW4gaW5pdGlhbCAzMC1kYXkgdHJhbnNhY3Rpb25zIGZldGNoIHVwb24gdGhlIGluaXRpYWxpemF0aW9uIG9mIGFuIEl0ZW0gd2l0aCB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZmlsbCBvZiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyB0aGF0IG9jY3VycyBzaG9ydGx5IGFmdGVyLCBvciB3aGVuIGNoYW5nZXMgYXJlIHBvcHVsYXRlZCBmcm9tIGEgcmVndWxhcmx5LXNjaGVkdWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGpvYi4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgd2hlbiB1c2luZyB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LiBOb3RlIHRoYXQgd2hlbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgdGhlIG9sZGVyIHdlYmhvb2tzIGBJTklUSUFMX1VQREFURWAsIGBISVNUT1JJQ0FMX1VQREFURWAsIGBERUZBVUxUX1VQREFURWAsIGFuZCBgVFJBTlNBQ1RJT05TX1JFTU9WRURgLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCB3aWxsIGFsc28gY29udGludWUgdG8gYmUgc2VudCBpbiBvcmRlciB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRob3NlIHdlYmhvb2tzIHdoZW4gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiAgQWZ0ZXIgcmVjZWlwdCBvZiB0aGlzIHdlYmhvb2ssIHRoZSBuZXcgY2hhbmdlcyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0gZnJvbSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIGFuIEl0ZW0sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBvbiB0aGF0IEl0ZW0uIFRoaXMgbWVhbnMgdGhhdCwgdW5saWtlIHRoZSBgSU5JVElBTF9VUERBVEVgIGFuZCBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2tzLCBpdCB3aWxsIG5vdCBmaXJlIGltbWVkaWF0ZWx5IHVwb24gSXRlbSBjcmVhdGlvbi4gSWYgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGlzIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgd2FzICpub3QqIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zLCB0aGUgd2ViaG9vayB3aWxsIGZpcmUgdHdpY2U6IG9uY2UgdGhlIGZpcnN0IDMwIGRheXMgb2YgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZCwgYW5kIGEgc2Vjb25kIHRpbWUgd2hlbiBhbGwgYXZhaWxhYmxlIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4gIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgdHJhbnNhY3Rpb25zIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluaXRpYWwgcHVsbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGluaXRpYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBoaXN0b3JpY2FsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB5b3UgYXJlIGludGVncmF0aW5nIHdpdGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yOiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFByb2Nlc3NvckVudW0ge1xuICAgIER3b2xsYSA9ICdkd29sbGEnLFxuICAgIEdhbGlsZW8gPSAnZ2FsaWxlbycsXG4gICAgTW9kZXJuVHJlYXN1cnkgPSAnbW9kZXJuX3RyZWFzdXJ5JyxcbiAgICBPY3JvbHVzID0gJ29jcm9sdXMnLFxuICAgIFZlc3RhID0gJ3Zlc3RhJyxcbiAgICBEcml2ZXdlYWx0aCA9ICdkcml2ZXdlYWx0aCcsXG4gICAgVm9wYXkgPSAndm9wYXknLFxuICAgIEFjaHEgPSAnYWNocScsXG4gICAgQ2hlY2sgPSAnY2hlY2snLFxuICAgIENoZWNrYm9vayA9ICdjaGVja2Jvb2snLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIFNpbGFNb25leSA9ICdzaWxhX21vbmV5JyxcbiAgICBSaXplID0gJ3JpemUnLFxuICAgIFN2YkFwaSA9ICdzdmJfYXBpJyxcbiAgICBVbml0ID0gJ3VuaXQnLFxuICAgIFd5cmUgPSAnd3lyZScsXG4gICAgTGl0aGljID0gJ2xpdGhpYycsXG4gICAgQWxwYWNhID0gJ2FscGFjYScsXG4gICAgQXN0cmEgPSAnYXN0cmEnLFxuICAgIE1vb3YgPSAnbW9vdicsXG4gICAgVHJlYXN1cnlQcmltZSA9ICd0cmVhc3VyeV9wcmltZScsXG4gICAgTWFycWV0YSA9ICdtYXJxZXRhJyxcbiAgICBDaGVja291dCA9ICdjaGVja291dCcsXG4gICAgU29saWQgPSAnc29saWQnLFxuICAgIEhpZ2hub3RlID0gJ2hpZ2hub3RlJyxcbiAgICBHZW1pbmkgPSAnZ2VtaW5pJyxcbiAgICBBcGV4Q2xlYXJpbmcgPSAnYXBleF9jbGVhcmluZycsXG4gICAgR3VzdG8gPSAnZ3VzdG8nLFxuICAgIEFkeWVuID0gJ2FkeWVuJyxcbiAgICBBdG9taWMgPSAnYXRvbWljJyxcbiAgICBJMmMgPSAnaTJjJyxcbiAgICBXZXBheSA9ICd3ZXBheScsXG4gICAgUmlza2lmaWVkID0gJ3Jpc2tpZmllZCcsXG4gICAgVXRiID0gJ3V0YicsXG4gICAgQWRwUm9sbCA9ICdhZHBfcm9sbCcsXG4gICAgRm9ydHJlc3NUcnVzdCA9ICdmb3J0cmVzc190cnVzdCcsXG4gICAgQm9uZCA9ICdib25kJyxcbiAgICBCYWtrdCA9ICdiYWtrdCcsXG4gICAgVGVhbCA9ICd0ZWFsJyxcbiAgICBaZXJvSGFzaCA9ICd6ZXJvX2hhc2gnLFxuICAgIFRhYmFQYXkgPSAndGFiYV9wYXknLFxuICAgIEtub3QgPSAna25vdCcsXG4gICAgU2FyZGluZSA9ICdzYXJkaW5lJyxcbiAgICBBbGxveSA9ICdhbGxveScsXG4gICAgRmluaXggPSAnZmluaXgnLFxuICAgIE51dmVpID0gJ251dmVpJyxcbiAgICBMYXllciA9ICdsYXllcicsXG4gICAgQm9vbSA9ICdib29tJyxcbiAgICBQYXlub3RlID0gJ3BheW5vdGUnLFxuICAgIFN0YWtlID0gJ3N0YWtlJyxcbiAgICBXZWRidXNoID0gJ3dlZGJ1c2gnLFxuICAgIEVzdXN1ID0gJ2VzdXN1JyxcbiAgICBBbnNhID0gJ2Fuc2EnLFxuICAgIFNjcmliZXVwID0gJ3NjcmliZXVwJyxcbiAgICBTdHJhZGRsZSA9ICdzdHJhZGRsZScsXG4gICAgTG9hbnBybyA9ICdsb2FucHJvJyxcbiAgICBCbG9vbUNyZWRpdCA9ICdibG9vbV9jcmVkaXQnLFxuICAgIFNmb3ggPSAnc2ZveCcsXG4gICAgQnJhbGUgPSAnYnJhbGUnLFxuICAgIFBhcmFmaW4gPSAncGFyYWZpbicsXG4gICAgQ2FyZGxlc3MgPSAnY2FyZGxlc3MnLFxuICAgIE9wZW5MZWRnZXIgPSAnb3Blbl9sZWRnZXInLFxuICAgIFZhbG9uID0gJ3ZhbG9uJyxcbiAgICBHYWluYnJpZGdlID0gJ2dhaW5icmlkZ2UnLFxuICAgIENhcmRseXRpY3MgPSAnY2FyZGx5dGljcycsXG4gICAgUGlud2hlZWwgPSAncGlud2hlZWwnLFxuICAgIFRocmVhZEJhbmsgPSAndGhyZWFkX2JhbmsnLFxuICAgIEFycmF5ID0gJ2FycmF5JyxcbiAgICBGaWFudCA9ICdmaWFudCcsXG4gICAgT2F0ZmkgPSAnb2F0ZmknLFxuICAgIEN1cmlub3MgPSAnY3VyaW5vcycsXG4gICAgRnJhbWUgPSAnZnJhbWUnLFxuICAgIEludGVyY2hlY2tzID0gJ2ludGVyY2hlY2tzJyxcbiAgICBJbnRlcmNoYW5nZSA9ICdpbnRlcmNoYW5nZScsXG4gICAgQXRvbWljZmkgPSAnYXRvbWljZmknLFxuICAgIFBheSA9ICdwYXknLFxuICAgIE5hdHVyYWwgPSAnbmF0dXJhbCcsXG4gICAgS2FubW9uID0gJ2thbm1vbicsXG4gICAgS2ljayA9ICdraWNrJ1xufVxuXG4vKipcbiAqIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgIGFuZCBgL3Byb2Nlc3Nvci9hcGV4L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2Nlc3Nvcl90b2tlbmAgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIGJ5IHRoZSBQbGFpZCBwYXJ0bmVyIHRvIG1ha2UgQVBJIHJlcXVlc3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoYXQgdGhlIHByb2Nlc3NvciBoYXMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGluY2x1ZGluZyBmdXR1cmUgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IHdpbGwgZ3JhbnQgYWNjZXNzIHRvIGFsbCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYSBwcm9jZXNzb3IgdXBkYXRlcyB0aGUgd2ViaG9vayBVUkwgZm9yIGEgcHJvY2Vzc29yIHRva2VuIHZpYSBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogYFBST0NFU1NPUl9UT0tFTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBuZXdfd2ViaG9va191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gVG8gcmVtb3ZlIGEgd2ViaG9vayBmcm9tIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgdG8gYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaW5mbG93IHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGV4cGVuc2UgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbiBzdHJlYW1zIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCB3ZXJlIHVwZGF0ZWQgb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZXRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfdmVyc2lvbj86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBJdGVtLiBOb3RlOiBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVfc3RhdHVzOiBUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb24gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGFueSBmdXR1cmUgdXBkYXRlcyBhZnRlciB0aGUgbGF0ZXN0IHVwZGF0ZSBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlLiBUaGUgY3Vyc29yIG9idGFpbmVkIGFmdGVyIGFsbCBwYWdlcyBoYXZlIGJlZW4gcHVsbGVkIChpbmRpY2F0ZWQgYnkgYGhhc19tb3JlYCBiZWluZyBgZmFsc2VgKSB3aWxsIGJlIHZhbGlkIGZvciBhdCBsZWFzdCAxIHllYXIuIFRoaXMgY3Vyc29yIHNob3VsZCBiZSBwZXJzaXN0ZWQgZm9yIGxhdGVyIGNhbGxzLiBJZiB0cmFuc2FjdGlvbnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBpZiBtb3JlIHRoYW4gcmVxdWVzdGVkIGNvdW50IG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgZXhpc3QuIElmIHRydWUsIHRoZSBhZGRpdGlvbmFsIHVwZGF0ZXMgY2FuIGJlIGZldGNoZWQgYnkgbWFraW5nIGFuIGFkZGl0aW9uYWwgcmVxdWVzdCB3aXRoIGBjdXJzb3JgIHNldCB0byBgbmV4dF9jdXJzb3JgLiBJZiBgaGFzX21vcmVgIGlzIHRydWUsIGl0XFwncyBpbXBvcnRhbnQgdG8gcHVsbCBhbGwgYXZhaWxhYmxlIHBhZ2VzLCB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IGZvciB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlcyB0byBjb25mbGljdCB3aXRoIHBhZ2luYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBwcm9kdWN0IGFjY2VzcyBiZWluZyByZXF1ZXN0ZWQuIFVzZWQgdG8gYWxsb3cgb3IgZGlzYWxsb3cgcHJvZHVjdCBhY2Nlc3MgYWNyb3NzIGFsbCBhY2NvdW50cy4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGFsbCBwcm9kdWN0cyBhbGxvd2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0QWNjZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdEFjY2VzcyB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHN0YXRlbWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gdGhlIElkZW50aXR5IHByb2R1Y3QgKG5hbWUsIGVtYWlsLCBwaG9uZSwgYWRkcmVzcykuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGFjY291bnQgbnVtYmVyIGRldGFpbHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGF1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gdHJhbnNhY3Rpb24gZGV0YWlscy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGBhY2NvdW50c19kZXRhaWxzX3RyYW5zYWN0aW9uc2AuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX2RldGFpbHNfdHJhbnNhY3Rpb25zPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGBhY2NvdW50c19yb3V0aW5nX251bWJlcmAuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3JvdXRpbmdfbnVtYmVyPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGBhY2NvdW50c19zdGF0ZW1lbnRzYC4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBgYWNjb3VudHNfdGF4X3N0YXRlbWVudHNgLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c190YXhfc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBgY3VzdG9tZXJzX3Byb2ZpbGVzYC4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgY3VzdG9tZXJzX3Byb2ZpbGVzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gYEFDQ0VTU19OT1RfR1JBTlRFRGAgZXJyb3IgaXMgaGl0IGZvciBBdXRoLiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IHB1dHRpbmcgdGhlIHVzZXIgdGhyb3VnaCB1cGRhdGUgbW9kZSB3aXRoIGBhdXRoYCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgYXMgd2VsbCBhcyB0aHJvdWdoIHRoZSBsaW1pdGVkIGJldGEgZm9yIHVwZGF0ZSBtb2RlIEF1dGhlbnRpY2F0aW9uIHByb2R1Y3QgdmFsaWRhdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUEVSTUlTU0lPTlNfUkVRVUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGBBQ0NFU1NfTk9UX0dSQU5URURgIGVycm9yIGlzIGhpdCBmb3IgSWRlbnRpdHkuIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgcHV0dGluZyB0aGUgdXNlciB0aHJvdWdoIHVwZGF0ZSBtb2RlIHdpdGggYGlkZW50aXR5YCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgYXMgd2VsbCBhcyB0aHJvdWdoIHRoZSBsaW1pdGVkIGJldGEgZm9yIHVwZGF0ZSBtb2RlIElkZW50aXR5IHByb2R1Y3QgdmFsaWRhdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1BFUk1JU1NJT05TX1JFUVVJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdHVzIGhlYWx0aCBvZiBhIHJlcXVlc3QgdHlwZS4gQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBMaWFiaWxpdGllcyByZXF1ZXN0cywgVHJhbnNhY3Rpb25zIHVwZGF0ZXMsIEludmVzdG1lbnRzIHVwZGF0ZXMsIExpYWJpbGl0aWVzIHVwZGF0ZXMsIGFuZCBJdGVtIGxvZ2lucyBlYWNoIGhhdmUgdGhlaXIgb3duIHN0YXR1cyBvYmplY3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIGBicmVha2Rvd25gIG9iamVjdCwgd2hpY2ggcHJvdmlkZXMgbW9yZSBncmFudWxhciBpbnN0aXR1dGlvbiBoZWFsdGggZGF0YS4gIGBIRUFMVEhZYDogdGhlIG1ham9yaXR5IG9mIHJlcXVlc3RzIGFyZSBzdWNjZXNzZnVsIGBERUdSQURFRGA6IG9ubHkgc29tZSByZXF1ZXN0cyBhcmUgc3VjY2Vzc2Z1bCBgRE9XTmA6IGFsbCByZXF1ZXN0cyBhcmUgZmFpbGluZ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN0YXR1czogUHJvZHVjdFN0YXR1c1N0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0dGVkIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdGF0dXMgY2hhbmdlIGZvciB0aGUgaW5zdGl0dXRpb24uIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c19jaGFuZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c0JyZWFrZG93bn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogUHJvZHVjdFN0YXR1c0JyZWFrZG93bjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzU3RhdHVzRW51bSB7XG4gICAgSGVhbHRoeSA9ICdIRUFMVEhZJyxcbiAgICBEZWdyYWRlZCA9ICdERUdSQURFRCcsXG4gICAgRG93biA9ICdET1dOJ1xufVxuXG4vKipcbiAqIEEgZGV0YWlsZWQgYnJlYWtkb3duIG9mIHRoZSBpbnN0aXR1dGlvblxcJ3MgcGVyZm9ybWFuY2UgZm9yIGEgcmVxdWVzdCB0eXBlLiBUaGUgdmFsdWVzIGZvciBgc3VjY2Vzc2AsIGBlcnJvcl9wbGFpZGAsIGFuZCBgZXJyb3JfaW5zdGl0dXRpb25gIHN1bSB0byAxLiBUaGUgdGltZSByYW5nZSB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUgYnJlYWtkb3duIG1heSByYW5nZSBmcm9tIHRoZSBtb3N0IHJlY2VudCBmZXcgbWludXRlcyB0byB0aGUgcGFzdCBzaXggaG91cnMuIEluIGdlbmVyYWwsIHNtYWxsZXIgaW5zdGl0dXRpb25zIHdpbGwgc2hvdyBzdGF0dXMgdGhhdCB3YXMgY2FsY3VsYXRlZCBvdmVyIGEgbG9uZ2VyIHBlcmlvZCBvZiB0aW1lLiBGb3IgSW52ZXN0bWVudCB1cGRhdGVzLCB3aGljaCBhcmUgcmVmcmVzaGVkIGxlc3MgZnJlcXVlbnRseSwgdGhlIHBlcmlvZCBhc3Nlc3NlZCBtYXkgYmUgMjQgaG91cnMgb3IgbW9yZS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtJbnN0aXR1dGlvbiBzdGF0dXMgZGV0YWlsc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3RpbmctaW5zdGl0dXRpb24taW5zaWdodHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgc3VjY2Vzc2Z1bCwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgc3VjY2VzczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpbnRlcm5hbCBQbGFpZCBpc3N1ZSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX3BsYWlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGlzc3VlIGluIHRoZSBpbnN0aXR1dGlvblxcJ3Mgc3lzdGVtLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9pbnN0aXR1dGlvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEhvdyBmcmVxdWVudGx5IGRhdGEgZm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cyBsaWtlIEludmVzdG1lbnRzLCBUcmFuc2FjdGlvbnMsIGFuZCBMaWFiaWxpdGllcywgaXMgYmVpbmcgcmVmcmVzaGVkLCByZWxhdGl2ZSB0byB0aGUgaW5zdGl0dXRpb25cXCdzIG5vcm1hbCBzY2hlZHVsaW5nLiBUaGUgYHJlZnJlc2hfaW50ZXJ2YWxgIG1heSBiZSBgREVMQVlFRGAgb3IgYFNUT1BQRURgIGV2ZW4gd2hlbiB0aGUgc3VjY2VzcyByYXRlIGlzIGhpZ2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHJlZnJlc2hfaW50ZXJ2YWw/OiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bSB7XG4gICAgTm9ybWFsID0gJ05PUk1BTCcsXG4gICAgRGVsYXllZCA9ICdERUxBWUVEJyxcbiAgICBTdG9wcGVkID0gJ1NUT1BQRUQnXG59XG5cbi8qKlxuICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgYW4gaW5zdGl0dXRpb24gY2FuIHN1cHBvcnQuIEFsbCBJdGVtcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYXQgbGVhc3Qgb25lIHByb2R1Y3QuIFRoZSBCYWxhbmNlIHByb2R1Y3QgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdHMge1xuICAgIEFzc2V0cyA9ICdhc3NldHMnLFxuICAgIEF1dGggPSAnYXV0aCcsXG4gICAgQmFsYW5jZSA9ICdiYWxhbmNlJyxcbiAgICBCYWxhbmNlUGx1cyA9ICdiYWxhbmNlX3BsdXMnLFxuICAgIEJlYWNvbiA9ICdiZWFjb24nLFxuICAgIElkZW50aXR5ID0gJ2lkZW50aXR5JyxcbiAgICBJZGVudGl0eU1hdGNoID0gJ2lkZW50aXR5X21hdGNoJyxcbiAgICBJbnZlc3RtZW50cyA9ICdpbnZlc3RtZW50cycsXG4gICAgSW52ZXN0bWVudHNBdXRoID0gJ2ludmVzdG1lbnRzX2F1dGgnLFxuICAgIExpYWJpbGl0aWVzID0gJ2xpYWJpbGl0aWVzJyxcbiAgICBQYXltZW50SW5pdGlhdGlvbiA9ICdwYXltZW50X2luaXRpYXRpb24nLFxuICAgIElkZW50aXR5VmVyaWZpY2F0aW9uID0gJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbicsXG4gICAgVHJhbnNhY3Rpb25zID0gJ3RyYW5zYWN0aW9ucycsXG4gICAgQ3JlZGl0RGV0YWlscyA9ICdjcmVkaXRfZGV0YWlscycsXG4gICAgSW5jb21lID0gJ2luY29tZScsXG4gICAgSW5jb21lVmVyaWZpY2F0aW9uID0gJ2luY29tZV92ZXJpZmljYXRpb24nLFxuICAgIFN0YW5kaW5nT3JkZXJzID0gJ3N0YW5kaW5nX29yZGVycycsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInLFxuICAgIEVtcGxveW1lbnQgPSAnZW1wbG95bWVudCcsXG4gICAgUmVjdXJyaW5nVHJhbnNhY3Rpb25zID0gJ3JlY3VycmluZ190cmFuc2FjdGlvbnMnLFxuICAgIFRyYW5zYWN0aW9uc1JlZnJlc2ggPSAndHJhbnNhY3Rpb25zX3JlZnJlc2gnLFxuICAgIFNpZ25hbCA9ICdzaWduYWwnLFxuICAgIFN0YXRlbWVudHMgPSAnc3RhdGVtZW50cycsXG4gICAgUHJvY2Vzc29yUGF5bWVudHMgPSAncHJvY2Vzc29yX3BheW1lbnRzJyxcbiAgICBQcm9jZXNzb3JJZGVudGl0eSA9ICdwcm9jZXNzb3JfaWRlbnRpdHknLFxuICAgIFByb2ZpbGUgPSAncHJvZmlsZScsXG4gICAgQ3JhQmFzZVJlcG9ydCA9ICdjcmFfYmFzZV9yZXBvcnQnLFxuICAgIENyYUluY29tZUluc2lnaHRzID0gJ2NyYV9pbmNvbWVfaW5zaWdodHMnLFxuICAgIENyYVBhcnRuZXJJbnNpZ2h0cyA9ICdjcmFfcGFydG5lcl9pbnNpZ2h0cycsXG4gICAgQ3JhTmV0d29ya0luc2lnaHRzID0gJ2NyYV9uZXR3b3JrX2luc2lnaHRzJyxcbiAgICBDcmFDYXNoZmxvd0luc2lnaHRzID0gJ2NyYV9jYXNoZmxvd19pbnNpZ2h0cycsXG4gICAgQ3JhTW9uaXRvcmluZyA9ICdjcmFfbW9uaXRvcmluZycsXG4gICAgQ3JhTGVuZFNjb3JlID0gJ2NyYV9sZW5kX3Njb3JlJyxcbiAgICBDcmFQbGFpZENyZWRpdFNjb3JlID0gJ2NyYV9wbGFpZF9jcmVkaXRfc2NvcmUnLFxuICAgIENyYVF1YWxpZnkgPSAnY3JhX3F1YWxpZnknLFxuICAgIExheWVyID0gJ2xheWVyJyxcbiAgICBQYXlCeUJhbmsgPSAncGF5X2J5X2JhbmsnLFxuICAgIFByb3RlY3RMaW5rZWRCYW5rID0gJ3Byb3RlY3RfbGlua2VkX2JhbmsnLFxuICAgIFByb3RlY3RUcmFuc2FjdGlvbnMgPSAncHJvdGVjdF90cmFuc2FjdGlvbnMnXG59XG5cbi8qKlxuICogVGhlIHJlYXNvbiBmb3IgdGVybWluYXRpbmcgcHJvZHVjdHMuICBgRlJBVURfRklSU1RfUEFSVFlgOiBUaGUgZW5kIHVzZXIgd2hvIG93bnMgdGhlIGNvbm5lY3RlZCBiYW5rIGFjY291bnQgY29tbWl0dGVkIGZyYXVkIHVzaW5nIHRoZWlyIHJlYWwgaWRlbnRpdHkgYEZSQVVEX0ZBTFNFX0lERU5USVRZYDogVGhlIGNvbm5lY3Rpb24gd2FzIGNyZWF0ZWQgdXNpbmcgYSBmYWxzZSBvciBzdG9sZW4gaWRlbnRpdHkgYEZSQVVEX0FCVVNFYDogVGhlIGVuZCB1c2VyIGlzIGFidXNpbmcgdGhlIGNsaWVudFxcJ3Mgc2VydmljZSBvciBwbGF0Zm9ybSAoZm9yIGV4YW1wbGUsIGF1dG9tYXRpb24gb3IgZXhjZXNzaXZlIHJldHJpZXMpIHRocm91Z2ggdGhlaXIgY29ubmVjdGVkIGFjY291bnQgYEZSQVVEX09USEVSYDogRnJhdWQtcmVsYXRlZCwgYnV0IG5vdCBjb3ZlcmVkIGJ5IHRoZSBzcGVjaWZpYyBmcmF1ZCBjYXRlZ29yaWVzIGFib3ZlOyBgcmVhc29uX25vdGVgIHNob3VsZCBjbGFyaWZ5IGBGUkFVRF9UUkFOU0FDVElPTmA6IEZyYXVkIG9jY3VycmVkIGF0IHRoZSB0cmFuc2FjdGlvbiBsZXZlbCwgc3VjaCBhcyBhbiB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb24sIGNhcmQgdGVzdGluZywgY2hhcmdlYmFjaywgQUNIIHJldHVybiwgb3IgZGlzcHV0ZSBgQ09OU1VNRVJfTE9BTl9QQUlEX09GRmA6IFRoZSBlbmQgdXNlciBwYWlkIG9mZiB0aGVpciBsb2FuIGFuZCBubyBsb25nZXIgbmVlZHMgdGhlIHByb2R1Y3QgYENPTlNVTUVSX0FDQ09VTlRfQ0xPU0VEYDogVGhlIGVuZCB1c2VyIGNsb3NlZCB0aGVpciBhY2NvdW50IHdpdGggdGhlIGNsaWVudCBhbmQgbm8gbG9uZ2VyIG5lZWRzIHRoZSBwcm9kdWN0IGBDT05TVU1FUl9DSEFSR0VfT0ZGYDogVGhlIGVuZCB1c2VyXFwncyBhY2NvdW50IGhhcyBiZWVuIGNoYXJnZWQgb2ZmIGBDT05TVU1FUl9QQVlNRU5UX01FVEhPRF9TV0lUQ0hFRGA6IFRoZSBlbmQgdXNlciBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBwYXltZW50IG1ldGhvZCBhbmQgbm8gbG9uZ2VyIG5lZWRzIHRoZSBwcm9kdWN0IGBVU0VSX09GRkJPQVJESU5HYDogVGhlIHVzZXIgaXMgb2ZmYm9hcmRpbmcgZnJvbSB0aGUgY2xpZW50XFwncyBzZXJ2aWNlIG9yIHBsYXRmb3JtIGBEVVBMSUNBVEVfSVRFTWA6IFRoaXMgSXRlbSBpcyBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIGFjdGl2ZSBJdGVtIGZvciB0aGUgc2FtZSB1c2VyIGBCSUxMSU5HX1RFUk1JTkFUSU9OYDogVGhlIGNsaWVudFxcJ3MgYmlsbGluZyBvciBzdWJzY3JpcHRpb24gcmVsYXRpb25zaGlwIHdpdGggdGhlIGVuZCB1c2VyIGhhcyBlbmRlZCBgT1RIRVJgOiBOb25lIG9mIHRoZSBhYm92ZTsgYHJlYXNvbl9ub3RlYCBzaG91bGQgY2xhcmlmeSBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RzVGVybWluYXRlUmVhc29uQ29kZSB7XG4gICAgRnJhdWRGaXJzdFBhcnR5ID0gJ0ZSQVVEX0ZJUlNUX1BBUlRZJyxcbiAgICBGcmF1ZEZhbHNlSWRlbnRpdHkgPSAnRlJBVURfRkFMU0VfSURFTlRJVFknLFxuICAgIEZyYXVkQWJ1c2UgPSAnRlJBVURfQUJVU0UnLFxuICAgIEZyYXVkT3RoZXIgPSAnRlJBVURfT1RIRVInLFxuICAgIEZyYXVkVHJhbnNhY3Rpb24gPSAnRlJBVURfVFJBTlNBQ1RJT04nLFxuICAgIENvbnN1bWVyTG9hblBhaWRPZmYgPSAnQ09OU1VNRVJfTE9BTl9QQUlEX09GRicsXG4gICAgQ29uc3VtZXJBY2NvdW50Q2xvc2VkID0gJ0NPTlNVTUVSX0FDQ09VTlRfQ0xPU0VEJyxcbiAgICBDb25zdW1lckNoYXJnZU9mZiA9ICdDT05TVU1FUl9DSEFSR0VfT0ZGJyxcbiAgICBDb25zdW1lclBheW1lbnRNZXRob2RTd2l0Y2hlZCA9ICdDT05TVU1FUl9QQVlNRU5UX01FVEhPRF9TV0lUQ0hFRCcsXG4gICAgVXNlck9mZmJvYXJkaW5nID0gJ1VTRVJfT0ZGQk9BUkRJTkcnLFxuICAgIER1cGxpY2F0ZUl0ZW0gPSAnRFVQTElDQVRFX0lURU0nLFxuICAgIEJpbGxpbmdUZXJtaW5hdGlvbiA9ICdCSUxMSU5HX1RFUk1JTkFUSU9OJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvZmlsZS9uZXR3b3JrX3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IE5ldHdvcmtTdGF0dXNHZXRVc2VyO1xufVxuLyoqXG4gKiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV0d29ya19zdGF0dXM6IE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZU5ldHdvcmtTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB2YWxpZCBuYW1lIG1hdGNoaW5nIHNlbnNpdGl2aXR5IGNvbmZpZ3VyYXRpb25zIGZvciBhIHNjcmVlbmluZyBwcm9ncmFtLiBOb3RlIHRoYXQgd2hpbGUgY2VydGFpbiBtYXRjaGluZyB0ZWNobmlxdWVzIG1heSBiZSBtb3JlIHByZXZhbGVudCBvbiBsZXNzIHN0cmljdCBzZXR0aW5ncywgYWxsIG1hdGNoaW5nIGFsZ29yaXRobXMgYXJlIGVuYWJsZWQgZm9yIGV2ZXJ5IHNlbnNpdGl2aXR5LiAgYGNvYXJzZWAgLSBTZWUgbW9yZSBwb3RlbnRpYWwgbWF0Y2hlcy4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIHNlZSBtb3JlIGJyb2FkIHBob25ldGljIG1hdGNoZXMgYWNyb3NzIGFscGhhYmV0cyB0aGF0IG1ha2UgbWlzc2luZyBhIHBvdGVudGlhbCBoaXQgdmVyeSB1bmxpa2VseS4gVGhpcyBzZXR0aW5nIGlzIG5vaXNpZXIgYW5kIHdpbGwgcmVxdWlyZSBtb3JlIG1hbnVhbCByZXZpZXcuICBgYmFsYW5jZWRgIC0gQSBnb29kIGRlZmF1bHQgZm9yIG1vc3QgY29tcGFuaWVzLiBUaGlzIHNlbnNpdGl2aXR5IGlzIGJhbGFuY2VkIHRvIHNob3cgaGlnaCBxdWFsaXR5IGhpdHMgd2l0aCByZWR1Y2VkIG5vaXNlLiAgYHN0cmljdGAgLSBBZ2dyZXNzaXZlIGZhbHNlIHBvc2l0aXZlIHJlZHVjdGlvbi4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIHJlcXVpcmUgbmFtZXMgdG8gYmUgbW9yZSBzaW1pbGFyIHRoYW4gYGNvYXJzZWAgYW5kIGBiYWxhbmNlZGAgc2V0dGluZ3MsIHJlbHlpbmcgbGVzcyBvbiBwaG9uZXRpY3MsIHdoaWxlIHN0aWxsIGFjY291bnRpbmcgZm9yIGNoYXJhY3RlciB0cmFuc3Bvc2l0aW9ucywgbWlzc2luZyB0b2tlbnMsIGFuZCBvdGhlciBjb21tb24gcGVybXV0YXRpb25zLiAgYGV4YWN0YCAtIE1hdGNoZXMgbXVzdCBiZSBuZWFybHkgZXhhY3QuIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCBvbmx5IHNob3cgaGl0cyB3aXRoIGV4YWN0IG9yIG5lYXJseSBleGFjdCBuYW1lIG1hdGNoZXMgd2l0aCBvbmx5IGJhc2ljIGNvcnJlY3Rpb24gc3VjaCBhcyBleHRyYW5lb3VzIHN5bWJvbHMgYW5kIGNhcGl0YWxpemF0aW9uLiBUaGlzIHNldHRpbmcgaXMgZ2VuZXJhbGx5IG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IGhhdmUgYSB2ZXJ5IHNwZWNpZmljIHVzZSBjYXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZ3JhbU5hbWVTZW5zaXRpdml0eSB7XG4gICAgQ29hcnNlID0gJ2NvYXJzZScsXG4gICAgQmFsYW5jZWQgPSAnYmFsYW5jZWQnLFxuICAgIFN0cmljdCA9ICdzdHJpY3QnLFxuICAgIEV4YWN0ID0gJ2V4YWN0J1xufVxuXG4vKipcbiAqIFRoZSBlbXBsb3llZVxcJ3MgZXN0aW1hdGVkIGFubnVhbCBzYWxhcnksIGFzIGRlcml2ZWQgZnJvbSBpbmZvcm1hdGlvbiByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBCYW5rIGFjY291bnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmNpZGVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdEJhbmtBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEJhbmtBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZ1bGwgYWNjb3VudCBudW1iZXIgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0QmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUm91dGluZyBudW1iZXIgb2YgdGhlIGJhbmsgYWNjb3VudC4gTXVzdCBiZSBwcmVzZW50IGlmIGBhY2NvdW50X251bWJlcmAgaXMgcHJlc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0QmFua0FjY291bnRcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgb2JqZWN0IGZvciAvcHJvdGVjdC9jb21wdXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RDb21wdXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RDb21wdXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgVHJ1c3QgSW5kZXggbW9kZWwgdG8gdXNlIGZvciBzY29yaW5nLCB3aXRoIGEgbWFqb3IubWlub3IgdmVyc2lvbiBzdWZmaXguIEV4YW1wbGVzOiBgdGktbGluay1zZXNzaW9uLTIuMGAgKGxpbmstc2Vzc2lvbiBmcmF1ZCksIGB0aS1pZGVudGl0eS0yLjBgIChpZGVudGl0eSBmcmF1ZCksIGBjYXNoLWFkdmFuY2Utb25ib2FyZGluZy0xLjBgIChmaXJzdCBjYXNoIGFkdmFuY2UpLCBhbmQgYGNhc2gtYWR2YW5jZS1vbmdvaW5nLTEuMGAgKHN1YnNlcXVlbnQgY2FzaCBhZHZhbmNlcykuIFRoZSBtb2RlbCBzcGVjaWZpZWQgbWF5IHJlcXVpcmUgY2VydGFpbiBmaWVsZHMgd2l0aGluIGBtb2RlbF9pbnB1dHNgOyBmb3IgZXhhbXBsZSwgYHRpLWxpbmstc2Vzc2lvbi0yLjBgIHJlcXVpcmVzIHRoZSBgbGlua2AgZmllbGQuIENhc2gtYWR2YW5jZSBtb2RlbHMgZG8gbm90IHVzZSBgbW9kZWxfaW5wdXRzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogUHJvdGVjdFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RNb2RlbElucHV0c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgbW9kZWxfaW5wdXRzPzogUHJvdGVjdE1vZGVsSW5wdXRzIHwgbnVsbDtcbn1cbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciAvcHJvdGVjdC9jb21wdXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RDb21wdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgVHJ1c3QgSW5kZXggc2NvcmUsIG9uIGEgMC0xMDAgc2NhbGUgd2hlcmUgaGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciByaXNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb25lZCBuYW1lIG9mIHRoZSBUcnVzdCBJbmRleCBtb2RlbCB1c2VkIGZvciBzY29yaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RlbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFdmVudCBmcmF1ZCBhdHRyaWJ1dGVzIGFzIGFuIGFyYml0cmFyeSBzZXQgb2Yga2V5LXZhbHVlIHBhaXJzLiBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgcmV0dXJuZWQgdmFyaWVzIGJ5IG1vZGVsLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF0dHJpYnV0ZXM/OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RDb21wdXRlU3Vic2NvcmVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3Vic2NvcmVzPzogUHJvdGVjdENvbXB1dGVTdWJzY29yZXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgVHJ1c3QgSW5kZXggc2NvcmUgYW5kIGZyYXVkIGF0dHJpYnV0ZXMgd2VyZSBjb21wdXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGltZXN0YW1wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGVyLWJ1Y2tldCBzdWJzY29yZXMgcmV0dXJuZWQgYWxvbmdzaWRlIHRoZSBvdmVyYWxsIFRydXN0IEluZGV4IHNjb3JlLiBGb3IgY2FzaC1hZHZhbmNlIG1vZGVscywgZWFjaCBrZXkgbWFwcyB0byBhbiBhbW91bnQtYnVja2V0IHN1YnNjb3JlICgwLTEwMCk7IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgZnJhdWQgcmlzay4gT25seSBidWNrZXRzIHRoYXQgd2VyZSBzY29yZWQgYXJlIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0Q29tcHV0ZVN1YnNjb3JlcyB7XG4gICAgLyoqXG4gICAgICogU3Vic2NvcmUgZm9yIGNhc2ggYWR2YW5jZSBhbW91bnRzIGluIHRoZSByYW5nZSAkMC0kMjUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzBfMjU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1YnNjb3JlIGZvciBjYXNoIGFkdmFuY2UgYW1vdW50cyBpbiB0aGUgcmFuZ2UgJDI1LSQ1MC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVN1YnNjb3Jlc1xuICAgICAqL1xuICAgIGNhc2hfYWR2YW5jZV9idWNrZXRfMjVfNTA/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1YnNjb3JlIGZvciBjYXNoIGFkdmFuY2UgYW1vdW50cyBpbiB0aGUgcmFuZ2UgJDUwLSQxMDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzUwXzEwMD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3Vic2NvcmUgZm9yIGNhc2ggYWR2YW5jZSBhbW91bnRzIGluIHRoZSByYW5nZSAkMTAwLSQyMDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzEwMF8yMDA/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1YnNjb3JlIGZvciBjYXNoIGFkdmFuY2UgYW1vdW50cyBpbiB0aGUgcmFuZ2UgJDIwMC0kMzAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RDb21wdXRlU3Vic2NvcmVzXG4gICAgICovXG4gICAgY2FzaF9hZHZhbmNlX2J1Y2tldF8yMDBfMzAwPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdWJzY29yZSBmb3IgY2FzaCBhZHZhbmNlIGFtb3VudHMgaW4gdGhlIHJhbmdlICQzMDAtJDQwMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0Q29tcHV0ZVN1YnNjb3Jlc1xuICAgICAqL1xuICAgIGNhc2hfYWR2YW5jZV9idWNrZXRfMzAwXzQwMD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3Vic2NvcmUgZm9yIGNhc2ggYWR2YW5jZSBhbW91bnRzIGluIHRoZSByYW5nZSAkNDAwLSQ1MDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdENvbXB1dGVTdWJzY29yZXNcbiAgICAgKi9cbiAgICBjYXNoX2FkdmFuY2VfYnVja2V0XzQwMF81MDA/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBFdmVudCBkYXRhIGZvciBQcm90ZWN0IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBldmVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBwcmVzZW50LCBjb250YWlucyB0aGUgY3VycmVudCBQcm90ZWN0IFNlc3Npb24gSUQgZnJvbSB0aGUgUHJvdGVjdCBTREsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50XG4gICAgICovXG4gICAgcHJvdGVjdF9zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgdHlwZSByZXByZXNlbnRzIGEgdXNlciB2aXNpdGluZyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50XG4gICAgICovXG4gICAgYXBwX3Zpc2l0PzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgdHlwZSByZXByZXNlbnRzIGEgdXNlciBzaWduaW5nIGluIHRvIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFxuICAgICAqL1xuICAgIHVzZXJfc2lnbl9pbj86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IHR5cGUgcmVwcmVzZW50cyBhIHVzZXIgc2lnbmluZyB1cCBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50XG4gICAgICovXG4gICAgdXNlcl9zaWduX3VwPzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0gfCBudWxsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IG9iamVjdCBmb3IgL3Byb3RlY3QvZXZlbnQvZ2V0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RFdmVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IElEIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciAvcHJvdGVjdC9ldmVudC9nZXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0RXZlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBldmVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcnVzdEluZGV4fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRydXN0X2luZGV4PzogVHJ1c3RJbmRleCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXZlbnQgZnJhdWQgYXR0cmlidXRlcyBhcyBhbiBhcmJpdHJhcnkgc2V0IG9mIGtleS12YWx1ZSBwYWlycy4gVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHJldHVybmVkIHZhcmllcyBieSBtb2RlbC5cbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfYXR0cmlidXRlcz86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgb2JqZWN0IGZvciAvcHJvdGVjdC9ldmVudC9zZW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBvZiB0aGUgZXZlbnQuIE1pZ2h0IGJlIHRoZSBjdXJyZW50IG1vbWVudCBvciBhIHRpbWUgaW4gdGhlIHBhc3QuIEluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RFdmVudH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudDogUHJvdGVjdEV2ZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcm90ZWN0IFNlc3Npb24gSUQgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciBhbnkgZXZlbnQgY29ycmVsYXRlZCB3aXRoIGEgZnJvbnRlbmQgdXNlciBzZXNzaW9uIHN0YXJ0ZWQgdmlhIHRoZSBQcm90ZWN0IFNESy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRTZW5kUmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3Rfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHNjb3JlZCB3aXRoIFRydXN0IEluZGV4LiBUaGUgZGVmYXVsdCBpcyBmYWxzZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1ZXN0X3RydXN0X2luZGV4PzogYm9vbGVhbjtcbn1cbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciAvcHJvdGVjdC9ldmVudC9zZW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RFdmVudFNlbmRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RFdmVudFNlbmRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSByZWNvcmRlZCBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRTZW5kUmVzcG9uc2VcbiAgICAgKi9cbiAgICBldmVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcnVzdEluZGV4fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRTZW5kUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cnVzdF9pbmRleD86IFRydXN0SW5kZXggfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGZyYXVkIGF0dHJpYnV0ZXMgYXMgYW4gYXJiaXRyYXJ5IHNldCBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZSBzZXQgb2YgYXR0cmlidXRlcyByZXR1cm5lZCB2YXJpZXMgYnkgbW9kZWwuXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRTZW5kUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hdHRyaWJ1dGVzPzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0RXZlbnRTZW5kUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBtb25ldGFyeSBhbW91bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmNpZGVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdEluY2lkZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEluY2lkZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgaW5jaWRlbnQgYW1vdW50LiBEZWZhdWx0cyB0byBgVVNEYCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEFtb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9uZXRhcnkgdmFsdWUgb2YgdGhlIGluY2lkZW50IGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBpbmNpZGVudCBldmVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdEluY2lkZW50RXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0SW5jaWRlbnRFdmVudCB7XG4gICAgLyoqXG4gICAgICogQSBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgYSBQcm90ZWN0IGV2ZW50IHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gICAgICovXG4gICAgcHJvdGVjdF9ldmVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBMaW5rIHNlc3Npb24gdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBzZXNzaW9uIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gICAgICovXG4gICAgaWR2X3Nlc3Npb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdXNlZCB0byByZWZlciB0byBhIFNpZ25hbCB0cmFuc2FjdGlvbiBldmFsdWF0aW9uIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gICAgICovXG4gICAgc2lnbmFsX2NsaWVudF90cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBpbmNpZGVudCBpbiB5b3VyIHN5c3RlbS4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gICAgICovXG4gICAgaW50ZXJuYWxfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGluY2lkZW50IG9jY3VycmVkLCBpbiBJU08gODYwMSBmb3JtYXQgKGUuZy4sIFxcJzIwMjAtMDctMjRUMDM6MjY6MDJaXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIHRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0SW5jaWRlbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gICAgICovXG4gICAgYW1vdW50PzogUHJvdGVjdEluY2lkZW50QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIHJlbGF0ZWQgdG8gdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBgaXRlbV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIHJlbGF0ZWQgdG8gdGhpcyBpbmNpZGVudC4gVG8gaWRlbnRpZnkgYW4gSXRlbSB3aGVuIGNyZWF0aW5nIGEgcmVwb3J0LCBwcm92aWRlIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGluY2lkZW50IGV2ZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgYSBQcm90ZWN0IGV2ZW50IHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm90ZWN0X2V2ZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIExpbmsgc2Vzc2lvbiB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gc2Vzc2lvbiB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlXG4gICAgICovXG4gICAgaWR2X3Nlc3Npb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdXNlZCB0byByZWZlciB0byBhIFNpZ25hbCB0cmFuc2FjdGlvbiBldmFsdWF0aW9uIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaWduYWxfY2xpZW50X3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGluY2lkZW50IGluIHlvdXIgc3lzdGVtLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZVxuICAgICAqL1xuICAgIGludGVybmFsX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBpbmNpZGVudCBvY2N1cnJlZCwgaW4gSVNPIDg2MDEgZm9ybWF0IChlLmcuLCBcXCcyMDIwLTA3LTI0VDAzOjI2OjAyWlxcJykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZVxuICAgICAqL1xuICAgIHRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0SW5jaWRlbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBQcm90ZWN0SW5jaWRlbnRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIHJlbGF0ZWQgdG8gdGhpcyBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0SW5jaWRlbnRFdmVudFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIElucHV0cyBmb3IgbGluayBzZXNzaW9uIFRydXN0IEluZGV4IG1vZGVscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdExpbmtNb2RlbElucHV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RMaW5rTW9kZWxJbnB1dHMge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24sIHVzZWQgdG8gY29tcHV0ZSBhIFRydXN0IEluZGV4IHNjb3JlIGFuZCBmcmF1ZCBhdHRyaWJ1dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RMaW5rTW9kZWxJbnB1dHNcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIHRyYW5zYWN0aW9uIGV4dHJhY3Rpb24gbXVzdCBiZSBjb21wbGV0ZSBiZWZvcmUgc2NvcmluZy4gSWYgYGZhbHNlYCAoZGVmYXVsdCksIHJldHVybnMgYSBzY29yZSB3aGV0aGVyIG9yIG5vdCB0cmFuc2FjdGlvbiBleHRyYWN0aW9uIGlzIGNvbXBsZXRlLCBhcyBsb25nIGFzIHRoZSBsaW5rIHNlc3Npb24gaXMgZmluaXNoZWQ7IGlmIGRhdGEgaGFzIGJlZW4gZXh0cmFjdGVkIGl0IHdpbGwgc3RpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHNjb3JlIGNvbXB1dGF0aW9uLiBJZiBgdHJ1ZWAsIHJldHVybnMgSFRUUCA0MDAgd2l0aCBgZXJyb3JfdHlwZWAgPSBgSU5WQUxJRF9SRVFVRVNUYCBhbmQgYGVycm9yX2NvZGVgID0gYEZBSUxFRF9QUkVDT05ESVRJT05gIGlmIGV4dHJhY3Rpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3M7IG9uY2UgZGF0YSBpcyByZWFkeSBhIHNjb3JlIHdpbGwgYmUgcmV0dXJuZWQgbm9ybWFsbHkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RMaW5rTW9kZWxJbnB1dHNcbiAgICAgKi9cbiAgICByZXF1aXJlX2V4dHJhY3RlZF9kYXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW5wdXRzIHJlcXVpcmVkIGJ5IGNlcnRhaW4gVHJ1c3QgSW5kZXggbW9kZWxzLiBUaGUgYGxpbmtgIGZpZWxkIGlzIHJlcXVpcmVkIGZvciBsaW5rLXNlc3Npb24gbW9kZWxzLiBPdGhlciBtb2RlbCBmYW1pbGllcyAoaW5jbHVkaW5nIGNhc2gtYWR2YW5jZSkgYXJlIGlkZW50aWZpZWQgYnkgYHVzZXJgIGFsb25lIGFuZCBkbyBub3QgdXNlIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0TW9kZWxJbnB1dHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0TW9kZWxJbnB1dHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0TGlua01vZGVsSW5wdXRzfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0TW9kZWxJbnB1dHNcbiAgICAgKi9cbiAgICBsaW5rPzogUHJvdGVjdExpbmtNb2RlbElucHV0cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RTREtNb2RlbElucHV0c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdE1vZGVsSW5wdXRzXG4gICAgICovXG4gICAgc2RrPzogUHJvdGVjdFNES01vZGVsSW5wdXRzIHwgbnVsbDtcbn1cbi8qKlxuICogQSBQcm90ZWN0IHJlcG9ydCBhc3NvY2lhdGVkIHdpdGggYSB1c2VyLiBDb250YWlucyBkZXRhaWxzIGFib3V0IGRvY3VtZW50ZWQgaW5jaWRlbnRzLCB3aGljaCBtYXkgaW5jbHVkZSBmcmF1ZCwgaW52ZXN0aWdhdGlvbiBvdXRjb21lcywgb3Igb3RoZXIgcmlzayBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0UmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB0aGUgc3VibWl0dGVkIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RJbmNpZGVudEV2ZW50UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRcbiAgICAgKi9cbiAgICBpbmNpZGVudF9ldmVudDogUHJvdGVjdEluY2lkZW50RXZlbnRSZXNwb25zZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RSZXBvcnRDb25maWRlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2NvbmZpZGVuY2U6IFByb3RlY3RSZXBvcnRDb25maWRlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0UmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBQcm90ZWN0UmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdFJlcG9ydFNvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9zb3VyY2U6IFByb3RlY3RSZXBvcnRTb3VyY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RCYW5rQWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydFxuICAgICAqL1xuICAgIGJhbmtfYWNjb3VudDogUHJvdGVjdEJhbmtBY2NvdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBQ0ggcmV0dXJuIGNvZGUgaWYgdGhlIHJlcG9ydCB0eXBlIGlzIGBBQ0hfUkVUVVJOYCAoZS5nLiBgUjAxYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydFxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGNvbnRleHQgb3IgZGV0YWlscyBhYm91dCB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRcbiAgICAgKi9cbiAgICBub3Rlczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gSVNPIDg2MDEgZm9ybWF0IChlLmcuLCBcXCcyMDIwLTA3LTI0VDAzOjI2OjAyWlxcJykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNvbmZpZGVuY2UgbGV2ZWwgb2YgdGhlIGluY2lkZW50IHJlcG9ydC4gYENPTkZJUk1FRGAgaW5kaWNhdGVzIHRoZSBpbmNpZGVudCBoYXMgYmVlbiB2ZXJpZmllZCBhbmQgZGVmaW5pdGl2ZWx5IG9jY3VycmVkLiAgYFNVU1BFQ1RFRGAgaW5kaWNhdGVzIHRoZSBpbmNpZGVudCBpcyBiZWxpZXZlZCB0byBoYXZlIG9jY3VycmVkIGJ1dCBoYXMgbm90IGJlZW4gZnVsbHkgdmVyaWZpZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm90ZWN0UmVwb3J0Q29uZmlkZW5jZSB7XG4gICAgQ29uZmlybWVkID0gJ0NPTkZJUk1FRCcsXG4gICAgU3VzcGVjdGVkID0gJ1NVU1BFQ1RFRCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IG9iamVjdCBmb3IgYC9wcm90ZWN0L3JlcG9ydC9jcmVhdGVgLiBZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBgdXNlcl9pZGAsIG9yIGFuIGBpbmNpZGVudF9ldmVudGAgd2l0aCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIGlkZW50aWZpZXI6IGBsaW5rX3Nlc3Npb25faWRgLCBgaWR2X3Nlc3Npb25faWRgLCBgcHJvdGVjdF9ldmVudF9pZGAsIGBzaWduYWxfY2xpZW50X3RyYW5zYWN0aW9uX2lkYCwgb3IgYGFjY2Vzc190b2tlbmAuIENvbnRleHQgZmllbGRzIHN1Y2ggYXMgYGludGVybmFsX3JlZmVyZW5jZWAsIGB0aW1lYCwgYGFtb3VudGAsIGFuZCBgYmFua19hY2NvdW50YCBkbyBub3Qgc2F0aXNmeSB0aGlzIGlkZW50aWZpZXIgcmVxdWlyZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBVc2VyIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdEluY2lkZW50RXZlbnR9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jaWRlbnRfZXZlbnQ/OiBQcm90ZWN0SW5jaWRlbnRFdmVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RSZXBvcnRDb25maWRlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF9jb25maWRlbmNlOiBQcm90ZWN0UmVwb3J0Q29uZmlkZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvdGVjdFJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFByb3RlY3RSZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm90ZWN0UmVwb3J0U291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF9zb3VyY2U6IFByb3RlY3RSZXBvcnRTb3VyY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3RlY3RCYW5rQWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX2FjY291bnQ/OiBQcm90ZWN0QmFua0FjY291bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gYFIwMWApLCByZXF1aXJlZCBpZiBgcmVwb3J0X3R5cGVgIGlzIGBBQ0hfUkVUVVJOYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBjb250ZXh0IG9yIGRldGFpbHMgYWJvdXQgdGhlIHJlcG9ydCwgcmVxdWlyZWQgaWYgYHJlcG9ydF90eXBlYCBpcyBgT1RIRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbm90ZXM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXNwb25zZSBvYmplY3QgZm9yIC9wcm90ZWN0L3JlcG9ydC9jcmVhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdFJlcG9ydENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB0aGUgc3VibWl0dGVkIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc291cmNlIHRoYXQgaWRlbnRpZmllZCBvciByZXBvcnRlZCB0aGUgaW5jaWRlbnQuICBgSU5URVJOQUxfUkVWSUVXYCAtIEluY2lkZW50IHdhcyBpZGVudGlmaWVkIHRocm91Z2ggaW50ZXJuYWwgZnJhdWQgaW52ZXN0aWdhdGlvbnMgb3IgcmV2aWV3IHByb2Nlc3Nlcy4gIGBVU0VSX1NFTEZfUkVQT1JURURgIC0gSW5jaWRlbnQgd2FzIHJlcG9ydGVkIGRpcmVjdGx5IGJ5IHRoZSBhZmZlY3RlZCB1c2VyLiAgYEJBTktfRkVFREJBQ0tgIC0gSW5jaWRlbnQgd2FzIGlkZW50aWZpZWQgdGhyb3VnaCBiYW5rIGZlZWRiYWNrLCBpbmNsdWRpbmcgQUNIIHJldHVybnMgYW5kIGNvbm5lY3Rpb24gcmV2b2NhdGlvbnMuICBgTkVUV09SS19GRUVEQkFDS2AgLSBJbmNpZGVudCB3YXMgaWRlbnRpZmllZCB0aHJvdWdoIGNhcmQgbmV0d29yayBhbGVydHMgb3IgY2hhcmdlYmFja3MuICBgQVVUT01BVEVEX1NZU1RFTWAgLSBJbmNpZGVudCB3YXMgZGV0ZWN0ZWQgYnkgYXV0b21hdGVkIHN5c3RlbXMgc3VjaCBhcyBmcmF1ZCBtb2RlbHMgb3IgcnVsZSBlbmdpbmVzLiAgYFRISVJEX1BBUlRZX0FMRVJUYCAtIEluY2lkZW50IHdhcyBpZGVudGlmaWVkIHRocm91Z2ggZXh0ZXJuYWwgdmVuZG9yIG9yIGNvbnNvcnRpdW0gYWxlcnRzLiAgYE9USEVSYCAtIEluY2lkZW50IHdhcyBpZGVudGlmaWVkIHRocm91Z2ggYSBzb3VyY2Ugbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb3RlY3RSZXBvcnRTb3VyY2Uge1xuICAgIEludGVybmFsUmV2aWV3ID0gJ0lOVEVSTkFMX1JFVklFVycsXG4gICAgVXNlclNlbGZSZXBvcnRlZCA9ICdVU0VSX1NFTEZfUkVQT1JURUQnLFxuICAgIEJhbmtGZWVkYmFjayA9ICdCQU5LX0ZFRURCQUNLJyxcbiAgICBOZXR3b3JrRmVlZGJhY2sgPSAnTkVUV09SS19GRUVEQkFDSycsXG4gICAgQXV0b21hdGVkU3lzdGVtID0gJ0FVVE9NQVRFRF9TWVNURU0nLFxuICAgIFRoaXJkUGFydHlBbGVydCA9ICdUSElSRF9QQVJUWV9BTEVSVCcsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgaW5jaWRlbnQgYmVpbmcgcmVwb3J0ZWQuICBgVVNFUl9BQ0NPVU5UX1RBS0VPVkVSYCAtIEluZGljYXRlcyB0aGF0IGEgbGVnaXRpbWF0ZSB1c2VyXFwncyBhY2NvdW50IHdhcyBhY2Nlc3NlZCBvciBjb250cm9sbGVkIGJ5IGFuIHVuYXV0aG9yaXplZCBwYXJ0eS4gIGBGQUxTRV9JREVOVElUWWAgLSBJbmRpY2F0ZXMgdGhhdCBhIHVzZXIgY3JlYXRlZCBhbiBhY2NvdW50IHVzaW5nIHN0b2xlbiBvciBmYWJyaWNhdGVkIGlkZW50aXR5IGluZm9ybWF0aW9uLiAgYFNUT0xFTl9JREVOVElUWWAgLSBJbmRpY2F0ZXMgdGhhdCBhIHVzZXIgY3JlYXRlZCBhbiBhY2NvdW50IHVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIGJlbG9uZ2luZyB0byBhIHJlYWwgaW5kaXZpZHVhbCB3aXRob3V0IHRoZWlyIGNvbnNlbnQuICBgU1lOVEhFVElDX0lERU5USVRZYCAtIEluZGljYXRlcyB0aGF0IGEgdXNlciBjcmVhdGVkIGFuIGFjY291bnQgdXNpbmcgYSBmYWtlIG9yIHBhcnRpYWxseSBmYWJyaWNhdGVkIGlkZW50aXR5IChlLmcuLCBjb21iaW5pbmcgcmVhbCBhbmQgZmFrZSBpbmZvcm1hdGlvbiB0byBmb3JtIGEgbmV3IHBlcnNvbmEpLiAgYE1VTFRJUExFX1VTRVJfQUNDT1VOVFNgIC0gSW5kaWNhdGVzIHRoYXQgdGhlIHNhbWUgaW5kaXZpZHVhbCBpcyBvcGVyYXRpbmcgbXVsdGlwbGUgYWNjb3VudHMgaW4gdmlvbGF0aW9uIG9mIHBvbGljeS4gIGBTQ0FNX1ZJQ1RJTWAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciB3YXMgdHJpY2tlZCBpbnRvIGF1dGhvcml6aW5nIG9yIHNlbmRpbmcgZnVuZHMgYXMgcGFydCBvZiBhIHNjYW0uICBgQkFOS19BQ0NPVU5UX1RBS0VPVkVSYCAtIEluZGljYXRlcyB0aGF0IGEgdXNlclxcJ3MgbGlua2VkIGJhbmsgYWNjb3VudCB3YXMgYWNjZXNzZWQgb3IgbWlzdXNlZCBieSBhbiB1bmF1dGhvcml6ZWQgcGFydHkuICBgQkFOS19DT05ORUNUSU9OX1JFVk9LRURgIC0gSW5kaWNhdGVzIHRoYXQgYSBsaW5rZWQgYmFuayBhY2NvdW50IGNvbm5lY3Rpb24gd2FzIHJldm9rZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgb2Z0ZW4gZHVlIHRvIHN1c3BlY3RlZCBtaXN1c2UsIGZyYXVkLCBvciBzZWN1cml0eSBjb25jZXJucy4gIGBDQVJEX1RFU1RJTkdgIC0gSW5kaWNhdGVzIHRoYXQgYSBjYXJkIHdhcyB1c2VkIGluIHNtYWxsIG9yIHJlcGVhdGVkIHRyYW5zYWN0aW9ucyB0byB0ZXN0IGl0cyB2YWxpZGl0eS4gIGBVTkFVVEhPUklaRURfVFJBTlNBQ1RJT05gIC0gSW5kaWNhdGVzIHRoYXQgYSB0cmFuc2FjdGlvbiB3YXMgbWFkZSB3aXRob3V0IHRoZSB1c2VyXFwncyBjb25zZW50IG9yIGF1dGhvcml6YXRpb24uICBgQ0FSRF9DSEFSR0VCQUNLYCAtIEluZGljYXRlcyB0aGF0IGEgY2FyZCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgdmlhIGEgY2hhcmdlYmFjayBjbGFpbS4gIGBBQ0hfUkVUVVJOYCAtIEluZGljYXRlcyB0aGF0IGFuIEFDSCB0cmFuc2FjdGlvbiB3YXMgcmV0dXJuZWQgb3IgcmV2ZXJzZWQgYnkgdGhlIGJhbmsuICBgRElTUFVURWAgLSBJbmRpY2F0ZXMgdGhhdCBhIHVzZXIgZmlsZWQgYSBkaXNwdXRlIHJlZ2FyZGluZyBhIHRyYW5zYWN0aW9uIG9yIGFjY291bnQgYWN0aXZpdHkuICBgRklSU1RfUEFSVFlfRlJBVURgIC0gSW5kaWNhdGVzIHRoYXQgYSB1c2VyIGludGVudGlvbmFsbHkgbWlzcmVwcmVzZW50ZWQgdGhlbXNlbHZlcyBvciB0aGVpciBhY3Rpb25zIGZvciBmaW5hbmNpYWwgZ2Fpbi4gIGBNSVNTRURfUEFZTUVOVGAgLSBJbmRpY2F0ZXMgdGhhdCBhIHVzZXIgZmFpbGVkIHRvIG1ha2UgYSByZXF1aXJlZCBwYXltZW50IG9uIHRpbWUuICBgTE9BTl9TVEFDS0lOR2AgLSBJbmRpY2F0ZXMgdGhhdCBhIHVzZXIgYXBwbGllZCBmb3Igb3IgdG9vayBvdXQgbXVsdGlwbGUgbG9hbnMgc2ltdWx0YW5lb3VzbHkgYmV5b25kIHRoZWlyIGFiaWxpdHkgdG8gcmVwYXkuICBgTU9ORVlfTEFVTkRFUklOR2AgLSBJbmRpY2F0ZXMgdGhhdCBmdW5kcyBhcmUgYmVpbmcgbW92ZWQgdGhyb3VnaCBhY2NvdW50cyB0byBvYnNjdXJlIHRoZWlyIGlsbGljaXQgb3JpZ2luLiAgYE5PX0ZSQVVEYCAtIEluZGljYXRlcyB0aGF0IGFuIGludmVzdGlnYXRpb24gZGV0ZXJtaW5lZCBubyBmcmF1ZHVsZW50IGFjdGl2aXR5IG9jY3VycmVkIG9uIHVzZXIvZXZlbnQgKHBvc2l0aXZlIGxhYmVsKS4gIGBPVEhFUmAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgY2FzZSBpbnZvbHZlcyBmcmF1ZCBvciBmaW5hbmNpYWwgcmlzayBub3QgY292ZXJlZCBieSBvdGhlciByZXBvcnQgdHlwZXMuIFJlcXVpcmVzIG5vdGVzIGRlc2NyaWJpbmcgdGhlIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb3RlY3RSZXBvcnRUeXBlIHtcbiAgICBVc2VyQWNjb3VudFRha2VvdmVyID0gJ1VTRVJfQUNDT1VOVF9UQUtFT1ZFUicsXG4gICAgRmFsc2VJZGVudGl0eSA9ICdGQUxTRV9JREVOVElUWScsXG4gICAgU3RvbGVuSWRlbnRpdHkgPSAnU1RPTEVOX0lERU5USVRZJyxcbiAgICBTeW50aGV0aWNJZGVudGl0eSA9ICdTWU5USEVUSUNfSURFTlRJVFknLFxuICAgIE11bHRpcGxlVXNlckFjY291bnRzID0gJ01VTFRJUExFX1VTRVJfQUNDT1VOVFMnLFxuICAgIFNjYW1WaWN0aW0gPSAnU0NBTV9WSUNUSU0nLFxuICAgIEJhbmtBY2NvdW50VGFrZW92ZXIgPSAnQkFOS19BQ0NPVU5UX1RBS0VPVkVSJyxcbiAgICBCYW5rQ29ubmVjdGlvblJldm9rZWQgPSAnQkFOS19DT05ORUNUSU9OX1JFVk9LRUQnLFxuICAgIENhcmRUZXN0aW5nID0gJ0NBUkRfVEVTVElORycsXG4gICAgVW5hdXRob3JpemVkVHJhbnNhY3Rpb24gPSAnVU5BVVRIT1JJWkVEX1RSQU5TQUNUSU9OJyxcbiAgICBDYXJkQ2hhcmdlYmFjayA9ICdDQVJEX0NIQVJHRUJBQ0snLFxuICAgIEFjaFJldHVybiA9ICdBQ0hfUkVUVVJOJyxcbiAgICBEaXNwdXRlID0gJ0RJU1BVVEUnLFxuICAgIEZpcnN0UGFydHlGcmF1ZCA9ICdGSVJTVF9QQVJUWV9GUkFVRCcsXG4gICAgTWlzc2VkUGF5bWVudCA9ICdNSVNTRURfUEFZTUVOVCcsXG4gICAgTG9hblN0YWNraW5nID0gJ0xPQU5fU1RBQ0tJTkcnLFxuICAgIE1vbmV5TGF1bmRlcmluZyA9ICdNT05FWV9MQVVOREVSSU5HJyxcbiAgICBOb0ZyYXVkID0gJ05PX0ZSQVVEJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBJbnB1dHMgZm9yIFByb3RlY3QgU0RLIFRydXN0IEluZGV4IG1vZGVscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdGVjdFNES01vZGVsSW5wdXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdFNES01vZGVsSW5wdXRzIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgUHJvdGVjdCBTREsgc2Vzc2lvbiwgdXNlZCB0byBjb21wdXRlIGEgVHJ1c3QgSW5kZXggc2NvcmUgYW5kIGZyYXVkIGF0dHJpYnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFNES01vZGVsSW5wdXRzXG4gICAgICovXG4gICAgc2RrX3Nlc3Npb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlbmQgdXNlciBmb3IgYC9wcm90ZWN0L2NvbXB1dGVgIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgVXNlciBJRCByZXR1cm5lZCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0byBgL3VzZXIvY3JlYXRlYC4gVGhpcyBvciBgY2xpZW50X3VzZXJfaWRgIGNhbiBiZSBwcm92aWRlZCwgbm90IGJvdGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIsIHByZXZpb3VzbHkgcGFzc2VkIHRvIGAvdXNlci9jcmVhdGVgLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlcmUgaGFzIGJlZW4gYSBuZXcgdXNlciBldmVudC4gVGhlIHdlYmhvb2sgcGF5bG9hZCBjb250YWlucyBsaW1pdGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudC4gRm9yIGZ1bGwgZXZlbnQgZGV0YWlscywgY2FsbCBbYC9wcm90ZWN0L2V2ZW50L2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3Byb3RlY3QvI3Byb3RlY3RldmVudGdldCkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdFVzZXJFdmVudFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiUFJPVEVDVFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJFdmVudFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPVEVDVF9VU0VSX0VWRU5UYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IElEIG9mIHRoZSB1c2VyIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJFdmVudFdlYmhvb2tcbiAgICAgKi9cbiAgICBldmVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHVzZXIgZXZlbnQgdGhhdCBvY2N1cnJlZC4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGUgYExJTktfQ09NUExFVEVgICh0aGUgTGluayBzZXNzaW9uIGhhcyBmaW5pc2hlZCBhbmQgYSBUcnVzdCBJbmRleCBzY29yZSBoYXMgYmVlbiBjb21wdXRlZCB3aXRob3V0IHdhaXRpbmcgZm9yIHRyYW5zYWN0aW9uIGV4dHJhY3Rpb24pIGFuZCBgUFJPVEVDVF9SVU5fRklOSVNIYCAoZXh0cmFjdGlvbi1yZXF1aXJlZCBzY29yaW5nIGlzIGNvbXBsZXRlLCBpbmNsdWRpbmcgdHJhbnNhY3Rpb24gZXh0cmFjdGlvbjsgbWF5IGFycml2ZSAzMCBzZWNvbmRzIG9yIG1vcmUgYWZ0ZXIgTGluayBjb21wbGV0aW9uKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckV2ZW50V2ViaG9va1xuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBldmVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckV2ZW50V2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBVc2VyIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF91c2VyX2lkYCBwcm92aWRlZCBieSB0aGUgY2xpZW50IHdoZW4gdGhlIHVzZXIgd2FzIGNyZWF0ZWQgdmlhIGAvdXNlci9jcmVhdGVgIG9yIExpbmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJFdmVudFdlYmhvb2tcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbiB0aGlzIGV2ZW50IG9jY3VycmVkIGluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJFdmVudFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VyRXZlbnRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBvYmplY3QgZm9yIC9wcm90ZWN0L3VzZXIvaW5zaWdodHMvZ2V0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBVc2VyIElELiBFaXRoZXIgYHVzZXJfaWRgIG9yIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gRWl0aGVyIGB1c2VyX2lkYCBvciBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciAvcHJvdGVjdC91c2VyL2luc2lnaHRzL2dldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBVc2VyIElELiBJZiBhIGBjbGllbnRfdXNlcl9pZGAgd2FzIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGluc3RlYWQgb2YgYSBgdXNlcl9pZGAsIGEgbmV3IGB1c2VyX2lkYCB3aWxsIGJlIGdlbmVyYXRlZCBpZiBvbmUgZG9lc25cXCd0IGFscmVhZHkgZXhpc3QgZm9yIHRoYXQgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xhdGVzdFNjb3JlZEV2ZW50fVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXRlc3Rfc2NvcmVkX2V2ZW50OiBMYXRlc3RTY29yZWRFdmVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQcm90ZWN0IHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXNlciwgbGltaXRlZCB0byB0aGUgbW9zdCByZWNlbnQgMTAwIHJlcG9ydHMgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyIChuZXdlc3QgZmlyc3QpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm90ZWN0UmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0cz86IEFycmF5PFByb3RlY3RSZXBvcnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbGVkIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIGEgYnVzaW5lc3MgZnJvbSBkYXRhIHByb3ZpZGVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJCdXNpbmVzc0FkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN1YmRpdmlzaW9uIGNvZGUuIFxcXCJTdWJkaXZpc2lvblxcXCIgaXMgYSBnZW5lcmljIHRlcm0gZm9yIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBldGMuIEZvciB0aGUgbGlzdCBvZiB2YWxpZCBjb2Rlcywgc2VlIFtjb3VudHJ5IHN1YmRpdmlzaW9uIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY291bnRyeV9zdWJkaXZpc2lvbl9jb2Rlcy5qc29uKS4gQ291bnRyeSBwcmVmaXhlcyBhcmUgb21pdHRlZCwgc2luY2UgdGhleSBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYGNvdW50cnlgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3ZpZGVyQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvdmlkZXJCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IGFkZHJlc3MgZm9yIHRoZSBidXNpbmVzc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm92aWRlckJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG59XG4vKipcbiAqIE5hbWUgYXNzb2NpYXRlZCB3aXRoIGEgYnVzaW5lc3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvdmlkZXJCdXNpbmVzc05hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckJ1c2luZXNzTmFtZSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyB0aGUgcHJpbWFyeSBuYW1lIGZvciB0aGUgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb3ZpZGVyQnVzaW5lc3NOYW1lXG4gICAgICovXG4gICAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFuZCBhIG1heGltdW0gbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb3ZpZGVyQnVzaW5lc3NOYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBuZXR3b3JrIHByb3h5IGlzIHByZXNlbnQgYW5kIGlmIHNvIHdoYXQgdHlwZSBpdCBpcy4gIGBub25lX2RldGVjdGVkYCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgbm90IG9uIGEgZGV0ZWN0YWJsZSBwcm94eSBuZXR3b3JrLiAgYHRvcmAgaW5kaWNhdGVzIHRoZSB1c2VyIHdhcyB1c2luZyBhIFRvciBicm93c2VyLCB3aGljaCBzZW5kcyBlbmNyeXB0ZWQgdHJhZmZpYyBvbiBhIGRlY2VudHJhbGl6ZWQgbmV0d29yayBhbmQgaXMgc29tZXdoYXQgc2ltaWxhciB0byBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspLiAgYHZwbmAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgVlBOIChWaXJ0dWFsIFByaXZhdGUgTmV0d29yaykgIGB3ZWJfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIG1heSBhbGxvdyB0aGVtIHRvIGNvbmNlYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGVpciBJUCBhZGRyZXNzIG9yIG90aGVyIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAgYHB1YmxpY19wcm94eWAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgcHVibGljIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gYSB3ZWIgcHJveHkgYnV0IGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdXNlcnMuIFRoaXMgbWF5IGFsbG93IG11bHRpcGxlIHVzZXJzIHRvIGFwcGVhciBhcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgSVAgYWRkcmVzcyBmb3IgaW5zdGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm94eVR5cGUge1xuICAgIE5vbmVEZXRlY3RlZCA9ICdub25lX2RldGVjdGVkJyxcbiAgICBUb3IgPSAndG9yJyxcbiAgICBWcG4gPSAndnBuJyxcbiAgICBXZWJQcm94eSA9ICd3ZWJfcHJveHknLFxuICAgIFB1YmxpY1Byb3h5ID0gJ3B1YmxpY19wcm94eSdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHJlYXNvbiBmb3IgY2FuY2VsbGluZyB0cmFuc2Zlci4gVGhpcyBpcyByZXF1aXJlZCBmb3IgUmZQIHRyYW5zZmVycywgYW5kIHdpbGwgYmUgaWdub3JlZCBmb3Igb3RoZXIgbmV0d29ya3MuICBgXFxcIkFDMDNcXFwiYCAtIEludmFsaWQgQ3JlZGl0b3IgQWNjb3VudCBOdW1iZXIgIGBcXFwiQU0wOVxcXCJgIC0gSW5jb3JyZWN0IEFtb3VudCAgYFxcXCJDVVNUXFxcImAgLSBSZXF1ZXN0ZWQgQnkgQ3VzdG9tZXIgLSBDYW5jZWxsYXRpb24gcmVxdWVzdGVkICBgXFxcIkRVUExcXFwiYCAtIER1cGxpY2F0ZSBQYXltZW50ICBgXFxcIkZSQURcXFwiYCAtIEZyYXVkdWxlbnQgUGF5bWVudCAtIFVuYXV0aG9yaXplZCBvciBmcmF1ZHVsZW50bHkgaW5kdWNlZCAgYFxcXCJURUNIXFxcImAgLSBUZWNobmljYWwgUHJvYmxlbSAtIENhbmNlbGxhdGlvbiBkdWUgdG8gc3lzdGVtIGlzc3VlcyAgYFxcXCJVUEFZXFxcImAgLSBVbmR1ZSBQYXltZW50IC0gUGF5bWVudCB3YXMgbWFkZSB0aHJvdWdoIGFub3RoZXIgY2hhbm5lbCAgYFxcXCJBQzE0XFxcImAgLSBJbnZhbGlkIG9yIE1pc3NpbmcgQ3JlZGl0b3IgQWNjb3VudCBUeXBlICBgXFxcIkFNMDZcXFwiYCAtIEFtb3VudCBUb28gTG93ICBgXFxcIkJFMDVcXFwiYCAtIFVucmVjb2duaXplZCBJbml0aWF0aW5nIFBhcnR5ICBgXFxcIkZPQ1JcXFwiYCAtIEZvbGxvd2luZyBSZWZ1bmQgUmVxdWVzdCAgYFxcXCJNUzAyXFxcImAgLSBObyBTcGVjaWZpZWQgUmVhc29uIC0gQ3VzdG9tZXIgIGBcXFwiTVMwM1xcXCJgIC0gTm8gU3BlY2lmaWVkIFJlYXNvbiAtIEFnZW50ICBgXFxcIlJSMDRcXFwiYCAtIFJlZ3VsYXRvcnkgUmVhc29uICBgXFxcIlJVVEFcXFwiYCAtIFJldHVybiBVcG9uIFVuYWJsZSBUbyBBcHBseVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmVhc29uQ29kZSB7XG4gICAgQWMwMyA9ICdBQzAzJyxcbiAgICBBbTA5ID0gJ0FNMDknLFxuICAgIEN1c3QgPSAnQ1VTVCcsXG4gICAgRHVwbCA9ICdEVVBMJyxcbiAgICBGcmFkID0gJ0ZSQUQnLFxuICAgIFRlY2ggPSAnVEVDSCcsXG4gICAgVXBheSA9ICdVUEFZJyxcbiAgICBBYzE0ID0gJ0FDMTQnLFxuICAgIEFtMDYgPSAnQU0wNicsXG4gICAgQmUwNSA9ICdCRTA1JyxcbiAgICBGb2NyID0gJ0ZPQ1InLFxuICAgIE1zMDIgPSAnTVMwMicsXG4gICAgTXMwMyA9ICdNUzAzJyxcbiAgICBScjA0ID0gJ1JSMDQnLFxuICAgIFJ1dGEgPSAnUlVUQSdcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCB3YXMgZmxhZ2dlZCBieSBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtIGFuZCByZXF1aXJlcyBhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbiB0byBlbnN1cmUgdGhlIHVzZXIgaXMgbm90IGEgYm90LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvciB7XG4gICAgLyoqXG4gICAgICogYFJFQ0FQVENIQV9FUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNBUFRDSEFfUkVRVUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIDQwMFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBodHRwX2NvZGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBZb3VyIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byBzb2x2ZSBhIEdvb2dsZSByZUNBUFRDSEEgY2hhbGxlbmdlIGluIHRoZSBMaW5rIFJlY2FwdGNoYSBwYW5lLiBJZiB0aGV5IHNvbHZlIHRoZSBjaGFsbGVuZ2Ugc3VjY2Vzc2Z1bGx5LCB0aGUgdXNlclxcJ3MgcmVxdWVzdCBpcyByZXN1Ym1pdHRlZCBhbmQgdGhleSBhcmUgZGlyZWN0ZWQgdG8gdGhlIG5leHQgSXRlbSBjcmVhdGlvbiBzdGVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBsaW5rX3VzZXJfZXhwZXJpZW5jZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtIGRldGVjdHMgYWJ1c2l2ZSB0cmFmZmljIGFuZCBjb25zaWRlcnMgYSB2YXJpZXR5IG9mIHBhcmFtZXRlcnMgdGhyb3VnaG91dCBJdGVtIGNyZWF0aW9uIHJlcXVlc3RzLiBXaGVuIGEgcmVxdWVzdCBpcyBjb25zaWRlcmVkIHJpc2t5IG9yIHBvc3NpYmx5IGZyYXVkdWxlbnQsIExpbmsgcHJlc2VudHMgYSByZUNBUFRDSEEgZm9yIHRoZSB1c2VyIHRvIHNvbHZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBjb21tb25fY2F1c2VzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpbmsgd2lsbCBhdXRvbWF0aWNhbGx5IGd1aWRlIHlvdXIgdXNlciB0aHJvdWdoIHJlQ0FQVENIQSB2ZXJpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB3ZSByZWNvbW1lbmQgaW5zdHJ1bWVudGluZyBiYXNpYyBmcmF1ZCBtb25pdG9yaW5nIHRvIGRldGVjdCBhbmQgcHJvdGVjdCB5b3VyIHdlYnNpdGUgZnJvbSBzcGFtIGFuZCBhYnVzZS4gIElmIHlvdXIgdXNlciBjYW5ub3QgdmVyaWZ5IHRoZWlyIHNlc3Npb24sIHBsZWFzZSBzdWJtaXQgYSBzdXBwb3J0IHRpY2tldCB3aXRoIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6IGBsaW5rX3Nlc3Npb25faWRgIG9yIGByZXF1ZXN0X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICB0cm91Ymxlc2hvb3Rpbmdfc3RlcHM/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgZGV0YWlscyBmb3IgcmVjZWl2ZXIgZXZlbnRzLiBDdXJyZW50bHkgYWx3YXlzIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjZWl2ZXJEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjZWl2ZXJEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlciBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNlaXZlckRldGFpbHNcbiAgICAgKi9cbiAgICBhdmFpbGFibGVfYmFsYW5jZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCYWNzIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHlvdSBuZWVkIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJhY3MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCYWNzIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJhY3MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVjb21tZW5kYXRpb24gcmVzdWx0IGZvciB0aGF0IGRhdGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZWNvbW1lbmRhdGlvblN0cmluZyB7XG4gICAgUmVjb21tZW5kZWQgPSAnUkVDT01NRU5ERUQnLFxuICAgIE5vdFJlY29tbWVuZGVkID0gJ05PVF9SRUNPTU1FTkRFRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIGJ5IFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX0NBTkNFTExFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluc2lnaHRzIG9iamVjdCBmb3IgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBzdHJlYW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQtcHJvdmlkZWQgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG9yIHByaW1hcnkgY291bnRlcnBhcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGVhY2ggb2YgdGhlIHJlY3VycmluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2RheXNfYXBhcnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgZnJlcXVlbmN5PzogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgaW4gdGhpcyBzdHJlYW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCB0cmFuc2FjdGlvbiBJRHMgYmVsb25naW5nIHRvIHRoZSBzdHJlYW0sIHNvcnRlZCBieSBwb3N0ZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudD86IFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbSBpcyBzdGlsbCBsaXZlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGlzX2FjdGl2ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RhdHVzPzogVHJhbnNhY3Rpb25TdHJlYW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ByaW1hcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGFpbGVkIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9kZXRhaWxlZD86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIG5ldyB0cmFuc2ZlciBvZiBhIHJlY3VycmluZyB0cmFuc2ZlciBpcyBvcmlnaW5hdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX05FV19UUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uICBgV0VFS0xZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB3ZWVrLiAgYEJJV0VFS0xZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSAyIHdlZWtzLiAgYFNFTUlfTU9OVEhMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgdHdpY2UgcGVyIG1vbnRoLiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHRyYW5zYWN0aW9uIHN0cmVhbXMuICBgTU9OVEhMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgbW9udGguICBgQU5OVUFMTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHllYXIuICBgVU5LTk9XTmA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgZG9lcyBub3QgZml0IGFueSBvZiB0aGUgcHJlLWRlZmluZWQgZnJlcXVlbmNpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEFubnVhbGx5ID0gJ0FOTlVBTExZJ1xufVxuXG4vKipcbiAqIEluc2lnaHRzIG9iamVjdCBmb3IgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZW5kcG9pbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcyAoZS5nLiwgaW5jb21lKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjdXJyaW5nSW5zaWdodHNTdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8UmVjdXJyaW5nSW5zaWdodHNTdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG91dGZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcyAoZS5nLiwgc3Vic2NyaXB0aW9ucywgYmlsbHMsIGxvYW4gcGF5bWVudHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8UmVjdXJyaW5nSW5zaWdodHNTdHJlYW0+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YSBpcyB1cGRhdGVkLiBUaGlzIGluY2x1ZGVzIHdoZW4gYSBuZXcgcmVjdXJyaW5nIHN0cmVhbSBpcyBkZXRlY3RlZCBvciB3aGVuIGEgbmV3IHRyYW5zYWN0aW9uIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHJlY3VycmluZyBzdHJlYW0uIFRoZSBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgIHdlYmhvb2sgd2lsbCBhbHNvIGZpcmUgd2hlbiBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWN1cnJpbmcgc3RyZWFtIGNoYW5nZXMsIHdoaWNoIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uLCB1cGRhdGUsIG9yIHJlbW92YWwgb2YgdHJhbnNhY3Rpb25zIHRvIHRoZSBzdHJlYW0uICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIHVwZGF0ZWQgZGF0YSBjYW4gYmUgZmV0Y2hlZCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCBmb3IgYWNjb3VudHMgdGhhdCBoYXZlIG5ldyBvciB1cGRhdGVkIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuICBUaGUgbmV4dCB0cmFuc2ZlciBvcmlnaW5hdGlvbiBkYXRlIGFmdGVyIGJhbmsgaG9saWRheSBhZGp1c3RtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV4dF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVyUmVjdXJyaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGVkIHRyYW5zZmVyIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC4gSWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBoYXMgYmVlbiBuZXdseSBjcmVhdGVkLCB0aGlzIGFycmF5IHdpbGwgYmUgZW1wdHkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiAgVGhlIG5leHQgdHJhbnNmZXIgb3JpZ2luYXRpb24gZGF0ZSBhZnRlciBiYW5rIGhvbGlkYXkgYWRqdXN0bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV4dF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRlZCB0cmFuc2ZlciBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuIElmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaGFzIGJlZW4gbmV3bHkgY3JlYXRlZCwgdGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgb24gdGhlIHBsYW5uZWQgZGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0ZFUl9TS0lQUEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbl9yYXRpb25hbGVfY29kZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxhbm5lZCBkYXRlIG9uIHdoaWNoIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBza2lwcGVkX29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVmcmVzaFJlc3VsdCByZXByZXNlbnRzIHRoZSByZXN1bHQgc3RhdHVzIG9mIGEgdXNlciByZWZyZXNoIGZvciBhIHNwZWNpZmljIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlZnJlc2hSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWZyZXNoUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgUGxhaWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWZyZXNoUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdCBmb3Igd2hpY2ggdGhlIHJlZnJlc2ggd2FzIGF0dGVtcHRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWZyZXNoUmVzdWx0XG4gICAgICovXG4gICAgcHJvZHVjdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUmVmcmVzaFJlc3VsdFxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSByZW1vdmVkIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlcG9ydCB0eXBlLiBJdCBjYW4gYmUgYGFzc2V0YC4gSW5jb21lIHJlcG9ydCB0eXBlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZXBvcnRUeXBlIHtcbiAgICBBc3NldCA9ICdhc3NldCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJlcG9ydCBpZGVudGlmaWVyIGFuZCBhIHJlcG9ydCBuYW1lLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXBvcnRpbmdJbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ0luZm9ybWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvbklkZW50aWZpZXI6IHN0cmluZztcbn1cbi8qKlxuICogUGh5c2ljYWwgYWRkcmVzcyBvZiBhIGJ1c2luZXNzLiBVc2VkIGZvciBpbnB1dCByZXF1ZXN0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVxdWVzdEJ1c2luZXNzQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RCdXNpbmVzc0FkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcXVlc3RCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0QnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0QnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZS4gXFxcIlN1YmRpdmlzaW9uXFxcIiBpcyBhIGdlbmVyaWMgdGVybSBmb3IgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIGV0Yy4gRm9yIHRoZSBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVxdWVzdEJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcXVlc3RCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0QnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGEgYnVzaW5lc3MuIFVzZWQgZm9yIHJlc3BvbnNlIHNjaGVtYXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlc3BvbnNlQnVzaW5lc3NBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlc3BvbnNlQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlc3BvbnNlQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlc3BvbnNlQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN1YmRpdmlzaW9uIGNvZGUuIFxcXCJTdWJkaXZpc2lvblxcXCIgaXMgYSBnZW5lcmljIHRlcm0gZm9yIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBldGMuIEZvciB0aGUgbGlzdCBvZiB2YWxpZCBjb2Rlcywgc2VlIFtjb3VudHJ5IHN1YmRpdmlzaW9uIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY291bnRyeV9zdWJkaXZpc2lvbl9jb2Rlcy5qc29uKS4gQ291bnRyeSBwcmVmaXhlcyBhcmUgb21pdHRlZCwgc2luY2UgdGhleSBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYGNvdW50cnlgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlc3BvbnNlQnVzaW5lc3NBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXNwb25zZUJ1c2luZXNzQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVzcG9uc2VCdXNpbmVzc0FkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGJlaGF2aW9yYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2ssIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tCZWhhdmlvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0JlaGF2aW9yIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgdXNlcl9pbnRlcmFjdGlvbnM6IFJpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgZnJhdWRfcmluZ19kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgYm90X2RldGVjdGVkOiBSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbFdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbFdpdGhOb0RhdGE7XG59XG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBib3QgZGV0ZWN0aW9uIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIG5vdCBkZXRlY3RlZC4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3V0Y29tZSBvZiBhIGZyYXVkIHJpbmcgYmVoYXZpb3IgcmlzayBjaGVjay4gIGB5ZXNgIGluZGljYXRlcyB0aGF0IGZyYXVkIHJpbmcgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG92ZXJhbGwgdXNlciBpbnRlcmFjdGlvbiBzaWduYWxzIG9mIGEgYmVoYXZpb3IgcmlzayBjaGVjay4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIGhvdyBmYW1pbGlhciB0aGUgdXNlciBpcyB3aXRoIHRoZSBwZXJzb25hbCBkYXRhIHRoZXkgcHJvdmlkZSwgYmFzZWQgb24gYSBudW1iZXIgb2Ygc2lnbmFscyB0aGF0IGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHRoZWlyIHNlc3Npb24uICBgZ2VudWluZWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBoaWdoIGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyB1bmxpa2VseS4gIGBuZXV0cmFsYCBpbmRpY2F0ZXMgc29tZSBzaWduYWxzIGFyZSBwcmVzZW50IGluIGJldHdlZW4gYHJpc2t5YCBhbmQgYGdlbnVpbmVgLCBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2xlYXIgc2lnbmFscyB0byBkZXRlcm1pbmUgYW4gb3V0Y29tZS4gIGByaXNreWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBsb3cgZmFtaWxpYXJpdHkgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBwcm92aWRpbmcsIGFuZCB0aGF0IGZyYXVkIGlzIGxpa2VseS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbCB7XG4gICAgR2VudWluZSA9ICdnZW51aW5lJyxcbiAgICBOZXV0cmFsID0gJ25ldXRyYWwnLFxuICAgIFJpc2t5ID0gJ3Jpc2t5JyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHJpc2tfY2hlY2tgIHN0ZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYmVoYXZpb3I6IFJpc2tDaGVja0JlaGF2aW9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbDogUmlza0NoZWNrRW1haWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tQaG9uZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lOiBSaXNrQ2hlY2tQaG9uZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmVzdWx0IHN1bW1hcnkgb2JqZWN0cyBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrQ2hlY2tEZXZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGV2aWNlczogQXJyYXk8Umlza0NoZWNrRGV2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZGVudGl0eV9hYnVzZV9zaWduYWxzOiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogUmlza0NoZWNrTmV0d29yayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF0dHJpYnV0ZXMgcmVsYXRlZCB0byB0aGUgZmFjaWFsIGR1cGxpY2F0ZXMgY2FwdHVyZWQgaW4gcmlzayBjaGVjay5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Umlza0NoZWNrRmFjaWFsRHVwbGljYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGZhY2lhbF9kdXBsaWNhdGVzOiBBcnJheTxSaXNrQ2hlY2tGYWNpYWxEdXBsaWNhdGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVzdCBpbmRleCBzY29yZSBmb3IgdGhlIGByaXNrX2NoZWNrYCBzdGVwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICB0cnVzdF9pbmRleF9zY29yZTogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgZGV2aWNlYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0RldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0RldmljZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb3h5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfcHJveHlfdHlwZTogUHJveHlUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb3VudCBvZiBzcGFtIGxpc3RzIHRoZSBJUCBhZGRyZXNzIGlzIGFzc29jaWF0ZWQgd2l0aCBpZiBrbm93bi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9zcGFtX2xpc3RfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVVRDIG9mZnNldCBvZiB0aGUgdGltZXpvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJUCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3RpbWV6b25lX29mZnNldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZmFjdG9ycywgd2hlbiBhdmFpbGFibGUsIHRoYXQgY29udHJpYnV0ZSB0b3dhcmRzIHRoZSByaXNrIGxldmVsIG9mIHRoZSBnaXZlbiByaXNrIGNoZWNrIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGZhY3RvcnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBlbWFpbGAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0VtYWlsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGlzX2RlbGl2ZXJhYmxlOiBSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgYWxsIGtub3duIGJyZWFjaGVzIG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpZiBrbm93bi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGJyZWFjaF9jb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBmaXJzdF9icmVhY2hlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBsYXN0X2JyZWFjaGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9yZWdpc3RlcmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19mcmVlX3Byb3ZpZGVyOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19jdXN0b206IFJpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b207XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19kaXNwb3NhYmxlOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICB0b3BfbGV2ZWxfZG9tYWluX2lzX3N1c3BpY2lvdXM6IFJpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsSXNFZHV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgaXNfZWR1OiBSaXNrQ2hlY2tFbWFpbElzRWR1O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbEluY2x1ZGVzRGF0ZU9mQmlydGh9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgaW5jbHVkZXNfZGF0ZV9vZl9iaXJ0aDogUmlza0NoZWNrRW1haWxJbmNsdWRlc0RhdGVPZkJpcnRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbE5hbWV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgbmFtZTogUmlza0NoZWNrRW1haWxOYW1lO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBlbWFpbCBhZGRyZXNzIGhhcyBiZWVuIGRldGVjdGVkIHRvIGhhdmUgYWNjb3VudHMgb3Igb3RoZXIgYWN0aXZpdHkuXG4gICAgICogQHR5cGUge1NldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBsaW5rZWRfc2VydmljZXM6IFNldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBmYWN0b3JzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGN1c3RvbSBpZiBrbm93biwgaS5lLiBhIGNvbXBhbnkgZG9tYWluIGFuZCBub3QgZnJlZSBvciBkaXNwb3NhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBkb21haW4gaXMgbGlzdGVkIGFzIGRpc3Bvc2FibGUgaWYga25vd24uIERpc3Bvc2FibGUgZG9tYWlucyBhcmUgb2Z0ZW4gdXNlZCB0byBjcmVhdGUgZW1haWwgYWRkcmVzc2VzIHRoYXQgYXJlIHBhcnQgb2YgYSBmYWtlIHNldCBvZiB1c2VyIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIGRvbWFpbiBpcyBhIGZyZWUgcHJvdmlkZXIgc3VjaCBhcyBHbWFpbCBvciBIb3RtYWlsIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlciB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIGluY2x1ZGVzIHRoZSBkYXRlIG9mIGJpcnRoIG9yIHllYXIgb2YgYmlydGggaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbEluY2x1ZGVzRGF0ZU9mQmlydGgge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBTTVRQLU1YIGNoZWNrIHRvIGNvbmZpcm0gdGhlIGVtYWlsIGFkZHJlc3MgZXhpc3RzIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGFuIGVkdWNhdGlvbmFsIGluc3RpdHV0aW9uIGRvbWFpbiBpZiBrbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsSXNFZHUge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgbmFtZSBtYXRjaGVzIHRoZSBlbWFpbCBhZGRyZXNzIGFjY29yZGluZyB0byB0aGUgS1lDIG5hbWUtbWF0Y2hlcy1lbWFpbCBpbmZlcmVuY2UgcmVzdWx0IGlmIGtub3duLiAgYG1hdGNoYCAtIFxcXCJUaGUgZW1haWxcXCdzIG5hbWUgaWRlbnRpZmllcnMgbWF0Y2ggdGhlIHVzZXJcXCdzIG5hbWUuXFxcIiAgYHBhcnRpYWxfbWF0Y2hgIC0gXFxcIlRoZSBlbWFpbFxcJ3MgbmFtZSBpZGVudGlmaWVycyBwYXJ0aWFsbHkgbWF0Y2ggdGhlIHVzZXJcXCdzIG5hbWUuXFxcIiAgYG5vX21hdGNoYCAtIFxcXCJUaGUgZW1haWxcXCdzIG5hbWUgaWRlbnRpZmllcnMgZG8gbm90IG1hdGNoIHRoZSB1c2VyXFwncyBuYW1lLlxcXCIgIGBpbmRldGVybWluYXRlYCAtIFxcXCJUaGUgZW1haWwgZG9lcyBub3QgY29udGFpbiBhbnkgbmFtZSBpZGVudGlmaWVycywgYW5kIGEgbWF0Y2ggY291bGQgbm90IGJlIGRldGVybWluZWQuXFxcIiAgYG5vX2lucHV0YCAtIFxcXCJUaGUgdXNlclxcJ3MgcHJvZmlsZSBkb2VzIG5vdCBjb250YWluIHRoZSByZXF1aXJlZCB1c2VyIGlucHV0cyB0byBkZXRlcm1pbmUgYSBtYXRjaC5cXFwiICBgbm9fZGF0YWAgLSBcXFwiRmllbGQgY291bGQgbm90IGJlIHZlcmlmaWVkIGFnYWluc3QgYXZhaWxhYmxlIHNvdXJjZXMuXFxcIlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxOYW1lIHtcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0JyxcbiAgICBJbmRldGVybWluYXRlID0gJ2luZGV0ZXJtaW5hdGUnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgdG9wIGxldmVsIGRvbWFpbiwgd2hpY2ggaXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgZG9tYWluLCBpcyBmcmF1ZHVsZW50IG9yIHJpc2t5IGlmIGtub3duLiBJbiBtb3N0IGNhc2VzLCBhIHN1c3BpY2lvdXMgdG9wIGxldmVsIGRvbWFpbiBpcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCBhIGRpc3Bvc2FibGUgb3IgaGlnaC1yaXNrIGRvbWFpbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIHRoZSBgZmFjaWFsX2R1cGxpY2F0ZXNgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRmFjaWFsRHVwbGljYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrRmFjaWFsRHVwbGljYXRlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tGYWNpYWxEdXBsaWNhdGVcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNpbWlsYXJpdHkgc2NvcmUgb2YgdGhlIG1hdGNoLiBSYW5nZXMgZnJvbSAwIHRvIDEwMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tGYWNpYWxEdXBsaWNhdGVcbiAgICAgKi9cbiAgICBzaW1pbGFyaXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIG1hdGNoIG9jY3VycmVkIGFmdGVyIHRoZSBzZXNzaW9uIHdhcyBjb21wbGV0ZS4gRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgYmUgYHRydWVgIGlmIGEgbGF0ZXIgc2Vzc2lvbiBlbmRlZCB1cCBtYXRjaGluZyB0aGlzIG9uZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRmFjaWFsRHVwbGljYXRlXG4gICAgICovXG4gICAgbWF0Y2hlZF9hZnRlcl9jb21wbGV0ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBjYXB0dXJpbmcgYWJ1c2Ugc2lnbmFscyByZWxhdGVkIHRvIGBpZGVudGl0eSBhYnVzZWAsIGUuZy4gc3RvbGVuIGFuZCBzeW50aGV0aWMgaWRlbnRpdHkgZnJhdWQuIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBVUyBpZGVudGl0aWVzIGFuZCBzb21lIHNpZ25hbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIHdoYXQgaW5mb3JtYXRpb24gd2FzIGNvbGxlY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN5bnRoZXRpY19pZGVudGl0eTogUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAgICAgKi9cbiAgICBzdG9sZW5faWRlbnRpdHk6IFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgbGlua2VkIHNlcnZpY2UuIE5vdGUgdGhhdCBgYWR1bHRfc2l0ZXNgIHJlZmVycyB0byBleHBsaWNpdCB2aWRlbyBjb250ZW50LCBhbmQgaW5jbHVkZXMgYSBudW1iZXIgb2YgcmVsYXRlZCBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0xpbmtlZFNlcnZpY2Uge1xuICAgIEFib3V0bWUgPSAnYWJvdXRtZScsXG4gICAgQWRvYmUgPSAnYWRvYmUnLFxuICAgIEFkdWx0U2l0ZXMgPSAnYWR1bHRfc2l0ZXMnLFxuICAgIEFpcmJuYiA9ICdhaXJibmInLFxuICAgIEFsdGJhbGFqaSA9ICdhbHRiYWxhamknLFxuICAgIEFtYXpvbiA9ICdhbWF6b24nLFxuICAgIEFwcGxlID0gJ2FwcGxlJyxcbiAgICBBcmNoaXZlb3JnID0gJ2FyY2hpdmVvcmcnLFxuICAgIEF0bGFzc2lhbiA9ICdhdGxhc3NpYW4nLFxuICAgIEJpdG1vamkgPSAnYml0bW9qaScsXG4gICAgQm9keWJ1aWxkaW5nID0gJ2JvZHlidWlsZGluZycsXG4gICAgQm9va2luZyA9ICdib29raW5nJyxcbiAgICBCdWthbGFwYWsgPSAnYnVrYWxhcGFrJyxcbiAgICBDb2RlY2FkZW15ID0gJ2NvZGVjYWRlbXknLFxuICAgIERlbGl2ZXJvbyA9ICdkZWxpdmVyb28nLFxuICAgIERpaWdvID0gJ2RpaWdvJyxcbiAgICBEaXNjb3JkID0gJ2Rpc2NvcmQnLFxuICAgIERpc25leXBsdXMgPSAnZGlzbmV5cGx1cycsXG4gICAgRHVvbGluZ28gPSAnZHVvbGluZ28nLFxuICAgIEViYXkgPSAnZWJheScsXG4gICAgRW52YXRvID0gJ2VudmF0bycsXG4gICAgRXZlbnRicml0ZSA9ICdldmVudGJyaXRlJyxcbiAgICBFdmVybm90ZSA9ICdldmVybm90ZScsXG4gICAgRmFjZWJvb2sgPSAnZmFjZWJvb2snLFxuICAgIEZpcmVmb3ggPSAnZmlyZWZveCcsXG4gICAgRmxpY2tyID0gJ2ZsaWNrcicsXG4gICAgRmxpcGthcnQgPSAnZmxpcGthcnQnLFxuICAgIEZvdXJzcXVhcmUgPSAnZm91cnNxdWFyZScsXG4gICAgRnJlZWxhbmNlciA9ICdmcmVlbGFuY2VyJyxcbiAgICBHYWFuYSA9ICdnYWFuYScsXG4gICAgR2lwaHkgPSAnZ2lwaHknLFxuICAgIEdpdGh1YiA9ICdnaXRodWInLFxuICAgIEdvb2dsZSA9ICdnb29nbGUnLFxuICAgIEdyYXZhdGFyID0gJ2dyYXZhdGFyJyxcbiAgICBIdWJzcG90ID0gJ2h1YnNwb3QnLFxuICAgIEltZ3VyID0gJ2ltZ3VyJyxcbiAgICBJbnN0YWdyYW0gPSAnaW5zdGFncmFtJyxcbiAgICBKZGlkID0gJ2pkaWQnLFxuICAgIEtha2FvID0gJ2tha2FvJyxcbiAgICBLb21tbyA9ICdrb21tbycsXG4gICAgS29tb290ID0gJ2tvbW9vdCcsXG4gICAgTGFzdGZtID0gJ2xhc3RmbScsXG4gICAgTGF6YWRhID0gJ2xhemFkYScsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBMaW5rZWRpbiA9ICdsaW5rZWRpbicsXG4gICAgTWFpbHJ1ID0gJ21haWxydScsXG4gICAgTWljcm9zb2Z0ID0gJ21pY3Jvc29mdCcsXG4gICAgTXlzcGFjZSA9ICdteXNwYWNlJyxcbiAgICBOZXRmbGl4ID0gJ25ldGZsaXgnLFxuICAgIE5pa2UgPSAnbmlrZScsXG4gICAgT2sgPSAnb2snLFxuICAgIFBhdHJlb24gPSAncGF0cmVvbicsXG4gICAgUGludGVyZXN0ID0gJ3BpbnRlcmVzdCcsXG4gICAgUGx1cmsgPSAncGx1cmsnLFxuICAgIFF1b3JhID0gJ3F1b3JhJyxcbiAgICBRem9uZSA9ICdxem9uZScsXG4gICAgUmFtYmxlciA9ICdyYW1ibGVyJyxcbiAgICBSYXBwaSA9ICdyYXBwaScsXG4gICAgUmVwbGl0ID0gJ3JlcGxpdCcsXG4gICAgU2Ftc3VuZyA9ICdzYW1zdW5nJyxcbiAgICBTZW9jbGVya3MgPSAnc2VvY2xlcmtzJyxcbiAgICBTaG9wY2x1ZXMgPSAnc2hvcGNsdWVzJyxcbiAgICBTa3lwZSA9ICdza3lwZScsXG4gICAgU25hcGNoYXQgPSAnc25hcGNoYXQnLFxuICAgIFNuYXBkZWFsID0gJ3NuYXBkZWFsJyxcbiAgICBTb3VuZGNsb3VkID0gJ3NvdW5kY2xvdWQnLFxuICAgIFNwb3RpZnkgPSAnc3BvdGlmeScsXG4gICAgU3RhcnogPSAnc3RhcnonLFxuICAgIFN0cmF2YSA9ICdzdHJhdmEnLFxuICAgIFRhcmluZ2EgPSAndGFyaW5nYScsXG4gICAgVGVsZWdyYW0gPSAndGVsZWdyYW0nLFxuICAgIFRpa2kgPSAndGlraScsXG4gICAgVG9rb3BlZGlhID0gJ3Rva29wZWRpYScsXG4gICAgVHJlZWhvdXNlID0gJ3RyZWVob3VzZScsXG4gICAgVHVtYmxyID0gJ3R1bWJscicsXG4gICAgVHdpdHRlciA9ICd0d2l0dGVyJyxcbiAgICBWZW5tbyA9ICd2ZW5tbycsXG4gICAgVmliZXIgPSAndmliZXInLFxuICAgIFZpbWVvID0gJ3ZpbWVvJyxcbiAgICBWaXZpbm8gPSAndml2aW5vJyxcbiAgICBWa29udGFrdGUgPSAndmtvbnRha3RlJyxcbiAgICBXYXR0cGFkID0gJ3dhdHRwYWQnLFxuICAgIFdlaWJvID0gJ3dlaWJvJyxcbiAgICBXaGF0c2FwcCA9ICd3aGF0c2FwcCcsXG4gICAgV29yZHByZXNzID0gJ3dvcmRwcmVzcycsXG4gICAgWGluZyA9ICd4aW5nJyxcbiAgICBZYWhvbyA9ICd5YWhvbycsXG4gICAgWWFuZGV4ID0gJ3lhbmRleCcsXG4gICAgWmFsbyA9ICd6YWxvJyxcbiAgICBab2hvID0gJ3pvaG8nXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBuZXR3b3JrIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrTmV0d29ya1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja05ldHdvcmsge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja05ldHdvcmtcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrTmV0d29ya1xuICAgICAqL1xuICAgIGZhY3RvcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYHBob25lYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBwaG9uZSBudW1iZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGZhY3RvcnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN0b2xlbiBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN5bnRoZXRpYyBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTeW50aGV0aWNGcmF1ZH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICBmaXJzdF9wYXJ0eV9zeW50aGV0aWNfZnJhdWQ/OiBTeW50aGV0aWNGcmF1ZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N5bnRoZXRpY0ZyYXVkfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3N5bnRoZXRpY19mcmF1ZD86IFN5bnRoZXRpY0ZyYXVkIHwgbnVsbDtcbn1cbi8qKlxuICogUmlzayBpbmRpY2F0b3JzIGZvY3VzIG9uIHByb3ZpZGluZyBzaWduYWwgb24gdGhlIHBvc3NpYmlsaXR5IG9mIGEgYm9ycm93ZXIgZGVmYXVsdGluZyBvbiB0aGVpciBsb2FuIHJlcGF5bWVudHMgYnkgcHJvdmlkaW5nIGRhdGEgcG9pbnRzIHJlbGF0ZWQgdG8gaXRzIHBheW1lbnQgYmVoYXZpb3IsIGRlYnQsIGFuZCBvdGhlciByZWxldmFudCBmaW5hbmNpYWwgaW5mb3JtYXRpb24sIGhlbHBpbmcgbGVuZGVycyBnYXVnZSB0aGUgbGV2ZWwgb2YgcmlzayBpbnZvbHZlZCBpbiBhIGNlcnRhaW4gb3BlcmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrSW5kaWNhdG9yc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tJbmRpY2F0b3JzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1BlbmFsdGllc0luZGljYXRvcnN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tJbmRpY2F0b3JzXG4gICAgICovXG4gICAgYmFua19wZW5hbHRpZXM/OiBCYW5rUGVuYWx0aWVzSW5kaWNhdG9ycyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0dhbWJsaW5nSW5kaWNhdG9yc31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBnYW1ibGluZz86IEdhbWJsaW5nSW5kaWNhdG9ycyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5EaXNidXJzZW1lbnRzSW5kaWNhdG9yc31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0luZGljYXRvcnNcbiAgICAgKi9cbiAgICBsb2FuX2Rpc2J1cnNlbWVudHM/OiBMb2FuRGlzYnVyc2VtZW50c0luZGljYXRvcnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuUGF5bWVudHNJbmRpY2F0b3JzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrSW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGxvYW5fcGF5bWVudHM/OiBMb2FuUGF5bWVudHNJbmRpY2F0b3JzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmVnYXRpdmVCYWxhbmNlSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tJbmRpY2F0b3JzXG4gICAgICovXG4gICAgbmVnYXRpdmVfYmFsYW5jZT86IE5lZ2F0aXZlQmFsYW5jZUluc2lnaHRzIHwgbnVsbDtcbn1cbi8qKlxuICogUmlzayBsZXZlbCBmb3IgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tMZXZlbCB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJ1xufVxuXG4vKipcbiAqIFJpc2sgbGV2ZWwgZm9yIHRoZSBnaXZlbiByaXNrIGNoZWNrIHR5cGUsIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0xldmVsV2l0aE5vRGF0YSB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSaXNrUHJvZmlsZSBpcyBkZXByZWNhdGVkLCB1c2UgYHJ1bGVzZXRgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tQcm9maWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza1Byb2ZpbGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIHJpc2sgcHJvZmlsZSB1c2VkIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAga2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExlZ2FjeSBtZXRob2Qgb2YgaW5zcGVjdGluZyB0aGUgcmVzdWx0IG9mIHRoZSBydWxlc2V0LiBOZXcgaW50ZWdyYXRpb25zIHNob3VsZCBzaW1wbHkgdXNlIHRoZSBcXFwicmVzdWx0XFxcIiBwcm9wZXJ0eSBpbnN0ZWFkLiBUaGlzIHZhbHVlIHdpbGwgYmUgb21pdHRlZCBpZiB5b3UgZG8gbm90IGhhdmUgYSBsaXZlIGV4aXN0aW5nIGludGVncmF0aW9uIHdpdGggcnVsZXMgdXNpbmcgdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrUHJvZmlsZVxuICAgICAqL1xuICAgIG91dGNvbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgb2JqZWN0IGluY2x1ZGVzIGEgY29kZSBhbmQgZGVzY3JpcHRpb24gdG8gZGVzY3JpYmUgbWVkaXVtIHJpc2sgdHJhbnNhY3Rpb25zIGFuZCBhYm92ZSBvbiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1JlYXNvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tSZWFzb24ge1xuICAgIC8qKlxuICAgICAqIEEgY29kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgcmlzayBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiAgVGhlIGNvZGVzIGFyZSBmcm9tIFBMMDEgdG8gUEwwOCBhbmQgZnJvbSBCSzAxIHRvIEJLMDcuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiByaXNrIHJlYXNvbiBjb2Rlcywgc2VlIFtSaXNrIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvYmFsYW5jZS1wbHVzLyNyaXNrLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrUmVhc29uXG4gICAgICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZXhwbGFpbmluZyB0aGUgcmlzayBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gYW5kIHNvbWUgcmVjb21tZW5kZWQgYWN0aW9ucy4gVGhpcyBmaWVsZCBpcyBzdWJqZWN0IHRvIGNoYW5nZTsgYW55IHByb2dyYW1tYXRpYyBsb2dpYyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGBjb2RlYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tSZWFzb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBmb3IgdGhlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgc3RhdHVzPzogUmlza1NpZ25hbERvY3VtZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlPzogUmlza1NpZ25hbERvY3VtZW50VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxGaWxlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZmlsZV90eXBlPzogUmlza1NpZ25hbEZpbGVUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogU3RhdHVzIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXMge1xuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdFcnJvciA9ICdQUk9DRVNTSU5HX0VSUk9SJyxcbiAgICBQYXNzd29yZFByb3RlY3RlZCA9ICdQQVNTV09SRF9QUk9URUNURUQnLFxuICAgIFZpcnVzRGV0ZWN0ZWQgPSAnVklSVVNfREVURUNURUQnXG59XG5cbi8qKlxuICogVHlwZSBvZiBhIGRvY3VtZW50IGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbERvY3VtZW50VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBCYW5rU3RhdGVtZW50ID0gJ0JBTktfU1RBVEVNRU5UJyxcbiAgICBCZW5lZml0c1N0YXRlbWVudCA9ICdCRU5FRklUU19TVEFURU1FTlQnLFxuICAgIEJ1c2luZXNzRmlsaW5nID0gJ0JVU0lORVNTX0ZJTElORycsXG4gICAgQ2hlY2sgPSAnQ0hFQ0snLFxuICAgIERyaXZpbmdMaWNlbnNlID0gJ0RSSVZJTkdfTElDRU5TRScsXG4gICAgRmluYW5jaWFsU3RhdGVtZW50ID0gJ0ZJTkFOQ0lBTF9TVEFURU1FTlQnLFxuICAgIEludm9pY2UgPSAnSU5WT0lDRScsXG4gICAgUGF5c2xpcCA9ICdQQVlTTElQJyxcbiAgICBTb2NpYWxTZWN1cml0eUNhcmQgPSAnU09DSUFMX1NFQ1VSSVRZX0NBUkQnLFxuICAgIFRheEZvcm0gPSAnVEFYX0ZPUk0nLFxuICAgIFV0aWxpdHlCaWxsID0gJ1VUSUxJVFlfQklMTCdcbn1cblxuLyoqXG4gKiBUaGUgZmlsZSB0eXBlIGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbEZpbGVUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEltYWdlUGRmID0gJ0lNQUdFX1BERicsXG4gICAgU2Nhbk9jciA9ICdTQ0FOX09DUicsXG4gICAgVHJ1ZVBkZiA9ICdUUlVFX1BERicsXG4gICAgSW1hZ2UgPSAnSU1BR0UnLFxuICAgIE1peGVkUGFnZVBkZiA9ICdNSVhFRF9QQUdFX1BERicsXG4gICAgRW1wdHlQZGYgPSAnRU1QVFlfUERGJyxcbiAgICBGbGF0dGVuZWRQZGYgPSAnRkxBVFRFTkVEX1BERidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJvbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZURldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgUm9sZVxuICAgICAqL1xuICAgIFJPTEVfREVUQUlMOiBSb2xlRGV0YWlsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJvbGVEZXRhaWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlRGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydHlSb2xlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUm9sZURldGFpbFxuICAgICAqL1xuICAgIFBhcnR5Um9sZVR5cGU6IFBhcnR5Um9sZVR5cGU7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGV9XG4gICAgICogQG1lbWJlcm9mIFJvbGVzXG4gICAgICovXG4gICAgUk9MRTogUm9sZTtcbn1cbi8qKlxuICogUnVsZXMgYXJlIHJ1biBpbiBudW1lcmljYWwgb3JkZXIuIFRoZSBmaXJzdCBydWxlIHdpdGggYSBsb2dpYyBtYXRjaCBpcyB0cmlnZ2VyZWQuIFRoZXNlIGFyZSB0aGUgZGV0YWlscyBvZiB0aGF0IHJ1bGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJ1bGVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIG1lc3NhZ2UgYXR0YWNoZWQgdG8gdGhlIHRyaWdnZXJlZCBydWxlLCBkZWZpbmVkIHdpdGhpbiB0aGUgRGFzaGJvYXJkLCBmb3IgeW91ciBpbnRlcm5hbCB1c2UuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLCBzdWNoIGFzIFxcXCJBY2NvdW50IGFwcGVhcnMgdG8gYmUgY2xvc2VkLlxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIGludGVybmFsX25vdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcga2V5LCBkZWZpbmVkIHdpdGhpbiB0aGUgRGFzaGJvYXJkLCB1c2VkIHRvIHRyaWdnZXIgcHJvZ3JhbW1hdGljIGJlaGF2aW9yIGZvciBhIGNlcnRhaW4gcmVzdWx0LiBGb3IgaW5zdGFuY2UsIHlvdSBjb3VsZCBvcHRpb25hbGx5IGNob29zZSB0byBkZWZpbmUgYSBcXFwiMy1kYXktaG9sZFxcXCIgYGN1c3RvbV9hY3Rpb25fa2V5YCBmb3IgYW4gQUNDRVBUIHJlc3VsdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIGN1c3RvbV9hY3Rpb25fa2V5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBydWxlIHRoYXQgd2FzIHRyaWdnZXJlZCBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gIGBBQ0NFUFRgOiBBY2NlcHQgdGhlIHRyYW5zYWN0aW9uIGZvciBwcm9jZXNzaW5nLiBgUkVST1VURWA6IFJlcm91dGUgdGhlIHRyYW5zYWN0aW9uIHRvIGEgZGlmZmVyZW50IHBheW1lbnQgbWV0aG9kLCBhcyB0aGlzIHRyYW5zYWN0aW9uIGlzIHRvbyByaXNreS4gYFJFVklFV2A6IFJldmlldyB0aGUgdHJhbnNhY3Rpb24gYmVmb3JlIHByb2NlZWRpbmcuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSdWxlUmVzdWx0IHtcbiAgICBBY2NlcHQgPSAnQUNDRVBUJyxcbiAgICBSZXJvdXRlID0gJ1JFUk9VVEUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnXG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0IGFmdGVyIGV2YWx1YXRpb24gYnkgdGhlIHJlcXVlc3RlZCBSdWxlc2V0LiBJZiBhIGBydWxlc2V0X2tleWAgaXMgbm90IHByb3ZpZGVkLCBmb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGJlZm9yZSBPY3RvYmVyIDE1LCAyMDI1LCBieSBkZWZhdWx0LCB0aGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZC4gVG8gbGVhcm4gbW9yZSwgc2VlIFtTaWduYWwgUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSdWxlc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXNldCB7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgUnVsZXNldCB1c2VkIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJ1bGVzZXRcbiAgICAgKi9cbiAgICBydWxlc2V0X2tleT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UnVsZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgUnVsZXNldFxuICAgICAqL1xuICAgIHJlc3VsdDogUnVsZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UnVsZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFJ1bGVzZXRcbiAgICAgKi9cbiAgICB0cmlnZ2VyZWRfcnVsZV9kZXRhaWxzPzogUnVsZURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmFsdWF0ZWQgb3V0Y29tZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLCB1c2UgYHJlc3VsdGAgb3IgYHRyaWdnZXJlZF9ydWxlX2RldGFpbHMuY3VzdG9tX2FjdGlvbl9rZXlgIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUnVsZXNldFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGluZGl2aWR1YWwgU01TIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU01TVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU01TVmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U01TVmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IFNNU1ZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYXR0ZW1wdCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IFNNUyB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkZWxpdmVyeSBhdHRlbXB0cyBtYWRlIHdpdGhpbiB0aGUgdmVyaWZpY2F0aW9uIHRvIHNlbmQgdGhlIFNNUyBjb2RlIHRvIHRoZSB1c2VyLiBFYWNoIGRlbGl2ZXJ5IGF0dGVtcHQgcmVwcmVzZW50cyB0aGUgdXNlciB0YWtpbmcgYWN0aW9uIGZyb20gdGhlIGZyb250IGVuZCBVSSB0byByZXF1ZXN0IGNyZWF0aW9uIGFuZCBkZWxpdmVyeSBvZiBhIG5ldyBTTVMgdmVyaWZpY2F0aW9uIGNvZGUsIG9yIHRvIHJlc2VuZCBhbiBleGlzdGluZyBTTVMgdmVyaWZpY2F0aW9uIGNvZGUuIFRoZXJlIGlzIGEgbGltaXQgb2YgMyBkZWxpdmVyeSBhdHRlbXB0cyBwZXIgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGRlbGl2ZXJ5X2F0dGVtcHRfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGF0dGVtcHRzIG1hZGUgYnkgdGhlIHVzZXIgd2l0aGluIHRoZSB2ZXJpZmljYXRpb24gdG8gdmVyaWZ5IHRoZSBTTVMgY29kZSBieSBlbnRlcmluZyBpdCBpbnRvIHRoZSBmcm9udCBlbmQgVUkuIFRoZXJlIGlzIGEgbGltaXQgb2YgMyBzb2x2ZSBhdHRlbXB0cyBwZXIgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHNvbHZlX2F0dGVtcHRfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5pdGlhbGx5X3NlbnRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGxhc3Rfc2VudF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGluZGl2aWR1YWwgU01TIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNNU1ZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIENhbmNlbGVkID0gJ2NhbmNlbGVkJ1xufVxuXG4vKipcbiAqIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LiBJZiBwcm92aWRlZCwgdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBVUkwgc2V0IGluIHRoZSBkYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX292ZXJyaWRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfZmllbGRzOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHM7XG59XG4vKipcbiAqIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgY29kZXMgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byB0ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlIHtcbiAgICBVcGRhdGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEUnLFxuICAgIENvbXBsZXRlID0gJ0JBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEUnXG59XG5cbi8qKlxuICogT3B0aW9uYWwgZmllbGRzIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIHRoZSBzaW11bGF0ZWQgd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGlkIHRvIGJlIHJldHVybmVkIGluIElOQ09NRSB3ZWJob29rc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkc1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfcmVmcmVzaF9jb21wbGV0ZV9yZXN1bHQ/OiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBmYWlsZWRgLCBvciBgcmV2ZXJzZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldmVyc2VkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2ViaG9vayBjb2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBDYXNoIEZsb3cgVXBkYXRlcyBldmVudHMgdG8gYmUgc2ltdWxhdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXNoRmxvd1VwZGF0ZXNFdmVudFdlYmhvb2tDb2Rlcz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2Rlcz86IEFycmF5PENhc2hGbG93VXBkYXRlc0V2ZW50V2ViaG9va0NvZGVzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gc2VlZCBhbiBGRFggY29uc2VudCBncmFudCwgYW5kIGl0cyBiYWNraW5nIGl0ZW0sIGZvciB0aGUgZ2l2ZW4gZW5kIHVzZXIgYW5kIHJlY2lwaWVudCBhcHBsaWNhdGlvbiBzbyB0aGUgRkRYIENvbnNlbnQgQVBJIGNhbiBiZSBleGVyY2lzZWQgaW4gU2FuZGJveC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBwcm92aWRlclxcJ3MgaWRlbnRpZmllciBmb3IgdGhlIGVuZCB1c2VyIHRvIGFzc29jaWF0ZSB0aGUgc2VlZGVkIGNvbnNlbnQgZ3JhbnQgd2l0aC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgLCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgVVVJRHY0IGlkZW50aWZpZXIgZm9yIHRoZSBzZWVkZWQgY29uc2VudCBncmFudC4gSWYgb21pdHRlZCwgb25lIGlzIGdlbmVyYXRlZC4gU2VlZGluZyBmYWlscyBpZiBhIGdyYW50IHdpdGggdGhpcyBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBjb250YWluaW5nIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBzZWVkZWQgRkRYIGNvbnNlbnQgZ3JhbnQsIHdoaWNoIGNhbiB0aGVuIGJlIGxpc3RlZCwgcmV0cmlldmVkLCBhbmQgcmV2b2tlZCB0aHJvdWdoIHRoZSBGRFggQ29uc2VudCBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hGZHhDb25zZW50U2VlZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEZkeENvbnNlbnRTZWVkUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBuZXdseSBzZWVkZWQgRkRYIGNvbnNlbnQgZ3JhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEZkeENvbnNlbnRTZWVkUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hGZHhDb25zZW50U2VlZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB0byB3aGljaCB0aGUgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGF0dXMgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiBJZiB0aGUgdXNlciB1cGxvYWRlZCBtdWx0aXBsZSBkb2N1bWVudHMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbGwgZG9jdW1lbnRzIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gQ2FsbCB0aGUgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgZW5kcG9pbnQgYW5kIGNoZWNrIHRoZSBkb2N1bWVudCBtZXRhZGF0YSB0byBzZWUgd2hpY2ggZG9jdW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfRkFJTEVEYDogQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gYXR0ZW1wdGluZyB0byBwcm9jZXNzIHRoZSB2ZXJpZmljYXRpb24gZG9jdW1lbnRhdGlvbi4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BFTkRJTkdfQVBQUk9WQUxgOiAoZGVwcmVjYXRlZCkgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2VudCB0byB0aGUgdXNlciBmb3IgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBQcm9jZXNzaW5nQ29tcGxldGUgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFJyxcbiAgICBQcm9jZXNzaW5nRmFpbGVkID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRUQnLFxuICAgIFBlbmRpbmdBcHByb3ZhbCA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BFTkRJTkdfQVBQUk9WQUwnXG59XG5cbi8qKlxuICogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBjb2RlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGUge1xuICAgIFZlcmlmaWNhdGlvbiA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OJyxcbiAgICBWZXJpZmljYXRpb25SaXNrU2lnbmFscyA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMUydcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2FwcGxpY2F0aW9uL3NlZWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9hcHBsaWNhdGlvbi9zZWVkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgbmV3bHkgc2VlZGVkIGl0ZW0gcmVwcmVzZW50aW5nIHRoZSBhcHBsaWNhdGlvbiBjb25uZWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBXZWJob29rVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBjb2RlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtIHtcbiAgICBEZWZhdWx0VXBkYXRlID0gJ0RFRkFVTFRfVVBEQVRFJyxcbiAgICBOZXdBY2NvdW50c0F2YWlsYWJsZSA9ICdORVdfQUNDT1VOVFNfQVZBSUxBQkxFJyxcbiAgICBTbXNNaWNyb2RlcG9zaXRzVmVyaWZpY2F0aW9uID0gJ1NNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTicsXG4gICAgQXV0aG9yaXphdGlvbkdyYW50ZWQgPSAnQVVUSE9SSVpBVElPTl9HUkFOVEVEJyxcbiAgICBVc2VyUGVybWlzc2lvblJldm9rZWQgPSAnVVNFUl9QRVJNSVNTSU9OX1JFVk9LRUQnLFxuICAgIFVzZXJBY2NvdW50UmV2b2tlZCA9ICdVU0VSX0FDQ09VTlRfUkVWT0tFRCcsXG4gICAgUGVuZGluZ0Rpc2Nvbm5lY3QgPSAnUEVORElOR19ESVNDT05ORUNUJyxcbiAgICBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGUgPSAnUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEUnLFxuICAgIExvZ2luUmVwYWlyZWQgPSAnTE9HSU5fUkVQQUlSRUQnLFxuICAgIFN5bmNVcGRhdGVzQXZhaWxhYmxlID0gJ1NZTkNfVVBEQVRFU19BVkFJTEFCTEUnLFxuICAgIFByb2R1Y3RSZWFkeSA9ICdQUk9EVUNUX1JFQURZJyxcbiAgICBFcnJvciA9ICdFUlJPUidcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgaXMgYHRydWVgIGlmIHRoZSB0ZXN0IGB3ZWJob29rX2NvZGVgIHdhcyBzdWNjZXNzZnVsbHkgZmlyZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2tfZmlyZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBjYWxsIHN1Y2NlZWRlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlc2V0X2xvZ2luOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHdob3NlIHZlcmlmaWNhdGlvbiBzdGF0dXMgaXMgdG8gYmUgbW9kaWZpZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgdG8gc2V0IHRoZSBhY2NvdW50IHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnXG59XG5cbi8qKlxuICogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIG9hdXRoX3N0YXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgY2FsbCBzdWNjZWVkZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdG8gc2ltdWxhdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayB1cmwgdG8gdXNlIGZvciBhbnkgcGF5bWVudCBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZSBzaW11bGF0ZWQgc3RhdHVzIGNoYW5nZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIHRvIHNldCB0aGUgcGF5bWVudCB0by4gIFZhbGlkIHN0YXR1c2VzIGluY2x1ZGU6IC0gYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGAgLSBgUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTYCAtIGBQQVlNRU5UX1NUQVRVU19GQUlMRURgIC0gYFBBWU1FTlRfU1RBVFVTX0VYRUNVVEVEYCAtIGBQQVlNRU5UX1NUQVRVU19TRVRUTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19DQU5DRUxMRURgIC0gYFBBWU1FTlRfU1RBVFVTX1JFSkVDVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgb2xkX3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG5ld19zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbn1cbi8qKlxuICogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0aGUgSXRlbSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGVzdCB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGB1c2VyX2dvb2RgLiBZb3UgY2FuIGFsc28gdXNlIGEgY3VzdG9tIHRlc3QgdXNlciDigJQgZWl0aGVyIHNldCB0aGlzIHRvIHRoZSB1c2VybmFtZSBvZiBhIGN1c3RvbSB1c2VyIGNvbmZpZ3VyZWQgaW4gdGhlIERhc2hib2FyZCwgb3Igc2V0IGl0IHRvIGB1c2VyX2N1c3RvbWAgYW5kIHBhc3MgdGhlIEpTT04tc3RyaW5naWZpZWQgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbiBvYmplY3QgYXMgYG92ZXJyaWRlX3Bhc3N3b3JkYCB0byBkZWZpbmUgb25lIGVudGlyZWx5IHZpYSBBUEkuIFNlZSBbU2FuZGJveCBDdXN0b20gVXNlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuIFlvdSBjYW4gYWxzbyB1c2UgYSBjdXN0b20gdGVzdCB1c2VyIOKAlCByZWZlcmVuY2Ugb25lIGNvbmZpZ3VyZWQgaW4gdGhlIERhc2hib2FyZCB2aWEgYG92ZXJyaWRlX3VzZXJuYW1lYCwgb3Igc2V0IGBvdmVycmlkZV91c2VybmFtZWAgdG8gYHVzZXJfY3VzdG9tYCBhbmQgcGFzcyB0aGUgSlNPTi1zdHJpbmdpZmllZCBjdXN0b20gdXNlciBjb25maWd1cmF0aW9uIG9iamVjdCBhcyB0aGlzIGZpZWxkIHRvIGRlZmluZSBvbmUgZW50aXJlbHkgdmlhIEFQSS4gU2VlIFtTYW5kYm94IEN1c3RvbSBVc2Vyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHByb2Nlc3NvciB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIGAvcHJvY2Vzc29yL2AgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSBJdGVtIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGluaXRpYWxseSBwdWxsIGZvciB0aGUgSXRlbS4gTWF5IGJlIGFueSBwcm9kdWN0cyB0aGF0IHRoZSBzcGVjaWZpZWQgYGluc3RpdHV0aW9uX2lkYCBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHdlYmhvb2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldyBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuIFlvdSBjYW4gYWxzbyB1c2UgYSBjdXN0b20gdGVzdCB1c2VyIOKAlCBlaXRoZXIgc2V0IHRoaXMgdG8gdGhlIHVzZXJuYW1lIG9mIGEgY3VzdG9tIHVzZXIgY29uZmlndXJlZCBpbiB0aGUgRGFzaGJvYXJkLCBvciBzZXQgaXQgdG8gYHVzZXJfY3VzdG9tYCBhbmQgcGFzcyB0aGUgSlNPTi1zdHJpbmdpZmllZCBjdXN0b20gdXNlciBjb25maWd1cmF0aW9uIG9iamVjdCBhcyBgb3ZlcnJpZGVfcGFzc3dvcmRgIHRvIGRlZmluZSBvbmUgZW50aXJlbHkgdmlhIEFQSS4gU2VlIFtTYW5kYm94IEN1c3RvbSBVc2Vyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfdXNlcm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlc3QgcGFzc3dvcmQgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgcGFzc19nb29kYC4gWW91IGNhbiBhbHNvIHVzZSBhIGN1c3RvbSB0ZXN0IHVzZXIg4oCUIHJlZmVyZW5jZSBvbmUgY29uZmlndXJlZCBpbiB0aGUgRGFzaGJvYXJkIHZpYSBgb3ZlcnJpZGVfdXNlcm5hbWVgLCBvciBzZXQgYG92ZXJyaWRlX3VzZXJuYW1lYCB0byBgdXNlcl9jdXN0b21gIGFuZCBwYXNzIHRoZSBKU09OLXN0cmluZ2lmaWVkIGN1c3RvbSB1c2VyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFzIHRoaXMgZmllbGQgdG8gZGVmaW5lIG9uZSBlbnRpcmVseSB2aWEgQVBJLiBTZWUgW1NhbmRib3ggQ3VzdG9tIFVzZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb247XG59XG4vKipcbiAqIEEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gb3B0aW9ucy4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHdpbGwgYmUgcGVybWl0dGVkIHRvIHNoYXJlLiBPcHRpb25zIGluY2x1ZGUgYGJhbmtgIGFuZCBgcGF5cm9sbGAuIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHN0YXRlbWVudHMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggc3RhdGVtZW50cyBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCBzdGF0ZW1lbnRzIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9ucyBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2FjdGlvbnMvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRyYW5zYWN0aW9ucyB0byBiZSBhZGRlZFxuICAgICAqIEB0eXBlIHtBcnJheTxDdXN0b21TYW5kYm94VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q3VzdG9tU2FuZGJveFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zYWN0aW9ucy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZS4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lciAoaS5lLiB0aGUgb3JpZ2luYXRvcikuIE9ubHkgYXBwbGljYWJsZSB0byBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIGN1c3RvbWVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIElmIHByb3ZpZGVkLCBvbmx5IHRoZSBwZW5kaW5nIGJhbGFuY2UgdGhhdCBpcyBkdWUgYmVmb3JlIHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgdGVzdCBjbG9jayB3aWxsIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGByZWZ1bmQucG9zdGVkYCwgYHJlZnVuZC5zZXR0bGVkYCwgYHJlZnVuZC5mYWlsZWRgLCBvciBgcmVmdW5kLnJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcmVmdW5kIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQuZmFpbGVkYCAgYHJlZnVuZC5wZW5kaW5nYCAtLT4gYHJlZnVuZC5wb3N0ZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQucmV0dXJuZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQuc2V0dGxlZGAgIGByZWZ1bmQucG9zdGVkYCBldmVudHMgY2FuIG9ubHkgYmUgc2ltdWxhdGVkIGlmIHRoZSByZWZ1bmRlZCB0cmFuc2ZlciBoYXMgYmVlbiB0cmFuc2l0aW9uZWQgdG8gc2V0dGxlZC4gVGhpcyBtaW1pY3MgdGhlIG9yZGVyaW5nIG9mIGV2ZW50cyBpbiBQcm9kdWN0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFjdGlvbiB0byBzaW11bGF0ZS4gTXVzdCBiZSBlaXRoZXIgYGFwcHJvdmVgIG9yIGByZWplY3RgLiAgLSBgYXBwcm92ZWA6IFNpbXVsYXRlcyBiYW5rIGFwcHJvdmFsLCB0cmFuc2l0aW9uaW5nIHRoZSB0cmFuc2ZlciB0byBgc2V0dGxlZGAgc3RhdHVzIC0gYHJlamVjdGA6IFNpbXVsYXRlcyBiYW5rIHJlamVjdGlvbiwgdHJhbnNpdGlvbmluZyB0aGUgdHJhbnNmZXIgdG8gYGZhaWxlZGAgc3RhdHVzIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVBY3Rpb24ge1xuICAgIEFwcHJvdmUgPSAnYXBwcm92ZScsXG4gICAgUmVqZWN0ID0gJ3JlamVjdCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JmcC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVBY3Rpb259XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJmcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjdGlvbjogU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVBY3Rpb247XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGFtb3VudCBwcm92aWRlZCBieSB0aGUgY2FsbGVyIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzLCBtdXN0IG1hdGNoIHRoZSBhbW91bnQgb24gdGhlIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCBuYW1lIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMsIG11c3QgbWF0Y2ggdGhlIHNlbmRlciBjbGllbnQgbmFtZSBvbiB0aGUgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZnAvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJmcFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZnBTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmZwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBgZnVuZHNfYXZhaWxhYmxlYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNmZXIgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHBlbmRpbmdgIC0tPiBgZmFpbGVkYCAgYHBlbmRpbmdgIC0tPiBgcG9zdGVkYCAgYHBvc3RlZGAgLS0+IGByZXR1cm5lZGAgIGBwb3N0ZWRgIC0tPiBgc2V0dGxlZGAgIGBzZXR0bGVkYCAtLT4gYGZ1bmRzX2F2YWlsYWJsZWAgKG9ubHkgYXBwbGljYWJsZSB0byBBQ0ggZGViaXRzLikgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBzd2VlcCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBvbiB0aGUgZGF5IG9mIHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgYHRlc3RfY2xvY2tgLiBJZiB0aGUgZGF0ZSBvZiBgdmlydHVhbF90aW1lYCBpcyBvbiB3ZWVrZW5kIG9yIGEgZmVkZXJhbCBob2xpZGF5LCB0aGUgbmV4dCBhdmFpbGFibGUgYmFua2luZyBkYXkgaXMgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpbXVsYXRlZFRyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwPzogU2ltdWxhdGVkVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGFuZCBvbmx5IGlmIGEgYHRlc3RfY2xvY2tfaWRgIHdhcyBpbmNsdWRlZCBpbiB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCByZXF1ZXN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpbXVsYXRpbmcgcmVjdXJyaW5nIHRyYW5zZmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9zYW5kYm94LyNzaW11bGF0aW5nLXJlY3VycmluZy10cmFuc2ZlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXdfdmlydHVhbF90aW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2lsbCBiZSB1c2VkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclRlc3RDbG9ja31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrOiBUcmFuc2ZlclRlc3RDbG9jaztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGFuZCBvbmx5IGlmIGEgYHRlc3RfY2xvY2tfaWRgIHdhcyBpbmNsdWRlZCBpbiB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCByZXF1ZXN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpbXVsYXRpbmcgcmVjdXJyaW5nIHRyYW5zZmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9zYW5kYm94LyNzaW11bGF0aW5nLXJlY3VycmluZy10cmFuc2ZlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUZXN0Q2xvY2t9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVzdF9jbG9jazogVHJhbnNmZXJUZXN0Q2xvY2s7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IHZpcnR1YWwgdGltZXN0YW1wIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF92aXJ0dWFsX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgdmlydHVhbCB0aW1lc3RhbXAgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF92aXJ0dWFsX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0ZXN0IGNsb2NrcyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclRlc3RDbG9jaz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tzOiBBcnJheTxUcmFuc2ZlclRlc3RDbG9jaz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBiZSByZXNldC4gIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gcmVzZXR0aW5nIGFsbCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIHByb2R1Y3RfYWNjZXNzPzogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFjY2Vzcz59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpbmRpY2F0b3IgZm9yIHdoZW4gc2NvcGVzIGFyZSBiZWluZyB1cGRhdGVkLiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCB2aWEgZW5yb2xsbWVudCAoaS5lLiBPQXV0aCksIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgRU5ST0xMTUVOVGAuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGluIGEgcG9zdC1lbnJvbGxtZW50IHZpZXcsIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgUE9SVEFMYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNjb3Blc0NvbnRleHQge1xuICAgIEVucm9sbG1lbnQgPSAnRU5ST0xMTUVOVCcsXG4gICAgUG9ydGFsID0gJ1BPUlRBTCdcbn1cblxuLyoqXG4gKiBUaGUgc2NvcGVzIG9iamVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY29wZXNOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcm9kdWN0X2FjY2Vzcz86IFByb2R1Y3RBY2Nlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBY2Nlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgd2h5IGEgc2NyZWVuaW5nIGhpdCBtYXRjaGVkIHRoZSBwcm92aWRlZCB1c2VyIGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVzX29mX2JpcnRoPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZXM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gU2NyZWVuaW5nIGhpdHMgYXJlIGltbXV0YWJsZSBvbmNlIHRoZXkgaGF2ZSBiZWVuIHJldmlld2VkLiBJZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBkdWUgdG8gdXBkYXRlcyB0byB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIHNjcmVlbmluZyBoaXQgd2lsbCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhvc2UgY2hhbmdlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtc192ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRGF0ZXMgb2YgYmlydGggYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IEFycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT47XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZGF0ZSBvZiBiaXJ0aCBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGVSYW5nZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgZGF0YT86IERhdGVSYW5nZTtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnQ7XG59XG4vKipcbiAqIEFuYWx5emVkIG5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGluZGl2aWR1YWwgc2NyZWVuaW5nIHN0YXR1cyBoYXMgY2hhbmdlZCwgd2hpY2ggY2FuIG9jY3VyIG1hbnVhbGx5IHZpYSB0aGUgZGFzaGJvYXJkIG9yIGR1cmluZyBvbmdvaW5nIG1vbml0b3JpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTQ1JFRU5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc2VjdXJpdHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2Ugc3RhcnQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIFtoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNpbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGN1c2lwOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIChEZXByZWNhdGVkKSA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2Vkb2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBnaXZlbiB0byB0aGUgc2VjdXJpdHkgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWRgIGlzIHByZXNlbnQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBQbGFpZCBgaW5zdGl0dXRpb25faWRgIG9mIHRoZSBpbnN0aXR1dGlvbiB0byB3aG9tIHRoZSBpZGVudGlmaWVyIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbiBjZXJ0YWluIGNhc2VzLCBQbGFpZCB3aWxsIHByb3ZpZGUgdGhlIElEIG9mIGFub3RoZXIgc2VjdXJpdHkgd2hvc2UgcGVyZm9ybWFuY2UgcmVzZW1ibGVzIHRoaXMgc2VjdXJpdHksIHR5cGljYWxseSB3aGVuIHRoZSBvcmlnaW5hbCBzZWN1cml0eSBoYXMgbG93IHZvbHVtZSwgb3Igd2hlbiBhIHByaXZhdGUgc2VjdXJpdHkgY2FuIGJlIG1vZGVsZWQgd2l0aCBhIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHByb3h5X3NlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5XFwncyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgYSBzZWN1cml0eSBpcyBhIGhpZ2hseSBsaXF1aWQgYXNzZXQgYW5kIGNhbiBiZSB0cmVhdGVkIGxpa2UgY2FzaC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc19jYXNoX2VxdWl2YWxlbnQ6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSB0eXBlIG9mIHRoZSBob2xkaW5nLiAgSW4gcmFyZSBpbnN0YW5jZXMsIGEgbnVsbCB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIGluc3RpdHV0aW9uYWwgZGF0YSBpcyBpbnN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBzZWN1cml0eSB0eXBlLiAgVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHkgc3VidHlwZSBvZiB0aGUgaG9sZGluZy4gIEluIHJhcmUgaW5zdGFuY2VzLCBhIG51bGwgdmFsdWUgaXMgcmV0dXJuZWQgd2hlbiBpbnN0aXR1dGlvbmFsIGRhdGEgaXMgaW5zdWZmaWNpZW50IHRvIGRldGVybWluZSB0aGUgc2VjdXJpdHkgc3VidHlwZS4gIFBvc3NpYmxlIHZhbHVlczogYGFzc2V0IGJhY2tlZCBzZWN1cml0eWAsIGBiaWxsYCwgYGJvbmRgLCBgYm9uZCB3aXRoIHdhcnJhbnRzYCwgYGNhc2hgLCBgY2FzaCBtYW5hZ2VtZW50IGJpbGxgLCBgY29tbW9uIHN0b2NrYCwgYGNvbnZlcnRpYmxlIGJvbmRgLCBgY29udmVydGlibGUgZXF1aXR5YCwgYGNyeXB0b2N1cnJlbmN5YCwgYGRlcG9zaXRhcnkgcmVjZWlwdGAsIGBkZXBvc2l0YXJ5IHJlY2VpcHQgb24gZGVidGAsIGBldGZgLCBgZmxvYXQgcmF0aW5nIG5vdGVgLCBgZnVuZCBvZiBmdW5kc2AsIGBoZWRnZSBmdW5kYCwgYGxpbWl0ZWQgcGFydG5lcnNoaXAgdW5pdGAsIGBtZWRpdW0gdGVybSBub3RlYCwgYG1vbmV5IG1hcmtldCBkZWJ0YCwgYG1vcnRnYWdlIGJhY2tlZCBzZWN1cml0eWAsIGBtdW5pY2lwYWwgYm9uZGAsIGBtdXR1YWwgZnVuZGAsIGBub3RlYCwgYG9wdGlvbmAsIGBvdGhlcmAsIGBwcmVmZXJyZWQgY29udmVydGlibGVgLCBgcHJlZmVycmVkIGVxdWl0eWAsIGBwcml2YXRlIGVxdWl0eSBmdW5kYCwgYHJlYWwgZXN0YXRlIGludmVzdG1lbnQgdHJ1c3RgLCBgc3RydWN0dXJlZCBlcXVpdHkgcHJvZHVjdGAsIGB0cmVhc3VyeSBpbmZsYXRpb24gcHJvdGVjdGVkIHNlY3VyaXRpZXNgLCBgdW5pdGAsIGB3YXJyYW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHN1YnR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB0aGUgY2xvc2Ugb2YgdGhlIHByZXZpb3VzIHRyYWRpbmcgc2Vzc2lvbi4gTnVsbCBmb3Igbm9uLXB1YmxpYyBzZWN1cml0aWVzLiAgSWYgdGhlIHNlY3VyaXR5IGlzIGEgZm9yZWlnbiBjdXJyZW5jeSB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBkYWlseSBhbmQgd2lsbCBiZSBwcmljZWQgaW4gVVNELiAgSWYgdGhlIHNlY3VyaXR5IGlzIGEgY3J5cHRvY3VycmVuY3ksIHRoaXMgZmllbGQgd2lsbCBiZSB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGEgZGF5LiBBcyBjcnlwdG8gcHJpY2VzIGNhbiBmbHVjdHVhdGUgcXVpY2tseSBhbmQgZGF0YSBtYXkgYmVjb21lIHN0YWxlIHNvb25lciB0aGFuIG90aGVyIGFzc2V0IGNsYXNzZXMsIHJlZmVyIHRvIGB1cGRhdGVfZGF0ZXRpbWVgIHdpdGggdGhlIHRpbWUgd2hlbiB0aGUgcHJpY2Ugd2FzIGxhc3QgdXBkYXRlZC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjbG9zZV9wcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGZvciB3aGljaCBgY2xvc2VfcHJpY2VgIGlzIGFjY3VyYXRlLiBBbHdheXMgYG51bGxgIGlmIGBjbG9zZV9wcmljZWAgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2VfYXNfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSBhdCB3aGljaCBgY2xvc2VfcHJpY2VgIGlzIGFjY3VyYXRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVwZGF0ZV9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHByaWNlIGdpdmVuLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdG9yIGNsYXNzaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSwgc3VjaCBhcyBGaW5hbmNlLCBIZWFsdGggVGVjaG5vbG9neSwgZXRjLiAgRm9yIGEgY29tcGxldGUgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMsIHBsZWFzZSByZWZlciB0byB0aGUgW1xcXCJTZWN0b3JzIGFuZCBJbmR1c3RyaWVzXFxcIiBzcHJlYWRzaGVldF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUw3YVhVZHFMaHhnTThxZTdoSzY3cXFLWGlVZFFxSUxwd1owTHB4dkNWbmMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdG9yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmR1c3RyeSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHksIHN1Y2ggYXMgQmlvdGVjaG5vbG9neSwgQWlybGluZXMsIGV0Yy4gIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtcXFwiU2VjdG9ycyBhbmQgSW5kdXN0cmllc1xcXCIgc3ByZWFkc2hlZXRdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFMN2FYVWRxTGh4Z004cWU3aEs2N3FxS1hpVWRRcUlMcHdaMExweHZDVm5jKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluZHVzdHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tMTA5NjIgQ2xhc3NpZmljYXRpb24gb2YgRmluYW5jaWFsIEluc3RydW1lbnRzIENvZGUgdXNlZCB0byBjbGFzc2lmeSB0aGUgc2VjdXJpdHkgYmFzZWQgb24gaXRzIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjZmlfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgRklHSSwgYSB1bmlxdWUgRmluYW5jaWFsIEluc3RydW1lbnQgR2xvYmFsIElkZW50aWZpZXIgYXNzaWduZWQgdG8gc2VjdXJpdGllcyB0aGF0IGlzIGltbXV0YWJsZSBhbmQgc3RheXMgY29uc2lzdGVudCBhY3Jvc3MgbW9zdCBjb3Jwb3JhdGUgYWN0aW9ucy4gVGhpcyBpcyBhbiBvcGVuIGRhdGEgc3RhbmRhcmQgaXNzdWVkIGJ5IHRoZSBPYmplY3QgTWFuYWdlbWVudCBHcm91cCBhbmQgYWRtaW5pc3RlcmVkIGJ5IEJsb29tYmVyZyBMLlAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBmaWdpOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcHRpb25Db250cmFjdH1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBvcHRpb25fY29udHJhY3Q6IE9wdGlvbkNvbnRyYWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rml4ZWRJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgZml4ZWRfaW5jb21lOiBGaXhlZEluY29tZSB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBvciBgaXNpbmApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2UgW3JlcXVlc3QgSVNJTi9DVVNJUCBhY2Nlc3MgaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNpbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIFtyZXF1ZXN0IElTSU4vQ1VTSVAgYWNjZXNzIGhlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIChEZXByZWNhdGVkKSA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5XFwncyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBZ2UtZXN0aW1hdGlvbiByZXN1bHRzIGZyb20gdGhlIHNlbGZpZSBjYXB0dXJlLiBUaGlzIGZpZWxkIGlzIGBudWxsYCB3aGVuIGFuIGFnZSByYW5nZSBjb3VsZCBub3QgYmUgZXN0aW1hdGVkIGZyb20gdGhlIHNlbGZpZSBjYXB0dXJlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBZ2VDaGVja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGZpZUFnZUNoZWNrIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQWdlQ2hlY2tTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFnZUNoZWNrXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVBZ2VDaGVja1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWdlIGF0IHRoZSB0aW1lIG9mIHRoZSBzZWxmaWUgY2FwdHVyZSwgY2FsY3VsYXRlZCBmcm9tIHRoZSBkYXRlIG9mIGJpcnRoIHN1Ym1pdHRlZCBkdXJpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLiBJZiBtdWx0aXBsZSBkYXRlIG9mIGJpcnRoIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSwgdGhlIGRhdGUgb2YgYmlydGggc3VibWl0dGVkIGluIHRoZSBmbG93IHNlc3Npb24gdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGUgZG9jdW1lbnQgZGF0ZSBvZiBiaXJ0aC4gVGhpcyBmaWVsZCBpcyBgbnVsbGAgd2hlbiB0aGUgZGF0ZSBvZiBiaXJ0aCBpcyB1bmF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBZ2VDaGVja1xuICAgICAqL1xuICAgIHJlcG9ydGVkX2FnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMb3dlciBib3VuZCBvZiB0aGUgZXN0aW1hdGVkIGFnZSByYW5nZSBmcm9tIHRoZSBzZWxmaWUgY2FwdHVyZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBZ2VDaGVja1xuICAgICAqL1xuICAgIGFnZV9lc3RpbWF0ZV9sb3dlcl9ib3VuZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFVwcGVyIGJvdW5kIG9mIHRoZSBlc3RpbWF0ZWQgYWdlIHJhbmdlIGZyb20gdGhlIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFnZUNoZWNrXG4gICAgICovXG4gICAgYWdlX2VzdGltYXRlX3VwcGVyX2JvdW5kOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZXBvcnRlZCBhZ2UgYWxpZ25zIHdpdGggdGhlIGVzdGltYXRlZCBzZWxmaWUgY2FwdHVyZSBhZ2UgcmFuZ2UuICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSByZXBvcnRlZCBhZ2UgZmFsbHMgd2l0aGluIHRoZSBlc3RpbWF0ZWQgc2VsZmllIGNhcHR1cmUgYWdlIHJhbmdlLiAgYHdhcm5pbmdgIGluZGljYXRlcyB0aGF0IHRoZSByZXBvcnRlZCBhZ2UgZmFsbHMgb3V0c2lkZSB0aGUgZXN0aW1hdGVkIHNlbGZpZSBjYXB0dXJlIGFnZSByYW5nZSwgYnV0IGlzIGNsb3NlIGVub3VnaCB0aGF0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHJldmlld2VkLiAgYG5vX21hdGNoYCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVwb3J0ZWQgYWdlIGZhbGxzIGZhciBvdXRzaWRlIHRoZSBlc3RpbWF0ZWQgc2VsZmllIGNhcHR1cmUgYWdlIHJhbmdlLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBub3QgZW5vdWdoIGRhdGEgYXZhaWxhYmxlIGF0IGFnZS1lc3RpbWF0aW9uIHRpbWUgdG8gY29tcGFyZSB0aGUgcmVwb3J0ZWQgYWdlIGFnYWluc3QgdGhlIGVzdGltYXRlZCBzZWxmaWUgY2FwdHVyZSBhZ2UgcmFuZ2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVBZ2VDaGVja1N0YXR1cyB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFdhcm5pbmcgPSAnd2FybmluZycsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIHNlbGZpZSB3YXMgcHJvY2Vzc2VkLiBJZiBhIHNlbGZpZSBmYWlscyB2ZXJpZmljYXRpb24sIHRoZSBkZXRhaWxzIGluIHRoZSBgYW5hbHlzaXNgIG9iamVjdCBzaG91bGQgaGVscCBjbGFyaWZ5IHdoeSB0aGUgc2VsZmllIHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29ufVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc1xuICAgICAqL1xuICAgIGRvY3VtZW50X2NvbXBhcmlzb246IFNlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0xpdmVuZXNzQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgbGl2ZW5lc3NfY2hlY2s6IFNlbGZpZUFuYWx5c2lzTGl2ZW5lc3NDaGVjaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQWdlQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgYWdlX2NoZWNrPzogU2VsZmllQWdlQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc1xuICAgICAqL1xuICAgIGZhY2lhbF9hbmFseXNpcz86IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXMgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzZWxmaWUgYW5kIHRoZSBkb2N1bWVudCAoaWYgZG9jdW1lbnRhcnkgdmVyaWZpY2F0aW9uIGFsc28gcmFuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29uIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBvZiB0aGUgZmFjaWFsIGZlYXR1cmVzIG9mIHRoZSBzZWxmaWUgd2hlbiBjb21wYXJlZCB0byB0aGUgZmFjZSBpbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQsIGlmIG9uZSBpcyBwcmVzZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9leWU6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIHJpZ2h0X2V5ZTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICByaWdodF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBmb3JlaGVhZDogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbWlkZGxlX2ZvcmVoZWFkOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBub3NlOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaGlsdHJ1bTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbW91dGg6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIGphdzogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9jaGVlazogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgcmlnaHRfY2hlZWs6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xufVxuLyoqXG4gKiBPdXRjb21lIG9mIHRoZSBmYWNpYWwgYW5hbHlzaXMgZm9yIGEgc3BlY2lmaWMgZmFjaWFsIGZlYXR1cmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFzc2Vzc21lbnQgb2Ygd2hldGhlciB0aGUgc2VsZmllIGNhcHR1cmUgaXMgb2YgYSByZWFsIGh1bWFuIGJlaW5nLCBhcyBvcHBvc2VkIHRvIGEgcGljdHVyZSBvZiBhIGh1bWFuIG9uIGEgc2NyZWVuLCBhIHBpY3R1cmUgb2YgYSBwYXBlciBjdXQgb3V0LCBzb21lb25lIHdlYXJpbmcgYSBtYXNrLCBvciBhIGRlZXBmYWtlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogVGhlIGltYWdlIG9yIHZpZGVvIGNhcHR1cmUgb2YgYSBzZWxmaWUuIE9ubHkgb25lIG9mIGBpbWFnZV91cmxgIG9yIGB2aWRlb191cmxgIHdpbGwgYmUgcG9wdWxhdGVkIHBlciBzZWxmaWUuIEluIHRoZSB2YXN0IG1ham9yaXR5IG9mIHNlc3Npb25zIFBsYWlkIHJlY29yZHMgYSBzaG9ydCB2aWRlbyBvZiB0aGUgdXNlciwgc28gYHZpZGVvX3VybGAgaXMgcG9wdWxhdGVkIGFuZCBgaW1hZ2VfdXJsYCBpcyBgbnVsbGAuIGBpbWFnZV91cmxgIGlzIG9ubHkgcG9wdWxhdGVkIGluIHRoZSByYXJlIHBhc3NpdmUtbGl2ZW5lc3MgZmFsbGJhY2sgY2FzZSwgd2hlcmUgdGhlIHVzZXJcXCdzIGRldmljZSBjb3VsZCBub3QgY29tcGxldGUgdGhlIHN0YW5kYXJkIHZpZGVvIGxpdmVuZXNzIGNhcHR1cmUgKGZvciBleGFtcGxlLCBhIGNhbWVyYSBvciBzdHJlYW1pbmcgZXJyb3IpIGFuZCBzdWJtaXR0ZWQgYSBzaW5nbGUgc3RpbGwgaW1hZ2UgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGZpZUNhcHR1cmUge1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgZm9yIGRvd25sb2FkaW5nIGEgc3RpbGwtaW1hZ2Ugc2VsZmllIGNhcHR1cmUuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgd2hlbiB0aGUgc2Vzc2lvbiBmZWxsIGJhY2sgdG8gcGFzc2l2ZSAoaW1hZ2UtYmFzZWQpIGxpdmVuZXNzLiBGb3IgdGhlIG1ham9yaXR5IG9mIHNlbGZpZSBjaGVja3MgdGhpcyBmaWVsZCBpcyBgbnVsbGAgYW5kIGB2aWRlb191cmxgIGlzIHBvcHVsYXRlZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICBpbWFnZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYSB2aWRlbyBzZWxmaWUgY2FwdHVyZS4gVGhpcyBpcyB0aGUgc3RhbmRhcmQgc2VsZmllIGNhcHR1cmUgZm9yIElkZW50aXR5IFZlcmlmaWNhdGlvbi4gUGxhaWQgcmVjb3JkcyBhIHNob3J0IHZpZGVvIG9mIHRoZSB1c2VyIGR1cmluZyB0aGUgU2VsZmllIENoZWNrIGxpdmVuZXNzIHN0ZXAsIHNvIHRoaXMgZmllbGQgaXMgcG9wdWxhdGVkIGZvciB0aGUgdmFzdCBtYWpvcml0eSBvZiBzZWxmaWUgY2hlY2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICB2aWRlb191cmw6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMuc2VsZmllX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IFNlbGZpZUNoZWNrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHNlbGZpZXMgc3VibWl0dGVkIHRvIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VsZmllQ2hlY2tTZWxmaWU+fVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1xuICAgICAqL1xuICAgIHNlbGZpZXM6IEFycmF5PFNlbGZpZUNoZWNrU2VsZmllPjtcbn1cbi8qKlxuICogQ2FwdHVyZXMgYW5kIGFuYWx5c2lzIGZyb20gYSB1c2VyXFwncyBzZWxmaWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrU2VsZmllXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IHNlbGZpZSB1cGxvYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNhcHR1cmV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgY2FwdHVyZTogU2VsZmllQ2FwdHVyZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgYW5hbHlzaXM6IFNlbGZpZUFuYWx5c2lzO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnNlbGZpZV9jaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVDaGVja1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFuIG91dGNvbWUgc3RhdHVzIGZvciB0aGlzIHNwZWNpZmljIHNlbGZpZS4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgc2VsZmllX2NoZWNrLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIHNlbGZpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJhY3MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgdGhpcyByZWNpcGllbnQgbmVlZHMgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQmFjcyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXR9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IFZlcmlmaWNhdGlvbk9mQXNzZXQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UX0RFVEFJTDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbCB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgdHlwZSBvZiBvcmRlciBWZXJpZmljYXRpb24gb2YgQXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFZlbmRvck9yZGVySWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAgICAgKi9cbiAgICBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBWb2UgPSAnVk9FJ1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHVkZW50IGxvYW4gc2VydmljZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSByZW1pdHRhbmNlIGFkZHJlc3MgdG8gd2hpY2ggcGF5bWVudHMgc2hvdWxkIGJlIHNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlckFkZHJlc3NEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogU2VydmljZTtcbn1cbi8qKlxuICogU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zZXNzaW9uL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgYSB0ZW1wbGF0ZSBkZWZpbmVkIGluIFBsYWlkIERhc2hib2FyZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcjtcbiAgICAvKipcbiAgICAgKiBBIFVSSSBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBhIHVzZXIgc2hvdWxkIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBUaGUgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIG5vdCBjb250YWluIGFueSBxdWVyeSBwYXJhbWV0ZXJzLiBXaGVuIHVzZWQgaW4gUHJvZHVjdGlvbiwgbXVzdCBiZSBhbiBodHRwcyBVUkkuIE5vdGUgdGhhdCBhbnkgcmVkaXJlY3QgVVJJIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCByZWRpcmVjdCBVUklzIGxpc3QgaW4gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBJZiBpbml0aWFsaXppbmcgb24gQW5kcm9pZCwgYGFuZHJvaWRfcGFja2FnZV9uYW1lYCBtdXN0IGJlIHNwZWNpZmllZCBpbnN0ZWFkIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHlvdXIgYXBwXFwncyBBbmRyb2lkIHBhY2thZ2UuIFJlcXVpcmVkIGlmIHVzaW5nIHRoZSBzZXNzaW9uIHRva2VuIHRvIGluaXRpYWxpemUgTGF5ZXIgb24gQW5kcm9pZC4gQW55IHBhY2thZ2UgbmFtZSBzcGVjaWZpZWQgaGVyZSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgQW5kcm9pZCBwYWNrYWdlIG5hbWVzIHNldHRpbmcgb24gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBXaGVuIGNyZWF0aW5nIGEgc2Vzc2lvbiB0b2tlbiBmb3IgaW5pdGlhbGl6aW5nIExheWVyIG9uIG90aGVyIHBsYXRmb3JtcywgYGFuZHJvaWRfcGFja2FnZV9uYW1lYCBtdXN0IGJlIGxlZnQgYmxhbmsgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFuZHJvaWRfcGFja2FnZV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggYW55IHdlYmhvb2tzIHNob3VsZCBiZSBzZW50LiBJZiB5b3UgdXNlIHRoZSBzYW1lIHdlYmhvb2sgbGlzdGVuZXIgZm9yIGFsbCBTYW5kYm94IG9yIGFsbCBQcm9kdWN0aW9uIGFjdGl2aXR5LCBzZXQgdGhpcyB2YWx1ZSBpbiB0aGUgTGF5ZXIgdGVtcGxhdGUgZWRpdG9yIGluIHRoZSBEYXNoYm9hcmQgaW5zdGVhZC4gT25seSBwcm92aWRlIGEgdmFsdWUgaW4gdGhpcyBmaWVsZCBpZiB5b3UgbmVlZCB0byB1c2UgbXVsdGlwbGUgd2ViaG9vayBVUkxzIHBlciBlbnZpcm9ubWVudCAoYW4gdW5jb21tb24gdXNlIGNhc2UpLiBJZiBwcm92aWRlZCwgYSB2YWx1ZSBpbiB0aGlzIGZpZWxkIHdpbGwgdGFrZSBwcmlvcml0eSBvdmVyIHdlYmhvb2sgdmFsdWVzIHNldCBpbiB0aGUgTGF5ZXIgdGVtcGxhdGUgZWRpdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBlbmQgdXNlci4gUmVxdWlyZWQgaWYgYSByb290LWxldmVsIGB1c2VyX2lkYCBpcyBub3QgcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFVzZXIge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIuIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgYSB1c2VyIElEIG51bWJlciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuIEl0IGlzIGN1cnJlbnRseSB1c2VkIGFzIGEgbWVhbnMgb2Ygc2VhcmNoaW5nIGxvZ3MgZm9yIHRoZSBnaXZlbiB1c2VyIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogU2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Nlc3Npb24vdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Nlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlTGlua31cbiAgICAgKiBAbWVtYmVyb2YgU2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rPzogU2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2VMaW5rO1xufVxuLyoqXG4gKiBSZXNwb25zZSBkYXRhIGZvciBgL3Nlc3Npb24vdG9rZW4vY3JlYXRlYCBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIExpbmsgU0RLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZUxpbmtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZUxpbmsge1xuICAgIC8qKlxuICAgICAqIEEgTGluayB0b2tlbiwgd2hpY2ggY2FuIGJlIHN1cHBsaWVkIHRvIExpbmsgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBpdCBhbmQgcmVjZWl2ZSBhIGBwdWJsaWNfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlTGlua1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwaXJhdGlvbiBkYXRlIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuIEEgYGxpbmtfdG9rZW5gIGNyZWF0ZWQgdG8gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCB0aGF0IHdpbGwgYmUgZXhjaGFuZ2VkIGZvciBhIG5ldyBgYWNjZXNzX3Rva2VuYCBleHBpcmVzIGFmdGVyIDQgaG91cnMuIEEgYGxpbmtfdG9rZW5gIGNyZWF0ZWQgZm9yIGFuIGV4aXN0aW5nIEl0ZW0gKHN1Y2ggYXMgd2hlbiB1cGRhdGluZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYCBieSBsYXVuY2hpbmcgTGluayBpbiB1cGRhdGUgbW9kZSkgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlc3Npb25Ub2tlbkNyZWF0ZVJlc3BvbnNlTGlua1xuICAgICAqL1xuICAgIGV4cGlyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZUxpbmtcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgZGVjaXNpb24gZnJvbSB0aGUgcmlzayBhc3Nlc3NtZW50LiAgYEFQUFJPVkVgOiBhcHByb3ZlIHRoZSB0cmFuc2FjdGlvbiB3aXRob3V0IHJlcXVpcmluZyBmdXJ0aGVyIGFjdGlvbnMgZnJvbSB5b3VyIGN1c3RvbWVycy4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBhcmUgcGxhY2luZyBhIHN0YW5kYXJkIGhvbGQgZm9yIGFsbCB0aGUgYXBwcm92ZWQgdHJhbnNhY3Rpb25zIGJlZm9yZSBtYWtpbmcgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzLiBZb3Ugc2hvdWxkIGFsc28gdXNlIHRoaXMgZmllbGQgaWYgeW91IGRlY2lkZSB0byBhY2NlbGVyYXRlIHRoZSBmdW5kIGF2YWlsYWJpbGl0eSBmb3IgeW91ciBjdXN0b21lcnMuICBgUkVWSUVXYDogdGhlIHRyYW5zYWN0aW9uIHJlcXVpcmVzIG1hbnVhbCByZXZpZXcgIGBSRUpFQ1RgOiByZWplY3QgdGhlIHRyYW5zYWN0aW9uICBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYDogZm9yIGV4YW1wbGUsIHBsYWNpbmcgYSBsb25nZXIgaG9sZCBvbiBmdW5kcyB0aGFuIHRob3NlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBvciBpbnRyb2R1Y2luZyBjdXN0b21lciBmcmljdGlvbnMgc3VjaCBhcyBzdGVwLXVwIHZlcmlmaWNhdGlvbi9hdXRoZW50aWNhdGlvbiAgYE5PVF9FVkFMVUFURURgOiBpZiBvbmx5IGxvZ2dpbmcgdGhlIHJlc3VsdHMgd2l0aG91dCB1c2luZyB0aGVtIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsRGVjaXNpb25PdXRjb21lIHtcbiAgICBBcHByb3ZlID0gJ0FQUFJPVkUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnLFxuICAgIFJlamVjdCA9ICdSRUpFQ1QnLFxuICAgIFRha2VPdGhlclJpc2tNZWFzdXJlcyA9ICdUQUtFX09USEVSX1JJU0tfTUVBU1VSRVMnLFxuICAgIE5vdEV2YWx1YXRlZCA9ICdOT1RfRVZBTFVBVEVEJ1xufVxuXG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhlIEFDSCBkZWJpdCB3YXMgc3VibWl0dGVkIHRvIHRoZSBiYW5rIGZvciBwcm9jZXNzaW5nIChpbiBJU08gODYwMSBmb3JtYXQ6IGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLiBUaGlzIGZpZWxkIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBhdHRlbXB0IGluaXRpYXRlZCBhZnRlciB0aGUgYC9zaWduYWwvc2NoZWR1bGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc3VibWl0dGVkX2F0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBkZXZpY2UuIFRoZXNlIGZpZWxkcyBhcmUgb3B0aW9uYWwsIGJ1dCBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbmNyZWFzZSB0aGUgYWNjdXJhY3kgb2YgcmVzdWx0cyB3aGVuIHVzaW5nIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMuIFdoZW4gdXNpbmcgYSBCYWxhbmNlLW9ubHkgUnVsZXNldCwgdGhlc2UgZmllbGRzIGFyZSBpZ25vcmVkIGlmIHRoZSBTaWduYWwgQWRkZW5kdW0gaGFzIGJlZW4gc2lnbmVkOyBpZiBpdCBoYXMgbm90IGJlZW4gc2lnbmVkLCB1c2luZyB0aGVzZSBmaWVsZHMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0aGF0IGluaXRpYXRlZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBhZ2VudCBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiBcXFwiTW96aWxsYS81LjBcXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY29yZSBhdHRyaWJ1dGVzIG9iamVjdCBjb250YWlucyBhZGRpdGlvbmFsIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgdGhlIEFDSCByZXR1cm4gcmlzay4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIG9ubHkgYGF2YWlsYWJsZV9iYWxhbmNlYCBhbmQgYGN1cnJlbnRfYmFsYW5jZWAgd2lsbCBiZSByZXR1cm5lZCBhcyBjb3JlIGF0dHJpYnV0ZXMuIElmIHVzaW5nIGEgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBydWxlc2V0LCBvdmVyIDgwIGNvcmUgYXR0cmlidXRlcyB3aWxsIGJlIHJldHVybmVkLiBFeGFtcGxlcyBvZiBhdHRyaWJ1dGVzIGluY2x1ZGU6ICBgYXZhaWxhYmxlX2JhbGFuY2VgIGFuZCBgY3VycmVudF9iYWxhbmNlYDogVGhlIGJhbGFuY2UgaW4gdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIGBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50YDogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgaXMgYSBzYXZpbmdzL21vbmV5IG1hcmtldCBhY2NvdW50ICBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBzYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDcgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgaXMgYSBzYXZpbmdzL21vbmV5IG1hcmtldCBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTV0aCBwZXJjZW50aWxlIG9mIGFsbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTVfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTV0aCBwZXJjZW50aWxlIG9mIGFsbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTVfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB3aXRoaW4gdGhlIHBhc3QgOTAgZGF5cyB3aGVuIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIGhhZCBhIG5lZ2F0aXZlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmFpbGFibGUgYmFsYW5jZSwgYXMgb2YgdGhlIGBiYWxhbmNlX2xhc3RfdXBkYXRlZGAgdGltZS4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYXZhaWxhYmxlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgYmFsYW5jZSwgYXMgb2YgdGhlIGBiYWxhbmNlX2xhc3RfdXBkYXRlZGAgdGltZS4gVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjdXJyZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhhdCB0aGUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYmFsYW5jZV9sYXN0X3VwZGF0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZHJlc3NfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfMTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDMxIGFuZCBkYXkgNjAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9lb2RfYmFsYW5jZV8zMWRfdG9fNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDYxIGFuZCBkYXkgOTAgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9lb2RfYmFsYW5jZV82MWRfdG9fOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDMxIGFuZCBkYXkgNjAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV8zMWRfdG9fNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDYxIGFuZCBkYXkgOTAgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV82MWRfdG9fOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDMxIGFuZCBkYXkgNjAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV8zMWRfdG9fNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDYxIGFuZCBkYXkgOTAgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV82MWRfdG9fOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIHRyYW5zYWN0aW9ucyBmb3IgdGhlIGdpdmVuIGFjY291bnQgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19sYXN0X3VwZGF0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBpcyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIGlzIGVpdGhlciBmcm96ZW4gb3IgcmVzdHJpY3RlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9mcm96ZW5fb3JfcmVzdHJpY3RlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXMgKG1heCAxMDApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXMgKG1heCAxMDApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBTU0wvVExTIGNvbm5lY3Rpb24gc2Vzc2lvbnMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBTU0wvVExTIGNvbm5lY3Rpb24gc2Vzc2lvbnMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBTU0wvVExTIGNvbm5lY3Rpb24gc2Vzc2lvbnMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9zc2xfdGxzX2Nvbm5lY3Rpb25fc2Vzc2lvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9hY2NvdW50X29wZW5pbmc/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRha2luZyBgYXZhaWxhYmxlX29yX2N1cnJlbnRfYmFsYW5jZWAgYW5kIGRpdmlkaW5nIGl0IGJ5IHRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIFVzZWZ1bCB0byBzYXkgXFxcIjEwJSBidWZmZXJcXFwiLCBmb3IgZXhhbXBsZS4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGJ1aWxkIFNpZ25hbCBSdWxlcyB1cG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBiYWxhbmNlX3RvX3RyYW5zYWN0aW9uX2Ftb3VudF9yYXRpbz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtaW5wdXQvI2ludmFsaWRfYWNjb3VudF9pZCkgZXJyb3IgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCBhdCB0aGUgYmFuayBvciBpZiB0aGUgYGFjY291bnRfaWRgIGlzIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIGV2YWx1YXRpb24gYXR0ZW1wdCAtIGZvciBleGFtcGxlLCBhIHBheW1lbnQgYXR0ZW1wdCBJRC4gWW91IHdpbGwgdXNlIHRoaXMgbGF0ZXIgdG8gZGVidWcgdGhpcyBldmFsdWF0aW9uLCBhbmQvb3IgcmVwb3J0IGFuIEFDSCByZXR1cm4sIGV0Yy4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy4gVGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIGFsc28gZnVuY3Rpb25zIGFzIGFuIGlkZW1wb3RlbmN5IGtleTsgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgd2l0aCBhIHByZXZpb3VzbHkgdXNlZCBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCB3aWxsIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgZXZhbHVhdGlvbiByYXRoZXIgdGhhbiB0cmlnZ2VyaW5nIGEgZnJlc2ggZXZhbHVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBlbmQgdXNlciBpcyBwcmVzZW50IHdoaWxlIGluaXRpYXRpbmcgdGhlIEFDSCB0cmFuc2ZlciBhbmQgdGhlIGVuZHBvaW50IGlzIGJlaW5nIGNhbGxlZDsgYGZhbHNlYCBvdGhlcndpc2UgKGZvciBleGFtcGxlLCB3aGVuIHRoZSBBQ0ggdHJhbnNmZXIgaXMgc2NoZWR1bGVkIGFuZCB0aGUgZW5kIHVzZXIgaXMgbm90IHByZXNlbnQsIG9yIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgdGhlIEFDSCB0cmFuc2ZlciBidXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIE5hY2hhIGZpbGUgZm9yIEFDSCBwcm9jZXNzaW5nKS4gV2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIFRoaXMgZmllbGQgaXMgbm90IGN1cnJlbnRseSB1c2VkIGFzIHBhcnQgb2YgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGV2YWx1YXRpb25zLCBidXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSBgdHJ1ZWAgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHBhcnQgb2YgcmVjdXJyaW5nIHNjaGVkdWxlIChmb3IgZXhhbXBsZSwgYSBtb250aGx5IHJlcGF5bWVudCk7IGBmYWxzZWAgb3RoZXJ3aXNlLiBXaGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gV2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIGBTQU1FX0RBWV9BQ0hgOiBTYW1lIERheSBBQ0ggYnkgTmFjaGEuIFRoZSBkZWJpdCB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgb24gdGhlIHNhbWUgZGF5LiBgU1RBTkRBUkRfQUNIYDogU3RhbmRhcmQgQUNIIGJ5IE5hY2hhLiBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogSWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMuIFBvc3NpYmxlIHZhbHVlczogIGBTQU1FX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnlpbmcgYHJpc2tfcHJvZmlsZV9rZXlgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwcm92aWRlIGBydWxlc2V0YCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlX2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgcnVsZXNldCB0byB1c2UgZm9yIGV2YWx1YXRpbmcgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjcmVhdGUgYSBydWxlc2V0IHVzaW5nIHRoZSBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIFtTaWduYWwtPlJ1bGVzXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc2lnbmFsL3Jpc2stcHJvZmlsZXMpLiBJZiBub3QgcHJvdmlkZWQsIGZvciBhbGwgbmV3IGN1c3RvbWVycyBhcyBvZiBPY3RvYmVyIDE1LCAyMDI1LCB0aGUgYGRlZmF1bHRgIHJ1bGVzZXQgd2lsbCBiZSB1c2VkLiBGb3IgZXhpc3RpbmcgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBjdXN0b21lcnMgYXMgb2YgT2N0b2JlciAxNSwgMjAyNSwgYnkgZGVmYXVsdCwgbm8gcnVsZXNldCB3aWxsIGJlIHVzZWQgaWYgdGhlIGBydWxlc2V0X2tleWAgaXMgbm90IHByb3ZpZGVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gb3B0IG91dCBvZiB1c2luZyBydWxlc2V0cywgc2VlIFtTaWduYWwgUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsRXZhbHVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvcmVfYXR0cmlidXRlcz86IFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tQcm9maWxlfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICByaXNrX3Byb2ZpbGU/OiBSaXNrUHJvZmlsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1J1bGVzZXR9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlc2V0PzogUnVsZXNldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIHJlc3VsdHMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBhZnRlciB0aGUgcmlzayBhc3Nlc3NtZW50LiBJdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgcGF5bWVudCBtZXRob2QuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5hY2hhLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheS4gIGBTVEFOREFSRF9BQ0hgOiBTdGFuZGFyZCBBQ0ggYnkgTmFjaGEuICBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsUGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIE5leHREYXlBY2ggPSAnTkVYVF9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIE11bHRpcGxlUGF5bWVudE1ldGhvZHMgPSAnTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcnNvbk5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHByZWZpeCAoZS5nLiBcXFwiTXIuXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgcHJlZml4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZ2l2ZW4gbmFtZS4gSWYgdGhlIHVzZXIgaGFzIGEgb25lLXdvcmQgbmFtZSwgaXQgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZhbWlseSBuYW1lIC8gc3VybmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgc3VmZml4IChlLmcuIFxcXCJJSVxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4geW91IHJlY2VpdmUgdGhlIHJldHVybnMgZnJvbSB5b3VyIHBheW1lbnQgcHJvY2Vzc29ycywgaW4gSVNPIDg2MDEgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHNwZWNpZmllZCBpbiB0aGUgYGRlZmF1bHRfcGF5bWVudF9tZXRob2RgIGZpZWxkIGRpcmVjdGx5IGltcGFjdHMgdGhlIHRpbWluZyByZWNvbW1lbmRhdGlvbnMgcHJvdmlkZWQgYnkgdGhlIEFQSSBmb3Igc3VibWl0dGluZyB0aGUgZGViaXQgZW50cnkgdG8geW91ciBwcm9jZXNzb3Igb3IgT0RGSS4gSWYgdW5zcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGBTVEFOREFSRF9BQ0hgLiAgYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCAoYXMgZGVmaW5lZCBieSBOYWNoYSkuIFRoZSBBUEkgYXNzdW1lcyB0aGUgc2V0dGxlbWVudCB3aWxsIG9jY3VyIG9uIHRoZSBzYW1lIGJ1c2luZXNzIGRheSBpZiB0aGUgYC9zaWduYWwvc2NoZWR1bGVgIHJlcXVlc3QgaXMgc3VibWl0dGVkIGJ5IDY6MDAgUE0gVVRDLiBOb3RlOiBUaGUgYWN0dWFsIGN1dG9mZiB0aW1lIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIG9yIE9ERkkuIE5hY2hhIGhhcyBlc3RhYmxpc2hlZCB0aHJlZSBwcm9jZXNzaW5nIHdpbmRvd3MgZm9yIFNhbWUgRGF5IEFDSCAoRWFzdGVybiBUaW1lKTogMTA6MzAgQU0sIDI6NDUgUE0sIGFuZCA0OjQ1IFBNLiAgYFNUQU5EQVJEX0FDSGA6IFN0YW5kYXJkIEFDSCAoYXMgZGVmaW5lZCBieSBOYWNoYSksIHR5cGljYWxseSBzZXR0bGVkIG9uZSB0byB0aHJlZSBidXNpbmVzcyBkYXlzIGFmdGVyIHN1Ym1pc3Npb24uICBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogSW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhlIHRyYW5zYWN0aW9uIGNvdWxkIHVzZSBhbnkgb2YgdGhlbSBiYXNlZCBvbiBjdXN0b21lciBwb2xpY3kgb3IgYXZhaWxhYmlsaXR5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsU2NoZWR1bGVEZWZhdWx0UGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIFN0YW5kYXJkQWNoID0gJ1NUQU5EQVJEX0FDSCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogQ29udmV5cyBpbmZvcm1hdGlvbiBvbiBpZiBhIHJldHJ5IGlzIHJlY29tbWVuZGVkIG9uIGEgZ2l2ZW4gZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIGRhdGUgZm9yIHN1Ym1pdHRpbmcgdGhlIGRlYml0IGVudHJ5LCBmb3JtYXR0ZWQgaW4gSVNPIDg2MDEgKGUuZy4sIFxcXCIyMDI1LTAxLTE3XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvblxuICAgICAqL1xuICAgIGRhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY29tbWVuZGF0aW9uU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmVjb21tZW5kYXRpb24/OiBSZWNvbW1lbmRhdGlvblN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuayBvZiB0aGUgcmVjb21tZW5kYXRpb24gYmFzZWQgb24gdGhlIGxpa2VsaWhvb2Qgb2YgZGViaXQgc3VjY2Vzcywgd2l0aCAxIHJlcHJlc2VudGluZyB0aGUgbW9zdCBvcHRpbWFsIGRhdGUuIERhdGVzIHdpdGggYE5PVF9SRUNPTU1FTkRFRGAgb3IgYFVOS05PV05gIHdpbGwgaGF2ZSByYW5rIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmFuaz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvc2NoZWR1bGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2ludmFsaWQtaW5wdXQvI2ludmFsaWRfYWNjb3VudF9pZCkgZXJyb3IgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCBhdCB0aGUgYmFuayBvciBpZiB0aGUgYGFjY291bnRfaWRgIGlzIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIElEL2lkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFRoZSBtYXggbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIDM2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxTY2hlZHVsZURlZmF1bHRQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogU2lnbmFsU2NoZWR1bGVEZWZhdWx0UGF5bWVudE1ldGhvZDtcbn1cbi8qKlxuICogU2lnbmFsU2NoZWR1bGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL3NjaGVkdWxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsU2NoZWR1bGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY29tbWVuZGVkIG9wdGltYWwgZGF0ZSB0byBzdWJtaXQgdGhlIGRlYml0IGVudHJ5LCBmb3JtYXR0ZWQgaW4gSVNPIDg2MDEgXFxcIllZWVktTU0tRERcXFwiIChlLmcuLCBcXFwiMjAyNC0wMy0zMFxcXCIpLiBUaGUgYG9wdGltYWxfZGF0ZWAgaXMgZGVyaXZlZCBmcm9tIHRoZSBkYXRlIHdpdGggcmFuayA9IDEgaW4gdGhlIGZvbGxvd2luZyByZWNvbW1lbmRhdGlvbnMgYXJyYXkuICBOT1RFOiBUaGUgYGRlZmF1bHRfcGF5bWVudF9tZXRob2RgIGZpZWxkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3aWxsIGFmZmVjdCB0aGUgcmVjb21tZW5kYXRpb24sIHNpbmNlIHdlXFwncmUgYWNjb3VudGluZyBmb3IgZGViaXQgc2V0dGxlbWVudCB0aW1lLiAgVGhlIGRlYml0IHNjaGVkdWxpbmcgZXZhbHVhdGlvbiBzdGFydHMgZnJvbSB0aGUgZGF5IHRoZSAvc2lnbmFsL3NjaGVkdWxlIHJlcXVlc3QgaXMgc3VibWl0dGVkIChEYXkgMCkgb3IgdGhlIG5leHQgYmFua2luZyBkYXkgaWYgdGhlIHN1Ym1pc3Npb24gZGF5IGlzIG5vdCBhIGJhbmtpbmcgZGF5LCBhbmQgZXh0ZW5kcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgZml2ZSBiYW5raW5nIGRheXMgKERheSAxIHRvIERheSA1KS4gSWYgbm8gZGF0ZSB3aXRoaW4gdGhpcyBwZXJpb2QgaXMgY29uc2lkZXJlZCBsaWtlbHkgdG8gcmVzdWx0IGluIGEgc3VjY2Vzc2Z1bCBkZWJpdCBhdHRlbXB0LCBgbnVsbGAgd2lsbCBiZSByZXR1cm5lZCBmb3IgdGhlIGBvcHRpbWFsX2RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcHRpbWFsX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBhcnJheSBwcm92aWRlcyBhIGRhdGUtYnktZGF0ZSBldmFsdWF0aW9uIG9mIGRlYml0IHN1Ym1pc3Npb24gcmVjb21tZW5kYXRpb25zIHdpdGhpbiB0aGUgZml2ZSBiYW5raW5nIGRheSBldmFsdWF0aW9uIHBlcmlvZC4gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5IHJlcHJlc2VudHMgYSByZXRyeSByZWNvbW1lbmRhdGlvbiBmb3IgYSBzcGVjaWZpYyBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY29tbWVuZGF0aW9uczogQXJyYXk8U2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvbj47XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSaXNrIHNjb3JpbmcgZGV0YWlscyBicm9rZW4gZG93biBieSByaXNrIGNhdGVnb3J5LiBXaGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgb2JqZWN0IHdpbGwgbm90IGJlIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY29yZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTY29yZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlzaz86IEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQmFua0luaXRpYXRlZFJldHVyblJpc2s7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIChpLmUuLCB0aGUgYWNjb3VudCBob2xkZXIpLiBUaGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBidXQgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5jcmVhc2UgdGhlIGFjY3VyYWN5IG9mIHJlc3VsdHMgd2hlbiB1c2luZyBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzLiBXaGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIGlmIHRoZSBTaWduYWwgQWRkZW5kdW0gaGFzIGJlZW4gc2lnbmVkLCB0aGVzZSBmaWVsZHMgYXJlIGlnbm9yZWQ7IGlmIHRoZSBBZGRlbmR1bSBoYXMgbm90IGJlZW4gc2lnbmVkLCB1c2luZyB0aGVzZSBmaWVsZHMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxVc2VyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGVyc29uTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBTaWduYWxQZXJzb25OYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBDb252ZXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBtaXNzaW5nIG9yIHN0YWxlIGJhbmsgZGF0YSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIHNjb3JlcyBhbmQgcmVzcG9uc2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIHdhcm5pbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcgdGhhdCBwZXJ0YWlucyB0byB0aGUgZXJyb3IgY2F1c2luZyBiYW5rIGRhdGEgdG8gYmUgbWlzc2luZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gRm9yIG1vcmUgZGV0YWlscyBvbiB3YXJuaW5nIGNvZGVzLCBwbGVhc2UgcmVmZXIgdG8gUGxhaWQgc3RhbmRhcmQgZXJyb3IgY29kZXMgZG9jdW1lbnRhdGlvbi4gSWYgeW91IHJlY2VpdmUgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3YXJuaW5nLCB3ZSByZWNvbW1lbmQgcmUtYXV0aGVudGljYXRpbmcgeW91ciB1c2VyIGJ5IGltcGxlbWVudGluZyBMaW5rXFwncyB1cGRhdGUgbW9kZS4gVGhpcyB3aWxsIGd1aWRlIHlvdXIgdXNlciB0byBmaXggdGhlaXIgY3JlZGVudGlhbHMsIGFsbG93aW5nIFBsYWlkIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEgYWdhaW4gZm9yIGZ1dHVyZSByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3YXJuaW5nIHR5cGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX21lc3NhZ2U/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3dlZXAgcmV0dXJuZWQgZnJvbSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludC4gQ2FuIGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIHRyYW5zZmVycyB0byBpbmNsdWRlIGluIGEgc3dlZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBkZWNpbWFsIGFtb3VudCBvZiB0aGUgc3dlZXAgYXMgaXQgYXBwZWFycyBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyIChlLmcuIFxcXCItMTAuMDBcXFwiKSAgSWYgYW1vdW50IGlzIG5vdCBwcmVzZW50LCB0aGUgc3dlZXAgd2FzIG5ldC1zZXR0bGVkIHRvIHplcm8gYW5kIG91dHN0YW5kaW5nIGRlYml0cyBhbmQgY3JlZGl0cyBiZXR3ZWVuIHRoZSBzd2VlcCBhY2NvdW50IGFuZCBQbGFpZCBhcmUgYmFsYW5jZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgc3dlZXAgc2V0dGxlZCwgaW4gdGhlIFlZWVktTU0tREQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzZXR0bGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCBkYXRlIHdoZW4gZnVuZHMgZnJvbSBhIGxlZGdlciBkZXBvc2l0IHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgYW5kIGNhbiBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYXNzb2NpYXRlZCBsZWRnZXIgYmFsYW5jZS4gT25seSBhcHBsaWVzIHRvIGRlcG9zaXRzLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZXhwZWN0ZWRfZnVuZHNfYXZhaWxhYmxlX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgdHJpZ2dlcj86IFN3ZWVwVHJpZ2dlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBGb3IgYHJ0cGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBUcmFuc2FjdGlvbiBJZGVudGlmaWNhdGlvbiBudW1iZXIuIEZvciBgd2lyZWAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBJTUFEIChJbnB1dCBNZXNzYWdlIEFjY291bnRhYmlsaXR5IERhdGEpIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogU3dlZXBGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgYWxsIHJpc2sgc2lnbmFscyBhbmQgcmVsZXZhbnQgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgU2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZG9jdW1lbnRfcmVmZXJlbmNlOiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYXR0cmlidXRlcyB0aGF0IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGZyYXVkIHJpc2sgd2l0aCBhIGRvY3VtZW50XG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRSaXNrU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcmlza19zdW1tYXJ5OiBEb2N1bWVudFJpc2tTdW1tYXJ5O1xufVxuLyoqXG4gKiBBIHR5cGUgaW5kaWNhdGluZyB3aG8gb3Igd2hhdCBsYXN0IHRvdWNoZWQgdGhpcyBvYmplY3QuIGBkYXNoYm9hcmRgLCBgbGlua2AsIGFuZCBgYXBpYCBpbmRpY2F0ZSB0aGUgb3JpZ2luYXRpbmcgc3VyZmFjZTsgYHN5c3RlbWAgaW5kaWNhdGVzIFBsYWlkLiBgcmV0cm9gIGluZGljYXRlcyBhIHNjcmVlbmluZyBjcmVhdGVkIHJldHJvYWN0aXZlbHkgdmlhIGEgYnVsayBzY3JlZW5pbmcgY3JlYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTb3VyY2Uge1xuICAgIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICAgIExpbmsgPSAnbGluaycsXG4gICAgQXBpID0gJ2FwaScsXG4gICAgU3lzdGVtID0gJ3N5c3RlbScsXG4gICAgUmV0cm8gPSAncmV0cm8nXG59XG5cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLiBGb3IgYSBtYXBwaW5nIG9mIHN1cHBvcnRlZCB0eXBlcyBhbmQgc3VidHlwZXMgdG8gUGxhaWQgcHJvZHVjdHMsIHNlZSB0aGUgW0FjY291bnQgdHlwZSAvIHByb2R1Y3Qgc3VwcG9ydCBtYXRyaXhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtLXByb2R1Y3Qtc3VwcG9ydC1tYXRyaXgpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGUge1xuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY3JlZGl0IGNhcmQgdHlwZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGNyZWRpdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbG9hbiB0eXBlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgbG9hbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGludmVzdG1lbnQgYWNjb3VudC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgdHlwZSBpcyBjYWxsZWQgYGJyb2tlcmFnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgaW52ZXN0bWVudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5cm9sbCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIHBheXJvbGw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3RoZXIgb3IgdW5rbm93biBhY2NvdW50IHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgb3RoZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZvbGxvd2luZyBjdXJyZW5jeSBjb2RlcyBhcmUgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZCBzdXBwb3J0cyBhbGwgSVNPIDQyMTcgY3VycmVuY3kgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2Rlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIHZhbHVlcyBmb3IgaW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMuIE5vdGUgdGhhdCB0cmFuc2FjdGlvbnMgcmVwcmVzZW50aW5nIGluZmxvdyBvZiBjYXNoIHdpbGwgYXBwZWFyIGFzIG5lZ2F0aXZlIGFtb3VudHMsIG91dGZsb3cgb2YgY2FzaCB3aWxsIGFwcGVhciBhcyBwb3NpdGl2ZSBhbW91bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlIHtcbiAgICAvKipcbiAgICAgKiBCdXlpbmcgYW4gaW52ZXN0bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgYnV5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2VsbGluZyBhbiBpbnZlc3RtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBzZWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjYW5jZWxsYXRpb24gb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBjYW5jZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgY2FzaDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZlZXMgb24gdGhlIGFjY291bnQsIGUuZy4gY29tbWlzc2lvbiwgYm9va2tlZXBpbmcsIG9wdGlvbnMtcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGZlZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICB0cmFuc2Zlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0FjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X21hc2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfb2ZmaWNpYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdWJ0eXBlIG9mIHRoZSBhY2NvdW50LiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50LiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBzdGF0ZW1lbnRzXFwnIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFN0YXRlbWVudHNTdGF0ZW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIHN0YXRlbWVudHM6IEFycmF5PFN0YXRlbWVudHNTdGF0ZW1lbnQ+O1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvZG93bmxvYWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlbWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U3RhdGVtZW50c0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PFN0YXRlbWVudHNBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIHN0YXRlbWVudCByZWZyZXNoIGV4dHJhY3Rpb24gIGBTVUNDRVNTYDogVGhlIHN0YXRlbWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIGFuZCBjYW4gYmUgbGlzdGVkIHZpYSBgL3N0YXRlbWVudHMvbGlzdGAgYW5kIGRvd25sb2FkZWQgdmlhIGAvc3RhdGVtZW50cy9kb3dubG9hZGAuICBgRkFJTFVSRWA6IFRoZSBzdGF0ZW1lbnRzIGZhaWxlZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHJlZnJlc2hlZCBzdGF0ZW1lbnRzIGV4dHJhY3Rpb24gaXMgY29tcGxldGVkIG9yIGZhaWxlZCB0byBiZSBjb21wbGV0ZWQuIFRyaWdnZXJlZCBieSBjYWxsaW5nIGAvc3RhdGVtZW50cy9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVEVNRU5UU19SRUZSRVNIX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIGZvciBzdGF0ZW1lbnRzLCBpbiBcXFwiWVlZWS1NTS1ERFxcXCIgZm9ybWF0LCBlLmcuIFxcXCIyMDIzLTA4LTMwXFxcIi4gVG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzdGF0ZW1lbnQgZmFsbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGF0ZSByYW5nZSwgUGxhaWQgd2lsbCB1c2UgdGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZS4gVGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZSBpcyB0eXBpY2FsbHkgZWl0aGVyIHRoZSBsYXN0IGRheSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCwgb3IgdGhlIGZvbGxvd2luZyBkYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMy0xMC0zMFxcXCIuIFlvdSBjYW4gcmVxdWVzdCB1cCB0byB0d28geWVhcnMgb2YgZGF0YS4gVG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzdGF0ZW1lbnQgZmFsbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGF0ZSByYW5nZSwgUGxhaWQgd2lsbCB1c2UgdGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZS4gVGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZSBpcyB0eXBpY2FsbHkgZWl0aGVyIHRoZSBsYXN0IGRheSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCwgb3IgdGhlIGZvbGxvd2luZyBkYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3RhdGVtZW50XFwncyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIHdoZW4gdGhlIHN0YXRlbWVudCB3YXMgcG9zdGVkIGJ5IHRoZSBGSSwgaWYga25vd25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgZGF0ZV9wb3N0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1vbnRoIG9mIHRoZSB5ZWFyLiBQb3NzaWJsZSB2YWx1ZXM6IDEgdGhyb3VnaCAxMiAoSmFudWFyeSB0aHJvdWdoIERlY2VtYmVyKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgbW9udGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciBvZiB0aGUgc3RhdGVtZW50LCBlLmcuIDIwMjQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1N0YXRlbWVudFxuICAgICAqL1xuICAgIHllYXI6IG51bWJlcjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBDb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIFN0YXR1c0NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdHVzIERlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIFN0YXR1c0Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgU1RBVFVTIGNvbnRhaW5lcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXR1c2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c2VzXG4gICAgICovXG4gICAgU1RBVFVTOiBTdGF0dXM7XG59XG4vKipcbiAqIEFuIGluc3RydWN0aW9uIHNwZWNpZnlpbmcgd2hhdCBzdGVwcyB0aGUgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHNob3VsZCByZXF1aXJlIHRoZSB1c2VyIHRvIGNvbXBsZXRlOiAgIGByZXNldGAgLSBSZXN0YXJ0IHRoZSB1c2VyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlc3Npb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgcGFydCBvZiB0aGVpciBwcmV2aW91cyBzZXNzaW9uLiAgYGluY29tcGxldGVgIC0gU3RhcnQgdGhlIG5ldyBzZXNzaW9uIGF0IHRoZSBzdGVwIHRoYXQgdGhlIHVzZXIgZmFpbGVkIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uLCBza2lwcGluZyBzdGVwcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuICBgaW5mZXJgIC0gSWYgdGhlIG1vc3QgcmVjZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYCBoYXMgYSBzdGF0dXMgb2YgYGZhaWxlZGAgb3IgYGV4cGlyZWRgLCByZXRyeSB1c2luZyB0aGUgYGluY29tcGxldGVgIHN0cmF0ZWd5LiBPdGhlcndpc2UsIHVzZSB0aGUgYHJlc2V0YCBzdHJhdGVneS4gIGBjdXN0b21gIC0gU3RhcnQgdGhlIG5ldyBzZXNzaW9uIHdpdGggYSBjdXN0b20gY29uZmlndXJhdGlvbiwgc3BlY2lmaWVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgYHN0ZXBzYCBmaWVsZCAgTm90ZTogIFRoZSBgaW5jb21wbGV0ZWAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIGZhaWxpbmcgc3RlcCBpcyBgd2F0Y2hsaXN0X3NjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLiBFYWNoIGFjY291bnQgY2FuIG9ubHkgY29udGFpbiBvbmUgbGlhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvd2VkIGFzIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpc3N1ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGxvYW4sIGUuZy4sIFxcXCJDb25zb2xpZGF0aW9uIExvYW5zXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zOiBTb21lIGluc3RpdHV0aW9ucyByZXF1aXJlIGEgbWluaW11bSBwYXltZW50IGFjcm9zcyBhbGwgbG9hbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgbnVtYmVyLiBPdXIgQVBJIHByZXNlbnRzIHRoYXQgc2FtZSBtaW5pbXVtIHBheW1lbnQgYW1vdW50IG9uIGVhY2ggbG9hbi4gVGhlIGluc3RpdHV0aW9ucyB0aGF0IGRvIHRoaXMgYXJlOiBHcmVhdCBMYWtlcyAoIGBpbnNfMTE2ODYxYCksIEZpcnN0bWFyayAoYGluc18xMTYyOTVgKSwgQ29tbW9uYm9uZCBGaXJzdG1hcmsgU2VydmljZXMgKGBpbnNfMTE2OTUwYCksIEdyYW5pdGUgU3RhdGUgKGBpbnNfMTE2MzA4YCksIGFuZCBPa2xhaG9tYSBTdHVkZW50IExvYW4gQXV0aG9yaXR5IChgaW5zXzExNjk0NWApLiBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCApIGFuZCBOYXZpZW50IChgaW5zXzExNjI0OGApIHdpbGwgZGlzcGxheSBhcyAkMCBpZiB0aGVyZSBpcyBhbiBhdXRvcGF5IHByb2dyYW0gaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gQSBwYXltZW50IGlzIG5vdCBleHBlY3RlZCBpZiBgbG9hbl9zdGF0dXMudHlwZWAgaXMgYGRlZmVybWVudGAsIGBpbiBzY2hvb2xgLCBgY29uc29saWRhdGVkYCwgYHBhaWQgaW4gZnVsbGAsIG9yIGB0cmFuc2ZlcnJlZGAuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkb2xsYXIgYW1vdW50IG9mIHRoZSBhY2NydWVkIGludGVyZXN0IGJhbGFuY2UuIEZvciBTYWxsaWUgTWFlICggYGluc18xMTY5NDRgKSwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgbG9hbiwgc28gdGhpcyBmaWVsZCB3aWxsIHJldHVybiBhcyBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvdXRzdGFuZGluZ19pbnRlcmVzdF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IGFjY291bnQgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbG9hbiBmb3IgcGF5bWVudHMuIEluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgd2lsbCBtYXRjaCBgYWNjb3VudF9udW1iZXJgLCBidXQgaW4gc29tZSBpbnN0aXR1dGlvbnMsIHN1Y2ggYXMgR3JlYXQgTGFrZXMgKGBpbnNfMTE2ODYxYCksIGl0IHdpbGwgYmUgZGlmZmVyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnLFxuICAgIFBlbmRpbmdJZHIgPSAncGVuZGluZyBpZHInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEluY29tZVNlbnNpdGl2ZVJlcGF5bWVudCA9ICdpbmNvbWUtc2Vuc2l0aXZlIHJlcGF5bWVudCcsXG4gICAgSW50ZXJlc3RPbmx5ID0gJ2ludGVyZXN0IG9ubHknLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYXlBc1lvdUVhcm4gPSAncGF5IGFzIHlvdSBlYXJuJyxcbiAgICBSZXZpc2VkUGF5QXNZb3VFYXJuID0gJ3JldmlzZWQgcGF5IGFzIHlvdSBlYXJuJyxcbiAgICBTdGFuZGFyZCA9ICdzdGFuZGFyZCcsXG4gICAgU2F2aW5nT25BVmFsdWFibGVFZHVjYXRpb24gPSAnc2F2aW5nIG9uIGEgdmFsdWFibGUgZWR1Y2F0aW9uJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBzdGF0dXMgZm9yIGEgc3dlZXAgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTd2VlcEZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBzd2VlcCBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAvUmZQIGVycm9yIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jcnRwcmZwLWVycm9yLWNvZGVzKSBmb3IgUlRQIGVycm9yIGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN3ZWVwRmFpbHVyZVxuICAgICAqL1xuICAgIGZhaWx1cmVfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTd2VlcEZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzd2VlcCB0cmFuc2ZlciAgYFxcXCJwZW5kaW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3VycmVudGx5IHBlbmRpbmcgYFxcXCJwb3N0ZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiBwb3N0ZWQgYFxcXCJzZXR0bGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIHNldHRsZWQuIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgc3VjY2Vzc2Z1bCBjcmVkaXQgc3dlZXAuIGBcXFwicmV0dXJuZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiByZXR1cm5lZC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSByZXR1cm5lZCBzd2VlcC4gUmV0dXJucyBvZiBhIHN3ZWVwIGFyZSBleHRyZW1lbHkgcmFyZSwgc2luY2Ugc3dlZXBzIGFyZSBtb25leSBtb3ZlbWVudCBiZXR3ZWVuIHlvdXIgb3duIGJhbmsgYWNjb3VudCBhbmQgeW91ciBvd24gTGVkZ2VyLiBgXFxcImZ1bmRzX2F2YWlsYWJsZVxcXCJgIC0gRnVuZHMgZnJvbSB0aGUgc3dlZXAgaGF2ZSBiZWVuIHJlbGVhc2VkIGZyb20gaG9sZCBhbmQgYXBwbGllZCB0byB0aGUgbGVkZ2VyXFwncyBhdmFpbGFibGUgYmFsYW5jZS4gKE9ubHkgYXBwbGljYWJsZSB0byBkZXBvc2l0cy4pIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgc3VjY2Vzc2Z1bCBkZXBvc2l0IHN3ZWVwLiBgXFxcImZhaWxlZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBmYWlsZWQuIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgZmFpbGVkIHN3ZWVwLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBGdW5kc0F2YWlsYWJsZSA9ICdmdW5kc19hdmFpbGFibGUnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHRyaWdnZXIgb2YgdGhlIHN3ZWVwICBgXFxcIm1hbnVhbFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIGN1c3RvbWVyIGBcXFwiaW5jb21pbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGluY29taW5nIGZ1bmRzIGZsb3cgKGUuZy4gSW5jb21pbmcgV2lyZSkgYFxcXCJiYWxhbmNlX3RocmVzaG9sZFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgYnkgYmFsYW5jZSB0aHJlc2hvbGQgc2V0dGluZyBgXFxcImF1dG9tYXRpY19hZ2dyZWdhdGVcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IHRoZSBQbGFpZCBhdXRvbWF0aWMgYWdncmVnYXRpb24gcHJvY2Vzcy4gVGhlc2UgZnVuZHMgZGlkIG5vdCBwYXNzIHRocm91Z2ggdGhlIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBUcmlnZ2VyIHtcbiAgICBNYW51YWwgPSAnbWFudWFsJyxcbiAgICBJbmNvbWluZyA9ICdpbmNvbWluZycsXG4gICAgQmFsYW5jZVRocmVzaG9sZCA9ICdiYWxhbmNlX3RocmVzaG9sZCcsXG4gICAgQXV0b21hdGljQWdncmVnYXRlID0gJ2F1dG9tYXRpY19hZ2dyZWdhdGUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgdGhlIG9sZGVyIHdlYmhvb2tzIGBJTklUSUFMX1VQREFURWAsIGBISVNUT1JJQ0FMX1VQREFURWAsIGBERUZBVUxUX1VQREFURWAsIGFuZCBgVFJBTlNBQ1RJT05TX1JFTU9WRURgLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgbmV3IGNoYW5nZXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIGFuIEl0ZW0sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50IGFzIGl0IHdvdWxkIGluIFByb2R1Y3Rpb24uIEl0IGNhbiBhbHNvIGJlIG1hbnVhbGx5IHRyaWdnZXJlZCBpbiBTYW5kYm94IGJ5IGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gKG1vc3QgcmVjZW50IDMwIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIChtYXhpbXVtIHRyYW5zYWN0aW9uIGhpc3RvcnkgcmVxdWVzdGVkLCB1cCB0byAyIHllYXJzKSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiBhIHN5bnRoZXRpYyBmcmF1ZCByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTeW50aGV0aWNGcmF1ZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXRpY0ZyYXVkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBTeW50aGV0aWNGcmF1ZFxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw6IFJpc2tMZXZlbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCBhbiBvZmZpY2lhbCBkb2N1bWVudCB1c2VkIHRvIHJlcG9ydCB0aGUgdXNlclxcJ3MgaW5jb21lIHRvIHRoZSBJUlMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheGZvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhmb3JtIHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgZG9jX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRheCBkb2N1bWVudC4gQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgYHcyYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgZG9jdW1lbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXMn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIHcyPzogVzI7XG59XG4vKipcbiAqIFRheHBheWVyIElEIG9mIHRoZSBpbmRpdmlkdWFsIHJlY2VpdmluZyB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySUQge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgSUQsIGUuZy4gXFwnU1NOXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG1hc2s7IGkuZS4gbGFzdCA0IGRpZ2l0cyBvZiB0aGUgdGF4cGF5ZXIgSURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGFzdCA0IGRpZ2l0cyBvZiB1bmlxdWUgbnVtYmVyIG9mIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxhc3RfNF9kaWdpdHM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgVGF4cGF5ZXIgaWRlbnRpZmljYXRpb24gdmFsdWVzIGFzc2lnbmVkIHRvIHRoZSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyXG4gICAgICovXG4gICAgVGF4cGF5ZXJJZGVudGlmaWVyVHlwZTogVGF4cGF5ZXJJZGVudGlmaWVyVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0YXhwYXllciBpZGVudGlmaWVyIGFzIGFzc2lnbmVkIGJ5IHRoZSBJUlMgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySWRlbnRpZmllclxuICAgICAqL1xuICAgIFRheHBheWVySWRlbnRpZmllclZhbHVlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBjbGFzc2lmaWVzIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgdXNlZCBieSB0aGUgSW50ZXJuYWwgUmV2ZW51ZSBTZXJ2aWNlIChJUlMpIGluIHRoZSBhZG1pbmlzdHJhdGlvbiBvZiB0YXggbGF3cy4gQSBTb2NpYWwgU2VjdXJpdHkgbnVtYmVyIChTU04pIGlzIGlzc3VlZCBieSB0aGUgU1NBOyBhbGwgb3RoZXIgdGF4cGF5ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVycyBhcmUgaXNzdWVkIGJ5IHRoZSBJUlMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUYXhwYXllcklkZW50aWZpZXJUeXBlIHtcbiAgICBJbmRpdmlkdWFsVGF4cGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlciA9ICdJbmRpdmlkdWFsVGF4cGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlcicsXG4gICAgU29jaWFsU2VjdXJpdHlOdW1iZXIgPSAnU29jaWFsU2VjdXJpdHlOdW1iZXInXG59XG5cbi8qKlxuICogVGhlIGNvbGxlY3Rpb24gb2YgYFRBWFBBWUVSX0lERU5USUZJQ0FUSU9OYCBlbGVtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyc1xuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVI6IFRheHBheWVySWRlbnRpZmllcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGEgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRU1QTE9ZRUUgTUVESUNBUkUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTT0NJQUwgU0VDVVJJVFkgRU1QTE9ZRUUgVEFYJyxcbiAgICBNZWRpY2FsID0gJ01FRElDQUwnLFxuICAgIFZpc2lvbiA9ICdWSVNJT04nLFxuICAgIERlbnRhbCA9ICdERU5UQUwnLFxuICAgIE5ldFBheSA9ICdORVQgUEFZJyxcbiAgICBUYXhlcyA9ICdUQVhFUycsXG4gICAgTm90Rm91bmQgPSAnTk9UX0ZPVU5EJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgdGltZSBwZXJpb2Qgb2YgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDMwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDMwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCA2MCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgOTAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgdG90YWwgbW9udGhseSBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxNb250aGx5SW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIGZvciB0aGUgMzAgZGF5cyBwcmlvciB0byBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsTW9udGhseUluY29tZUluc2lnaHRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBiYXNlbGluZV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhZ2dyZWdhdGVkIGluY29tZSBvZiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxNb250aGx5SW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBvdXQgb2YgdGhlIGFjY291bnQgaW4gdGhlIHRpbWUgcGVyaW9kIG9mIHRoZSByZXBvcnQuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDMwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQzMGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDYwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ2MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDkwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSByZXBvcnRcXCdzIGFjY291bnRzIGluIHRoZSB0aW1lIHBlcmlvZCBvZiB0aGUgcmVwb3J0LiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSByZXBvcnRcXCdzIGFjY291bnRzIGluIHRoZSBsYXN0IDMwIGRheXMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQzMGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDMwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIHJlcG9ydFxcJ3MgYWNjb3VudHMgaW4gdGhlIGxhc3QgNjAgZGF5cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDYwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50NjBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQ2MGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgcmVwb3J0XFwncyBhY2NvdW50cyBpbiB0aGUgbGFzdCA5MCBkYXlzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsUmVwb3J0SW5mbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydEluZmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSByZXBvcnRcXCdzIGFjY291bnRzIGluIHRoZSB0aW1lIHBlcmlvZCBvZiB0aGUgcmVwb3J0LiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBvdXQgb2YgdGhlIHJlcG9ydFxcJ3MgYWNjb3VudHMgaW4gdGhlIGxhc3QgMzAgZGF5cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQzMGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQzMGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSByZXBvcnRcXCdzIGFjY291bnRzIGluIHRoZSBsYXN0IDYwIGRheXMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50NjBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50NjBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ2MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ2MGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGUgcmVwb3J0XFwncyBhY2NvdW50cyBpbiB0aGUgbGFzdCA5MCBkYXlzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDkwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsUmVwb3J0T3V0Zmxvd0Ftb3VudDkwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFJlcG9ydE91dGZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxSZXBvcnRPdXRmbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gRm9yIGFsbCBwcm9kdWN0cyBleGNlcHQgSW5jb21lOiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuIEZvciBJbmNvbWUgZW5kcG9pbnRzLCB2YWx1ZXMgYXJlIHBvc2l0aXZlIHdoZW4gcmVwcmVzZW50aW5nIGluY29tZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBOb3RlOiBXaGlsZSBQbGFpZCBkb2VzIG5vdCBjdXJyZW50bHkgcGxhbiB0byByZW1vdmUgdGhpcyBmaWVsZCwgaXQgaXMgYSBsZWdhY3kgZmllbGQgdGhhdCBpcyBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZC4gVXNlIGBtZXJjaGFudF9uYW1lYCBpbnN0ZWFkIGZvciB0aGUgbWVyY2hhbnQgbmFtZS4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgaW5jbHVkZWQgaWYgdGhlIGNsaWVudCBoYXMgc2V0IGBvcHRpb25zLmluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb25gIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhOiBQYXltZW50TWV0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC4gTm90IGFsbCBpbnN0aXR1dGlvbnMgcHJvdmlkZSBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBwcm92aWRlIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy4gQSBzdWItYWNjb3VudCBtb3N0IGNvbW1vbmx5IGV4aXN0cyBpbiBjYXNlcyB3aGVyZSBhIHNpbmdsZSBhY2NvdW50IGlzIGxpbmtlZCB0byBtdWx0aXBsZSBjYXJkcywgZWFjaCB3aXRoIGl0cyBvd24gY2FyZCBudW1iZXIgYW5kIGNhcmQgaG9sZGVyIG5hbWU7IGVhY2ggY2FyZCB3aWxsIGJlIGNvbnNpZGVyZWQgYSBzdWItYWNjb3VudC4gSWYgdGhlIGFjY291bnQgZG9lcyBoYXZlIHN1Yi1hY2NvdW50cywgdGhpcyBmaWVsZCB3aWxsIHR5cGljYWxseSBiZSBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWItYWNjb3VudCBvd25lclxcJ3MgbmFtZSBhbmQvb3IgdGhlIHN1Yi1hY2NvdW50IG1hc2suIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWVsZCBpcyBub3Qgc3RhbmRhcmRpemVkIGFuZCB3aWxsIHZhcnkgYmFzZWQgb24gaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSBhIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgVGhpcyBmaWVsZCByZXBsYWNlcyB0aGUgYHRyYW5zYWN0aW9uX3R5cGVgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0J1c2luZXNzRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGJ1c2luZXNzX2ZpbmFuY2VfY2F0ZWdvcnk/OiBCdXNpbmVzc0ZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgYSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC4gSW4gdGhlIGNhc2Ugb2YgYSBtZXJjaGFudCB3aXRoIG11bHRpcGxlIHJldGFpbCBsb2NhdGlvbnMsIHRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGJyb2FkZXIgbWVyY2hhbnQsIG5vdCBhIHNwZWNpZmljIGxvY2F0aW9uIG9yIHN0b3JlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2xpZW50Q3VzdG9taXphdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfY3VzdG9taXphdGlvbj86IENsaWVudEN1c3RvbWl6YXRpb24gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bSB7XG4gICAgRGlnaXRhbCA9ICdkaWdpdGFsJyxcbiAgICBQbGFjZSA9ICdwbGFjZScsXG4gICAgU3BlY2lhbCA9ICdzcGVjaWFsJyxcbiAgICBVbnJlc29sdmVkID0gJ3VucmVzb2x2ZWQnXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uUGF5bWVudENoYW5uZWxFbnVtIHtcbiAgICBPbmxpbmUgPSAnb25saW5lJyxcbiAgICBJblN0b3JlID0gJ2luIHN0b3JlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRlYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRlYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGV0aW1lYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGV0aW1lYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGV0aW1lYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGRhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBUaGlzIGZpZWxkIHJlcGxhY2VzIHRoZSBgdHJhbnNhY3Rpb25fdHlwZWAgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFRyYW5zYWN0aW9uQWxsT2ZQYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QnVzaW5lc3NGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBidXNpbmVzc19maW5hbmNlX2NhdGVnb3J5PzogQnVzaW5lc3NGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgYSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuIEluIHRoZSBjYXNlIG9mIGEgbWVyY2hhbnQgd2l0aCBtdWx0aXBsZSByZXRhaWwgbG9jYXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBicm9hZGVyIG1lcmNoYW50LCBub3QgYSBzcGVjaWZpYyBsb2NhdGlvbiBvciBzdG9yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgbWVyY2hhbnRfZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2xpZW50Q3VzdG9taXphdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGNsaWVudF9jdXN0b21pemF0aW9uPzogQ2xpZW50Q3VzdG9taXphdGlvbiB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIEZvciBhbGwgcHJvZHVjdHMgZXhjZXB0IEluY29tZTogUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLiBGb3IgSW5jb21lIGVuZHBvaW50cywgdmFsdWVzIGFyZSBwb3NpdGl2ZSB3aGVuIHJlcHJlc2VudGluZyBpbmNvbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLiBUbyByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIHRoYXQgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRlYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgTm90ZTogV2hpbGUgUGxhaWQgZG9lcyBub3QgY3VycmVudGx5IHBsYW4gdG8gcmVtb3ZlIHRoaXMgZmllbGQsIGl0IGlzIGEgbGVnYWN5IGZpZWxkIHRoYXQgaXMgbm90IGFjdGl2ZWx5IG1haW50YWluZWQuIFVzZSBgbWVyY2hhbnRfbmFtZWAgaW5zdGVhZCBmb3IgdGhlIG1lcmNoYW50IG5hbWUuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGluY2x1ZGVkIGlmIHRoZSBjbGllbnQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuIEEgc3ViLWFjY291bnQgbW9zdCBjb21tb25seSBleGlzdHMgaW4gY2FzZXMgd2hlcmUgYSBzaW5nbGUgYWNjb3VudCBpcyBsaW5rZWQgdG8gbXVsdGlwbGUgY2FyZHMsIGVhY2ggd2l0aCBpdHMgb3duIGNhcmQgbnVtYmVyIGFuZCBjYXJkIGhvbGRlciBuYW1lOyBlYWNoIGNhcmQgd2lsbCBiZSBjb25zaWRlcmVkIGEgc3ViLWFjY291bnQuIElmIHRoZSBhY2NvdW50IGRvZXMgaGF2ZSBzdWItYWNjb3VudHMsIHRoaXMgZmllbGQgd2lsbCB0eXBpY2FsbHkgYmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGUgc3ViLWFjY291bnQgb3duZXJcXCdzIG5hbWUgYW5kL29yIHRoZSBzdWItYWNjb3VudCBtYXNrLiBUaGUgZm9ybWF0IG9mIHRoaXMgZmllbGQgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgd2lsbCB2YXJ5IGJhc2VkIG9uIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGVhc2UgdXNlIHRoZSBgcGF5bWVudF9jaGFubmVsYCBmaWVsZCwgYHRyYW5zYWN0aW9uX3R5cGVgIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAgYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSBhIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQmFzZVRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIEFuIGlkZW50aWZpZXIgY2xhc3NpZnlpbmcgdGhlIHRyYW5zYWN0aW9uIHR5cGUuICBUaGlzIGZpZWxkIGlzIHBvcHVsYXRlZCBmb3IgRXVyb3BlYW4gaW5zdGl0dXRpb25zLCBhcyB3ZWxsIGFzIGNlcnRhaW4gaW5zdGl0dXRpb25zIGluIHRoZSBVbml0ZWQgU3RhdGVzLiBGb3IgaW5zdGl0dXRpb25zIHdoZXJlIHRoaXMgY2xhc3NpZmljYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gYG51bGxgLiAgYGFkanVzdG1lbnQ6YCBCYW5rIGFkanVzdG1lbnQgIGBhdG06YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCB2aWEgYW4gYXV0b21hdGVkIHRlbGxlciBtYWNoaW5lICBgYmFuayBjaGFyZ2U6YCBDaGFyZ2Ugb3IgZmVlIGxldmllZCBieSB0aGUgaW5zdGl0dXRpb24gIGBiaWxsIHBheW1lbnRgOiBQYXltZW50IG9mIGEgYmlsbCAgYGNhc2g6YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCAgYGNhc2ggYWR2YW5jZTpgIENhc2ggYWR2YW5jZSBkcmF3biBhZ2FpbnN0IGEgY3JlZGl0IGNhcmQgb3IgbGluZSBvZiBjcmVkaXQgIGBjYXNoYmFjazpgIENhc2ggd2l0aGRyYXdhbCB3aGlsZSBtYWtpbmcgYSBkZWJpdCBjYXJkIHB1cmNoYXNlICBgY2hlcXVlOmAgRG9jdW1lbnQgb3JkZXJpbmcgdGhlIHBheW1lbnQgb2YgbW9uZXkgdG8gYW5vdGhlciBwZXJzb24gb3Igb3JnYW5pemF0aW9uICBgZGlyZWN0IGRlYml0OmAgQXV0b21hdGljIHdpdGhkcmF3YWwgb2YgZnVuZHMgaW5pdGlhdGVkIGJ5IGEgdGhpcmQgcGFydHkgYXQgYSByZWd1bGFyIGludGVydmFsICBgaW50ZXJlc3Q6YCBJbnRlcmVzdCBlYXJuZWQgb3IgaW5jdXJyZWQgIGBsYXRlIGZlZTpgIEZlZSBhc3NvY2lhdGVkIHdpdGggYSBsYXRlIG9yIHBhc3QtZHVlIHBheW1lbnQgIGBtZW1iZXJzaGlwIGZlZTpgIEFubnVhbCBvciByZWN1cnJpbmcgbWVtYmVyc2hpcCBmZWUgIGBwYXltZW50OmAgT25lLW9mZiBvdXRib3VuZCBwYXltZW50IG5vdCBjbGFzc2lmaWVkIGFzIGEgYmlsbCBwYXltZW50LCBkaXJlY3QgZGViaXQsIG9yIHN0YW5kaW5nIG9yZGVyICBgcHVyY2hhc2U6YCBQdXJjaGFzZSBtYWRlIHdpdGggYSBkZWJpdCBvciBjcmVkaXQgY2FyZCAgYHJlZnVuZDpgIE1lcmNoYW50IGNyZWRpdCBvciByZXR1cm4sIHN1Y2ggYXMgYSByZWZ1bmQgb2YgYSBwcmlvciBwdXJjaGFzZSAgYHJldHVybmVkIGl0ZW0gZmVlOmAgRmVlIGZvciBhIHJldHVybmVkIGl0ZW0sIHN1Y2ggYXMgYSByZXR1cm5lZCBjaGVjayBvciBzdG9wIHBheW1lbnQgIGBzdGFuZGluZyBvcmRlcjpgIFBheW1lbnQgaW5zdHJ1Y3RlZCBieSB0aGUgYWNjb3VudCBob2xkZXIgdG8gYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGB0cmFuc2ZlcjpgIFRyYW5zZmVyIG9mIG1vbmV5IGJldHdlZW4gYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQ29kZSB7XG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBdG0gPSAnYXRtJyxcbiAgICBCYW5rQ2hhcmdlID0gJ2JhbmsgY2hhcmdlJyxcbiAgICBCaWxsUGF5bWVudCA9ICdiaWxsIHBheW1lbnQnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgQ2FzaEFkdmFuY2UgPSAnY2FzaCBhZHZhbmNlJyxcbiAgICBDYXNoYmFjayA9ICdjYXNoYmFjaycsXG4gICAgQ2hlcXVlID0gJ2NoZXF1ZScsXG4gICAgRGlyZWN0RGViaXQgPSAnZGlyZWN0IGRlYml0JyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgTGF0ZUZlZSA9ICdsYXRlIGZlZScsXG4gICAgTWVtYmVyc2hpcEZlZSA9ICdtZW1iZXJzaGlwIGZlZScsXG4gICAgUGF5bWVudCA9ICdwYXltZW50JyxcbiAgICBQdXJjaGFzZSA9ICdwdXJjaGFzZScsXG4gICAgUmVmdW5kID0gJ3JlZnVuZCcsXG4gICAgUmV0dXJuZWRJdGVtRmVlID0gJ3JldHVybmVkIGl0ZW0gZmVlJyxcbiAgICBTdGFuZGluZ09yZGVyID0gJ3N0YW5kaW5nIG9yZGVyJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHR5cGU6IENvdW50ZXJwYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIGEgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNvdW50ZXJwYXJ0eSBpcyBpbnZvbHZlZCBpbiB0aGUgdHJhbnNhY3Rpb24uICBgVkVSWV9ISUdIYDogV2UgcmVjb2duaXplIHRoaXMgY291bnRlcnBhcnR5IGFuZCB3ZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCBpdCBpcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY291bnRlcnBhcnR5IHdhcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCBidXQgc29tZSBkZXRhaWxzIG1heSBkaWZmZXIgZnJvbSBvdXIgcmVjb3Jkcy4gYExPV2A6IFdlIGRpZG5cXCd0IGZpbmQgYSBtYXRjaGluZyBjb3VudGVycGFydHkgaW4gb3VyIHJlY29yZHMsIHNvIHdlIGFyZSByZXR1cm5pbmcgYSBjbGVhbnNlZCBuYW1lIHBhcnNlZCBvdXQgb2YgdGhlIHJlcXVlc3QgZGVzY3JpcHRpb24uIGBVTktOT1dOYDogV2UgZG9uXFwndCBrbm93IHRoZSBjb25maWRlbmNlIGxldmVsIGZvciB0aGlzIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVycz86IENvdW50ZXJwYXJ0eU51bWJlcnMgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2hlZCBkaXJlY3QgZGVwb3NpdCB0cmFuc2FjdGlvbiB1c2VkIHRvIHZlcmlmeSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW5kIHVzZXJcXCdzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIHRvIHBvcHVsYXRlIGFzIHRlc3QgdHJhbnNhY3Rpb24gZGF0YS4gSWYgbm90IHNwZWNpZmllZCwgcmFuZG9tIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBUcmFuc2FjdGlvbnMgaW4gU2FuZGJveCB3aWxsIG1vdmUgZnJvbSBwZW5kaW5nIHRvIHBvc3RlZCBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGRhdGUgaGFzIGJlZW4gcmVhY2hlZC4gSWYgYSBgZGF0ZV90cmFuc2FjdGVkYCBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBhIHRyYW5zYWN0aW9uIGRhdGUgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgW2BhdXRob3JpemVkX2RhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9ucy1nZXQtcmVzcG9uc2UtdHJhbnNhY3Rpb25zLWF1dGhvcml6ZWQtZGF0ZSkgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIFBvc3RlZCBkYXRlcyBpbiB0aGUgcGFzdCBvciBwcmVzZW50IHdpbGwgcmVzdWx0IGluIHBvc3RlZCB0cmFuc2FjdGlvbnM7IHBvc3RlZCBkYXRlcyBpbiB0aGUgZnV0dXJlIHdpbGwgcmVzdWx0IGluIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIENhbiBiZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBmb3JtYXQgY3VycmVuY3kgY29kZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogQSBncm91cGluZyBvZiByZWxhdGVkIHRyYW5zYWN0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdG8gd2hpY2ggdGhlIHN0cmVhbSBiZWxvbmdzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWQgZm9yIHRoZSBzdHJlYW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLiBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uIGFuZCBncmVhdGVyIGFjY3VyYWN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBTZWUgW0NhdGVnb3JpZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAuIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBwcm92aWRlcyBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24gYW5kIGdyZWF0ZXIgYWNjdXJhY3kuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGVkIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBmaXJzdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmVkaWN0ZWQgZGF0ZSBvZiB0aGUgbmV4dCBwYXltZW50LiBUaGlzIHdpbGwgb25seSBiZSBzZXQgaWYgdGhlIG5leHQgcGF5bWVudCBkYXRlIGNhbiBiZSBwcmVkaWN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBwcmVkaWN0ZWRfbmV4dF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZnJlcXVlbmN5OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCB0cmFuc2FjdGlvbiBJRHMgYmVsb25naW5nIHRvIHRoZSBzdHJlYW0sIHNvcnRlZCBieSBwb3N0ZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgbGFzdF9hbW91bnQ6IFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0gaXMgc3RpbGwgbGl2ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBpc19hY3RpdmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdHJlYW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXMgdGhlIGFiaWxpdHkgdG8gbW9kaWZ5IHRyYW5zYWN0aW9ucyBzdHJlYW1zIGhhcyBiZWVuIGRpc2NvbnRpbnVlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNfdXNlcl9tb2RpZmllZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbW9zdCByZWNlbnQgdXNlciBtb2RpZmljYXRpb24uIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBpZiBgaXNfdXNlcl9tb2RpZmllZGAgaXMgYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsYXN0X3VzZXJfbW9kaWZpZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCB3aXRoIGRhdGEgcGVydGFpbmluZyB0byBhbiBhbW91bnQgb24gdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbUFtb3VudCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIGFuIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYE1BVFVSRWA6IEEgYE1BVFVSRWAgcmVjdXJyaW5nIHN0cmVhbSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHRyYW5zYWN0aW9ucyBhbmQgaGFwcGVuIG9uIGEgcmVndWxhciBjYWRlbmNlIChGb3IgQW5udWFsIHJlY3VycmluZyBzdHJlYW0sIHdlIHdpbGwgbWFyayBpdCBgTUFUVVJFYCBhZnRlciAyIGluc3RhbmNlcykuICBgRUFSTFlfREVURUNUSU9OYDogV2hlbiBhIHJlY3VycmluZyB0cmFuc2FjdGlvbiBmaXJzdCBhcHBlYXJzIGluIHRoZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGFuZCBiZWZvcmUgaXQgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50IG9mIGEgbWF0dXJlIHN0cmVhbSwgdGhlIHN0YXR1cyB3aWxsIGJlIGBFQVJMWV9ERVRFQ1RJT05gLiAgYFRPTUJTVE9ORURgOiBBIHN0cmVhbSB0aGF0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBgRUFSTFlfREVURUNUSU9OYCBzdGF0dXMgd2lsbCBtb3ZlIHRvIHRoZSBgVE9NQlNUT05FRGAgc3RhdHVzIHdoZW4gbm8gZnVydGhlciB0cmFuc2FjdGlvbnMgd2VyZSBmb3VuZCBhdCB0aGUgbmV4dCBleHBlY3RlZCBkYXRlLiAgYFVOS05PV05gOiBBIHN0cmVhbSBpcyBhc3NpZ25lZCBhbiBgVU5LTk9XTmAgc3RhdHVzIHdoZW4gbm9uZSBvZiB0aGUgb3RoZXIgc3RhdHVzZXMgYXJlIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cyB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBNYXR1cmUgPSAnTUFUVVJFJyxcbiAgICBFYXJseURldGVjdGlvbiA9ICdFQVJMWV9ERVRFQ1RJT04nLFxuICAgIFRvbWJzdG9uZWQgPSAnVE9NQlNUT05FRCdcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25zIGNhdGVnb3J5IHJ1bGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcnVsZSBjcmVhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkLWdlbmVyYXRlZCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVuZCB1c2VyIHRoaXMgcnVsZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgcnVsZSB3YXMgY3JlYXRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgcnVsZSB3YXMgbGFzdCB1cGRhdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBlcnNvbmFsIGZpbmFuY2UgcHJpbWFyeSBjYXRlZ29yeS4gU2VlIHRoZSBbdGF4b25vbXkgY3N2IGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9wZmMtdGF4b25vbXktYWxsLmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgcGZjX3ByaW1hcnlfY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwZXJzb25hbCBmaW5hbmNlIGRldGFpbGVkIGNhdGVnb3J5LiBTZWUgdGhlIFt0YXhvbm9teSBjc3YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3BmYy10YXhvbm9teS1hbGwuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBwZmNfZGV0YWlsZWRfY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1J1bGVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBydWxlX2RldGFpbHM/OiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlscztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChgZGVwb3NpdG9yeWAgb3IgYGNyZWRpdGApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcmF3IHRyYW5zYWN0aW9ucyB0byBiZSBlbmhhbmNlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBlbmhhbmNlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuaGFuY2VkX3RyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZW5yaWNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGZvciB0aGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9ucyAoZWl0aGVyIGBkZXBvc2l0b3J5YCBvciBgY3JlZGl0YCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHRyYW5zYWN0aW9uIG9iamVjdHMgdG8gYmUgZW5yaWNoZWQgYnkgUGxhaWQuIE1heGltdW0gb2YgMTAwIHRyYW5zYWN0aW9ucyBwZXIgcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSBgbGVnYWN5X2NhdGVnb3J5YCBhbmQgYGxlZ2FjeV9jYXRlZ29yeV9pZGAgaW4gdGhlIHJlc3BvbnNlIChpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWApLiAgQ2F0ZWdvcmllcyBhcmUgYmFzZWQgb24gUGxhaWRcXCdzIGxlZ2FjeSB0YXhvbm9teS4gRm9yIGEgZnVsbCBsaXN0IG9mIGxlZ2FjeSBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfbGVnYWN5X2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfdmVyc2lvbj86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW5yaWNoZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGVucmljaGVkX3RyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gc2tpcC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIHRoZSByYXcgdW5wYXJzZWQgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24gZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9sb2dvX2FuZF9jb3VudGVycGFydHlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ZlcnNpb24/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb247XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgdG8gY2FsbHMgZm9yIEl0ZW1zIHdoZXJlIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCBoYXMgbm90IGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAoaS5lLiBieSBzcGVjaWZ5aW5nIGB0cmFuc2FjdGlvbnNgIGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgb3IgYnkgbWFraW5nIGEgcHJldmlvdXMgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgKS4gSW4gdGhvc2UgY2FzZXMsIHRoZSBmaWVsZCBjb250cm9scyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRoYXQgUGxhaWQgd2lsbCByZXF1ZXN0IGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhlIG1vcmUgdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZXF1ZXN0ZWQsIHRoZSBsb25nZXIgdGhlIGhpc3RvcmljYWwgdXBkYXRlIHBvbGwgd2lsbCB0YWtlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIDkwIGRheXMgb2YgaGlzdG9yeSB3aWxsIGJlIHJlcXVlc3RlZCBieSBkZWZhdWx0LiBJbiBQcm9kdWN0aW9uLCBpZiBhIHZhbHVlIHVuZGVyIDMwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMzAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLiAgSWYgeW91IGFyZSBpbml0aWFsaXppbmcgeW91ciBJdGVtcyB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgKGUuZy4gYnkgaW5jbHVkaW5nIGB0cmFuc2FjdGlvbnNgIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgcHJvZHVjdHNgIGFycmF5KSwgeW91IG11c3QgdXNlIHRoZSBbYHRyYW5zYWN0aW9ucy5kYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBmaWVsZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgcmVxdWVzdCBpbnN0ZWFkIG9mIGluIHRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlcXVlc3QuICBJZiB0aGUgSXRlbSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LCB0aGlzIGZpZWxkIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3Qgb24gYW4gSXRlbSBjYW5ub3QgYmUgdXBkYXRlZCBpZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbS4gVG8gcmVxdWVzdCBvbGRlciB0cmFuc2FjdGlvbiBoaXN0b3J5IG9uIGFuIEl0ZW0gd2hlcmUgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIHlvdSBtdXN0IGRlbGV0ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAgYW5kIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rIHRvIGNyZWF0ZSBhIG5ldyBJdGVtLiAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIGlucHV0IHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIG9uZSBzdHJlYW0uIElmIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgZXhpc3RzIGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFN0cmVhbXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIE90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zPzogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFJldHJpZXZlcyBhbGwgYWN0aXZlIGFjY291bnRzIG9uIGl0ZW0gaWYgbm8gYGFjY291bnRfaWRgcyBhcmUgcHJvdmlkZWQuICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ZlcnNpb24/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb247XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaW5mbG93IHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGV4cGVuc2UgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbiBzdHJlYW1zIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCB3ZXJlIHVwZGF0ZWQgb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZXRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfdmVyc2lvbj86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5VmVyc2lvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQgZGVmaW5lcyBhIHNpbmdsZSBpbnB1dCB0byB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dCB7XG4gICAgLyoqXG4gICAgICogSURzIG9mIGFsbCB0aGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGZpcnN0IHN0cmVhbS4gVGhpcyBvcGVyYXRpb24gd2lsbCByZXRhaW4gdGhlIGBzdHJlYW1faWRgIG9mIHRoZSBmaXJzdCBzdHJlYW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXRcbiAgICAgKi9cbiAgICBzdHJlYW1faWRzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGlucHV0czogQXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkX3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWRzIG9mIHN0cmVhbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHF1YWxpZmllZCBhcyByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtcyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIG9wZXJhdGlvbiB0byB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHN0cmVhbSB0aGF0IGFsbCB0aGUgdHJhbnNhY3Rpb25zIHdpbGwgYmUgYWRkZWQgaW50by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0cyBpbiBhbm90aGVyIHN0cmVhbSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG90aGVyIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL3VwZGF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL3VwZGF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIERpcmVjdGx5IG1vZGlmaWVkIHN0cmVhbSwgYWxvbmcgd2l0aCBvdGhlciBzdHJlYW1zIHdpdGggdHJhbnNhY3Rpb25zIHJlbW92ZWQgZnJvbSB0aGVtIGFzIGEgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TX1JFTU9WRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGB0cmFuc2FjdGlvbl9pZHNgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgcmVtb3ZlZF90cmFuc2FjdGlvbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB0cmFuc2FjdGlvbnMgcnVsZSBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZUZpZWxkfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIGZpZWxkOiBUcmFuc2FjdGlvbnNSdWxlRmllbGQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1J1bGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zYWN0aW9uc1J1bGVUeXBlO1xuICAgIC8qKlxuICAgICAqIEZvciBgVFJBTlNBQ1RJT05fSURgIGZpZWxkLCBwcm92aWRlIGB0cmFuc2FjdGlvbl9pZGAuIEZvciBgTUVSQ0hBTlRfTkFNRWAgZmllbGQsIHByb3ZpZGUgYSBzdHJpbmcgcGF0dGVybi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZURldGFpbHNcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBmaWVsZCBmb3Igd2hpY2ggdGhlIHJ1bGUgaXMgZGVmaW5lZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVGaWVsZCB7XG4gICAgVHJhbnNhY3Rpb25JZCA9ICdUUkFOU0FDVElPTl9JRCcsXG4gICAgTWVyY2hhbnROYW1lID0gJ01FUkNIQU5UX05BTUUnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gcnVsZVxcJ3MgbWF0Y2ggdHlwZS4gRm9yIGBUUkFOU0FDVElPTl9JRGAgZmllbGQsIGBFWEFDVF9NQVRDSGAgaXMgYXZhaWxhYmxlLiBNYXRjaGVzIGFyZSBjYXNlIHNlbnNpdGl2ZS4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbnNSdWxlVHlwZSB7XG4gICAgRXhhY3RNYXRjaCA9ICdFWEFDVF9NQVRDSCcsXG4gICAgU3Vic3RyaW5nTWF0Y2ggPSAnU1VCU1RSSU5HX01BVENIJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBUaGlzIElEIGlzIHVzZWQgdG8gYXNzb2NpYXRlIHJ1bGVzIHdpdGggYSBzcGVjaWZpYyB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwZXJzb25hbCBmaW5hbmNlIHByaW1hcnkgY2F0ZWdvcnkuIFNlZSB0aGUgW3RheG9ub215IGNzdiBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvcGZjLXRheG9ub215LWFsbC5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBmY19wcmltYXJ5X2NhdGVnb3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwZXJzb25hbCBmaW5hbmNlIGRldGFpbGVkIGNhdGVnb3J5LiBTZWUgdGhlIFt0YXhvbm9teSBjc3YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3BmYy10YXhvbm9teS1hbGwuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwZmNfZGV0YWlsZWRfY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfZGV0YWlsczogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlOiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyIHdob3NlIHJ1bGVzIHNob3VsZCBiZSBsaXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIHVzZXJcXCdzIHRyYW5zYWN0aW9uIHJ1bGVzXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcnVsZXM6IEFycmF5PFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlciB0aGUgcnVsZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBydWxlXFwncyB1bmlxdWUgaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3Vyc29yIHZhbHVlIHJlcHJlc2VudHMgdGhlIGxhc3QgdXBkYXRlIHJlcXVlc3RlZC4gUHJvdmlkaW5nIGl0IHdpbGwgY2F1c2UgdGhlIHJlc3BvbnNlIHRvIG9ubHkgcmV0dXJuIGNoYW5nZXMgYWZ0ZXIgdGhpcyB1cGRhdGUuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmUgaGlzdG9yeSBvZiB1cGRhdGVzIHdpbGwgYmUgcmV0dXJuZWQsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0LWFkZGVkIHRyYW5zYWN0aW9ucyBvbiB0aGUgSXRlbS4gVGhlIGN1cnNvciBhbHNvIGFjY2VwdHMgdGhlIHNwZWNpYWwgdmFsdWUgb2YgYFxcXCJub3dcXFwiYCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmFzdC1mb3J3YXJkIHRoZSBjdXJzb3IgYXMgcGFydCBvZiBtaWdyYXRpbmcgYW4gZXhpc3RpbmcgSXRlbSBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgc3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuIE5vdGUgdGhhdCB1c2luZyB0aGUgYFxcXCJub3dcXFwiYCB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbnkgdXNlIGNhc2Ugb3RoZXIgdGhhbiBtaWdyYXRpbmcgZXhpc3RpbmcgSXRlbXMgZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgVGhlIHVwcGVyLWJvdW5kIGxlbmd0aCBvZiB0aGlzIGN1cnNvciBpcyAyNTYgY2hhcmFjdGVycyBvZiBiYXNlNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDb3VudGVycGFydGllcyBhbmQgZXh0cmEgbWVyY2hhbnQgZmllbGRzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ZlcnNpb24/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVZlcnNpb247XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgdG8gY2FsbHMgZm9yIEl0ZW1zIHdoZXJlIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCBoYXMgbm90IGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAoaS5lLiwgYnkgc3BlY2lmeWluZyBgdHJhbnNhY3Rpb25zYCBpbiB0aGUgYHByb2R1Y3RzYCwgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AsIG9yIGBvcHRpb25hbF9wcm9kdWN0c2AgYXJyYXkgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIG9yIGJ5IG1ha2luZyBhIHByZXZpb3VzIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCkuIEluIHRob3NlIGNhc2VzLCB0aGUgZmllbGQgY29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0aGF0IFBsYWlkIHdpbGwgcmVxdWVzdCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBtb3JlIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVxdWVzdGVkLCB0aGUgbG9uZ2VyIHRoZSBoaXN0b3JpY2FsIHVwZGF0ZSBwb2xsIHdpbGwgdGFrZS4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCA5MCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQgYnkgZGVmYXVsdC4gSW4gUHJvZHVjdGlvbiwgaWYgYSB2YWx1ZSBsZXNzIHRoYW4gMzAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAzMCBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuICBJZiB5b3UgYXJlIGluaXRpYWxpemluZyB5b3VyIEl0ZW1zIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCAoZS5nLiBieSBpbmNsdWRpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBwcm9kdWN0c2AgYXJyYXkpLCB5b3UgbXVzdCB1c2UgdGhlIFtgdHJhbnNhY3Rpb25zLmRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIGZpZWxkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCByZXF1ZXN0IGluc3RlYWQgb2YgaW4gdGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJlcXVlc3QuICBJZiB0aGUgSXRlbSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LCB0aGlzIGZpZWxkIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3Qgb24gYW4gSXRlbSBjYW5ub3QgYmUgdXBkYXRlZCBpZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbS4gVG8gcmVxdWVzdCBvbGRlciB0cmFuc2FjdGlvbiBoaXN0b3J5IG9uIGFuIEl0ZW0gd2hlcmUgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIHlvdSBtdXN0IGRlbGV0ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAgYW5kIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rIHRvIGNyZWF0ZSBhIG5ldyBJdGVtLiAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgcmV0dXJuZWQgdXBkYXRlcyBhbmQgY3Vyc29yIHdpbGwgb25seSByZWZsZWN0IHRoZSBzcGVjaWZpZWQgYWNjb3VudFxcJ3MgdHJhbnNhY3Rpb25zLiBPbWl0dGluZyBgYWNjb3VudF9pZGAgcmV0dXJucyB1cGRhdGVzIGZvciBhbGwgYWNjb3VudHMgdW5kZXIgdGhlIEl0ZW0uIE5vdGUgdGhhdCBzcGVjaWZ5aW5nIGFuIGBhY2NvdW50X2lkYCBlZmZlY3RpdmVseSBjcmVhdGVzIGEgc2VwYXJhdGUgaW5jcmVtZW50YWwgdXBkYXRlIHN0cmVhbSAtLSBhbmQgdGhlcmVmb3JlIGEgc2VwYXJhdGUgY3Vyc29yIC0tIGZvciB0aGF0IGFjY291bnQuIElmIG11bHRpcGxlIGFjY291bnRzIGFyZSBxdWVyaWVkIHRoaXMgd2F5LCB5b3Ugd2lsbCBtYWludGFpbiBtdWx0aXBsZSBjdXJzb3JzLCBvbmUgcGVyIGBhY2NvdW50X2lkYC4gIElmIHlvdSBkZWNpZGUgdG8gYmVnaW4gZmlsdGVyaW5nIGJ5IGBhY2NvdW50X2lkYCBhZnRlciB1c2luZyBubyBgYWNjb3VudF9pZGAsIHN0YXJ0IGZyZXNoIHdpdGggYSBudWxsIGN1cnNvciBhbmQgbWFpbnRhaW4gc2VwYXJhdGUgYChhY2NvdW50X2lkLCBjdXJzb3IpYCBwYWlycyBnb2luZyBmb3J3YXJkLiBEbyBub3QgcmV1c2UgYW55IHByZXZpb3VzbHkgc2F2ZWQgY3Vyc29ycywgYXMgdGhpcyBjYW4gY2F1c2UgcGFnaW5hdGlvbiBlcnJvcnMgb3IgaW5jb21wbGV0ZSBkYXRhLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZV9zdGF0dXM6IFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50cyBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHJlc3BvbnNlLiBPbmx5IGFjY291bnRzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIHNob3duLiBGb3IgZXhhbXBsZSwgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBJZiBgYWNjb3VudF9pZGAgaXMgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QsIHRoZSByZXR1cm5lZCBjdXJzb3Igd2lsbCByZWZsZWN0IHVwZGF0ZXMgZm9yIHRoYXQgc3BlY2lmaWMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdFxcJ3MgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB1cGRhdGUgc3RhdHVzIGZvciB0cmFuc2FjdGlvbiBwdWxscyBvZiBhbiBJdGVtLiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRyYW5zYWN0aW9ucyB3ZWJob29rcywgYW5kIG1heSBiZSBoZWxwZnVsIGZvciB3ZWJob29rIHRyb3VibGVzaG9vdGluZyBvciB3aGVuIHJlY292ZXJpbmcgZnJvbSBtaXNzZWQgd2ViaG9va3MuICBgVFJBTlNBQ1RJT05TX1VQREFURV9TVEFUVVNfVU5LTk9XTmA6IFVuYWJsZSB0byBmZXRjaCB0cmFuc2FjdGlvbnMgdXBkYXRlIHN0YXR1cyBmb3IgSXRlbS4gYE5PVF9SRUFEWWA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgdHJhbnNhY3Rpb24gcHVsbC4gYElOSVRJQUxfVVBEQVRFX0NPTVBMRVRFYDogSW5pdGlhbCBwdWxsIGZvciB0aGUgSXRlbSBpcyBjb21wbGV0ZSwgaGlzdG9yaWNhbCBwdWxsIGlzIHBlbmRpbmcuIGBISVNUT1JJQ0FMX1VQREFURV9DT01QTEVURWA6IEJvdGggaW5pdGlhbCBhbmQgaGlzdG9yaWNhbCBwdWxsIGZvciBJdGVtIGFyZSBjb21wbGV0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cyB7XG4gICAgVHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzVW5rbm93biA9ICdUUkFOU0FDVElPTlNfVVBEQVRFX1NUQVRVU19VTktOT1dOJyxcbiAgICBOb3RSZWFkeSA9ICdOT1RfUkVBRFknLFxuICAgIEluaXRpYWxVcGRhdGVDb21wbGV0ZSA9ICdJTklUSUFMX1VQREFURV9DT01QTEVURScsXG4gICAgSGlzdG9yaWNhbFVwZGF0ZUNvbXBsZXRlID0gJ0hJU1RPUklDQUxfVVBEQVRFX0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGNsaWVudC1wcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgIHRvIHJldHJpZXZlIGluc2lnaHRzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJEYXRhT3ZlcnZpZXd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9kYXRhX292ZXJ2aWV3OiBVc2VyRGF0YU92ZXJ2aWV3O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHlfaW5zaWdodHM/OiBDb3VudGVycGFydHlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F0ZWdvcnlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pbnNpZ2h0cz86IENhdGVnb3J5SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNhY3Rpb25zPzogUmVjdXJyaW5nVHJhbnNhY3Rpb25zO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3dlZXBfc3RhdHVzPzogVHJhbnNmZXJTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgd2lyZV9kZXRhaWxzPzogVHJhbnNmZXJXaXJlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJHdWFyYW50ZWVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZXRhaWxzPzogVHJhbnNmZXJHdWFyYW50ZWVEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSAzIGJ1c2luZXNzIGRheXMgZnJvbSBzZXR0bGVtZW50IGRhdGUgaW5kaWNhdGluZyB0aGUgZm9sbG93aW5nIEFDSCByZXR1cm5zIGNhbiBubyBsb25nZXIgaGFwcGVuOiBSMDEsIFIwMiwgUjAzLCBSMjkuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhbmRhcmRfcmV0dXJuX3dpbmRvdzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSA2MSBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjA1LCBSMDcsIFIxMCwgUjExLCBSNTEsIFIzMywgUjM3LCBSMzgsIFI1MiwgUjUzLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF9yZXR1cm5fd2luZG93OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgZm9yIFBsYWlkIExlZGdlciBjbGllbnRzLCB1c2UgYGV4cGVjdGVkX2Z1bmRzX2F2YWlsYWJsZV9kYXRlYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgd2hlbiBmdW5kcyBmcm9tIGEgdHJhbnNmZXIgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhc3NvY2lhdGVkIGxlZGdlciBiYWxhbmNlLCBhc3N1bWluZyB0aGUgZGViaXQgZG9lcyBub3QgcmV0dXJuIGJlZm9yZSB0aGlzIGRhdGUuIElmIHRoZSB0cmFuc2ZlciBkb2VzIHJldHVybiBiZWZvcmUgdGhpcyBkYXRlLCB0aGlzIGZpZWxkIHdpbGwgYmUgbnVsbC4gT25seSBhcHBsaWVzIHRvIGRlYml0IHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9mdW5kc19hdmFpbGFibGVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybVxcJ3MgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXJcXCdzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgdmFsdWUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYHRyYW5zZmVyLmFtb3VudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWNpbGl0YXRvcl9mZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIEFDSCBuZXR3b3JrcyB1c2VkIGZvciB0aGUgZnVuZHMgZmxvdy4gIEZvciByZXF1ZXN0cyBzdWJtaXR0ZWQgYXMgZWl0aGVyIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRoZSBjdXRvZmYgZm9yIFNhbWUgRGF5IEFDSCBpcyAzOjAwIFBNIEVhc3Rlcm4gVGltZSBhbmQgdGhlIGN1dG9mZiBmb3IgU3RhbmRhcmQgQUNIIHRyYW5zZmVycyBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc3VibWl0IGEgcmVxdWVzdCBhdCBsZWFzdCAxNSBtaW51dGVzIGJlZm9yZSB0aGUgY3V0b2ZmIHRpbWUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBjdXRvZmYuIEFueSByZXF1ZXN0IHRoYXQgaXMgaW5kaWNhdGVkIGFzIGBzYW1lLWRheS1hY2hgIGFuZCB0aGF0IG1pc3NlcyB0aGUgU2FtZSBEYXkgQUNIIGN1dG9mZiwgYnV0IGlzIHN1Ym1pdHRlZCBpbiB0aW1lIGZvciB0aGUgU3RhbmRhcmQgQUNIIGN1dG9mZiwgd2lsbCBiZSBzZW50IG92ZXIgU3RhbmRhcmQgQUNIIHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBQ0hOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCdcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBmb3IgYSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSByZXByZXNlbnRpbmcgd2hlbiB0aGUgYXV0aG9yaXphdGlvbiB3YXMgY3JlYXRlZCwgaW4gdGhlIGZvcm1hdCBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhvcml6YXRpb25HdWFyYW50ZWVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGV0YWlscz86IEF1dGhvcml6YXRpb25HdWFyYW50ZWVEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2t9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrOiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIHByb3Bvc2VkX3RyYW5zZmVyOiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYWNjb3VudCB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBTaG91bGQgYmUgc3BlY2lmaWVkIGlmIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMgb25seS4gSWYgdXNpbmcgUGxhaWQgTGVkZ2VyLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayBhbmQgeW91IGFyZSB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuIE90aGVyd2lzZSwgUGxhaWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGxlZGdlciBiYWxhbmNlIHNob3VsZCBiZSB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBZb3UgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmVxdWlyZWQgaWYgbm90IHVzaW5nIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlcldpcmVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2lyZV9kZXRhaWxzPzogVHJhbnNmZXJXaXJlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2U7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyBhdXRob3JpemF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBhY2NvdW50IHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgYXV0aG9yaXphdGlvbiwgd2hpY2ggZXhwaXJlcyBhZnRlciA0OCBob3Vycy4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhbiBhdXRob3JpemF0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGF1dGhvcml6YXRpb24gaXMgY3JlYXRlZC4gIElkZW1wb3RlbmN5IGRvZXMgbm90IGFwcGx5IHRvIGF1dGhvcml6YXRpb25zIHdob3NlIGRlY2lzaW9ucyBhcmUgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYC4gVGhlcmVmb3JlIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbiBhZnRlciBjb21wbGV0aW5nIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbiB3aXRob3V0IGNoYW5naW5nIGBpZGVtcG90ZW5jeV9rZXlgLiAgVGhpcyBpZGVtcG90ZW5jeSBrZXkgZXhwaXJlcyBhZnRlciA0OCBob3VycywgYWZ0ZXIgd2hpY2ggdGhlIHNhbWUga2V5IGNhbiBiZSByZXVzZWQuIEZhaWx1cmUgdG8gcHJvdmlkZSB0aGlzIGtleSBtYXkgcmVzdWx0IGluIGR1cGxpY2F0ZSBjaGFyZ2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbmQgdXNlciBpcyBpbml0aWF0aW5nIHRoZSBzcGVjaWZpYyB0cmFuc2ZlciB0aGVtc2VsdmVzIHZpYSBhbiBpbnRlcmFjdGl2ZSBVSSwgdGhpcyBzaG91bGQgYmUgYHRydWVgOyBmb3IgYXV0b21hdGljIHJlY3VycmluZyBwYXltZW50cyB3aGVyZSB0aGUgZW5kIHVzZXIgaXMgbm90IGFjdHVhbGx5IGluaXRpYXRpbmcgZWFjaCBpbmRpdmlkdWFsIHRyYW5zZmVyLCBpdCBzaG91bGQgYmUgYGZhbHNlYC4gVGhpcyBmaWVsZCBpcyBub3QgY3VycmVudGx5IHVzZWQgYW5kIGlzIHByZXNlbnQgdG8gc3VwcG9ydCBwbGFubmVkIGZ1dHVyZSBmdW5jdGlvbmFsaXR5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgc2V0IHRvIGBmYWxzZWAsIFBsYWlkIHdpbGwgbm90IG9mZmVyIGEgYGd1YXJhbnRlZV9kZWNpc2lvbmAgZm9yIHRoaXMgcmVxdWVzdCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS4gVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBndWFyYW50ZWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB3aXRoX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2ZlciBzaG91bGQgYmUgZXZhbHVhdGVkIGZvciBndWFyYW50ZWUgY292ZXJhZ2UuIFdoZW4gc2V0IHRvIGB0cnVlYCwgUGxhaWQgYXNzZXNzZXMgdGhlIHRyYW5zZmVyIGZvciBndWFyYW50ZWUgY292ZXJhZ2UgYW5kIHJldHVybnMgYSBkZWNpc2lvbiBpbiB0aGUgYXV0aG9yaXphdGlvbiByZXNwb25zZS4gV2hlbiBvbWl0dGVkIG9yIHNldCB0byBgZmFsc2VgLCB0aGUgYXV0aG9yaXphdGlvbiBpcyBldmFsdWF0ZWQgd2l0aG91dCBndWFyYW50ZWUgY292ZXJhZ2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1ZXN0X2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBieSBQbGFpZFxcJ3MgW2JlYWNvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9ndWFyYW50ZWUvI3VzaW5nLWEtYmVhY29uKSB3aGVuIGl0IGlzIHJ1biBvbiB5b3VyIHdlYnBhZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYmVhY29uX3Nlc3Npb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IG5lZWRlZCBpZiBjcmVhdGluZyB0cmFuc2ZlcnMgb24gYmVoYWxmIG9mIGFub3RoZXIgY2xpZW50IGFzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWRpdF9mdW5kc19zb3VyY2U/OiBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgYGF1dGhvcml6YXRpb25gIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIHRoZSBSdWxlc2V0IGZvciB0aGUgdHJhbnNhY3Rpb24uIElmIG5vdCBwcm92aWRlZCwgU2lnbmFsIHdpbGwgdXNlIHRoZSBgZGVmYXVsdGAgcnVsZXNldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZXNldF9rZXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZnJlZS1mb3JtIG1hcCBvZiBjbGllbnQtc3VwcGxpZWQgcmlzay1yZWxldmFudCBjb250ZXh0IGZvciB0aGlzIGF1dGhvcml6YXRpb24uIFBsYWlkIG1heSB1c2UgdGhlc2UgYXR0cmlidXRlcyB0byBpbmZvcm0gZnV0dXJlIHZlcnNpb25zIG9mIG91ciByaXNrIG1vZGVscy4gIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IEtleXMgbXVzdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uIGBeW0EtWmEtejAtOV8uLV17MSw0MH0kYCBWYWx1ZXMgbXVzdCBiZSBzdHJpbmdzIChubyBuZXN0ZWQgb2JqZWN0cywgYXJyYXlzLCBudW1iZXJzLCBvciBib29sZWFucyBhbGxvd2VkOyBzdHJpbmdpZnkgbm9uLXN0cmluZyB2YWx1ZXMgY2xpZW50LXNpZGUpIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzICBEbyBub3QgaW5jbHVkZSBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiBvciBvdGhlciBzZW5zaXRpdmUgZGF0YS4gXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tX2F0dHJpYnV0ZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb247XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiAgQSBkZWNpc2lvbiByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgYGFwcHJvdmVkYCAtIFRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgcmVjZWl2ZWQgdGhlIGVuZCB1c2VyXFwncyBjb25zZW50IGFuZCBoYXMgYmVlbiBhcHByb3ZlZCBmb3IgcHJvY2Vzc2luZyBieSBQbGFpZC4gVGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIGZpZWxkIGlzIHNldCBpZiBQbGFpZCB3YXMgdW5hYmxlIHRvIGZldGNoIHRoZSBhY2NvdW50IGluZm9ybWF0aW9uLiBZb3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBmdXJ0aGVyIHJldmlldyBpcyByZWNvbW1lbmRlZC4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLiAgYGRlY2xpbmVkYCAtIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLiAgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCAtIEFuIGFjdGlvbiBpcyByZXF1aXJlZCBiZWZvcmUgUGxhaWQgY2FuIGFzc2VzcyB0aGUgdHJhbnNmZXIgcmlzayBhbmQgbWFrZSBhIGRlY2lzaW9uLiBUaGUgbW9zdCBjb21tb24gc2NlbmFyaW8gaXMgdG8gdXBkYXRlIGF1dGhlbnRpY2F0aW9uIGZvciBhbiBJdGVtLiBUbyBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgYWN0aW9uLCBpbml0aWFsaXplIExpbmsgYnkgc2V0dGluZyBgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGAgaW4gdGhlIHJlcXVlc3Qgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuIEFmdGVyIExpbmsgZmxvdyBpcyBjb21wbGV0ZWQsIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbiByZXF1ZXN0LiAgRm9yIGBndWFyYW50ZWVgIHJlcXVlc3RzLCBgYXBwcm92ZWRgIGluZGljYXRlcyB0aGUgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIFBsYWlkXFwncyBndWFyYW50ZWUsIGFuZCBgZGVjbGluZWRgIGluZGljYXRlcyBQbGFpZCB3aWxsIG5vdCBwcm92aWRlIGd1YXJhbnRlZSBjb3ZlcmFnZSBmb3IgdGhlIHRyYW5zZmVyLiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZvbGxvdyB0aGUgYWJvdmUgZ3VpZGFuY2UgYmVmb3JlIHJlLWF0dGVtcHRpbmcuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbiB7XG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIERlY2xpbmVkID0gJ2RlY2xpbmVkJyxcbiAgICBVc2VyQWN0aW9uUmVxdWlyZWQgPSAndXNlcl9hY3Rpb25fcmVxdWlyZWQnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHJlZ2FyZGluZyBhIHByb3Bvc2VkIHRyYW5zZmVyLiBJdCBpcyBhbHdheXMgc2V0IGZvciBgZGVjbGluZWRgIGRlY2lzaW9ucywgYW5kIG1heSBvciBtYXkgbm90IGJlIG51bGwgZm9yIGBhcHByb3ZlZGAgZGVjaXNpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zZmVyIGFwcHJvdmFsIG9yIHRyYW5zZmVyIGRlY2xpbmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbGUgZm9yIGFwcHJvdmluZyBvciBkZWNsaW5pbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgSWYgdGhlIGByYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgcGFzc2VkIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrLiAgQW55IG5vbi1gbnVsbGAgdmFsdWUgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gY2hlY2sgY291bGQgbm90IGJlIHJ1biBhbmQgdGhhdCB5b3Ugc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBhc3Nlc3NtZW50IG9uIHRoZSB0cmFuc2Zlci4gVGhlIGNvZGUgd2lsbCBpbmRpY2F0ZSB3aHkgdGhlIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4uIFBvc3NpYmxlIHZhbHVlcyBmb3IgYW4gYGFwcHJvdmVkYCB0cmFuc2ZlciBhcmU6ICBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAgLSBJdGVtIGNyZWF0ZWQgdmlhIGEgbWFudWFsIGVudHJ5IGZsb3cgKGkuZS4gU2FtZS1EYXkgTWljcm8tZGVwb3NpdCwgSW5zdGFudCBNaWNyby1kZXBvc2l0LCBvciBkYXRhYmFzZS1iYXNlZCB2ZXJpZmljYXRpb24pLCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCAtIFVuYWJsZSB0byBjb2xsZWN0IHRoZSBhY2NvdW50IGluZm9ybWF0aW9uIGR1ZSB0byBJdGVtIHN0YWxlbmVzcy4gQ2FuIGJlIHJlc29sdmVkIGJ5IHVzaW5nIExpbmsgYW5kIHNldHRpbmcgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBpbiB0aGUgcmVxdWVzdCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgIC0gVGhlIFBheW1lbnQgUHJvZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGwgdG8gYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgaXMgaW4gYSBzdGF0ZSB0aGF0IHJlcXVpcmVzIHRoZSBlbmQgdXNlciB0byByZS1hdXRoZW50aWNhdGUuIENhbiBiZSByZXNvbHZlZCBieSB1c2luZyBMaW5rIHRvIHJlZnJlc2ggdGhlIFBheW1lbnQgUHJvZmlsZS4gIGBNSUdSQVRFRF9BQ0NPVU5UX0lURU1gIC0gSXRlbSBjcmVhdGVkIHZpYSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQsIGxpbWl0ZWQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgYEVSUk9SYCAtIFVuYWJsZSB0byBjb2xsZWN0IHRoZSBhY2NvdW50IGluZm9ybWF0aW9uIGR1ZSB0byBhbiB1bnNwZWNpZmllZCBlcnJvci4gIFRoZSBmb2xsb3dpbmcgY29kZXMgaW5kaWNhdGUgdGhhdCB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiB3YXMgYGRlY2xpbmVkYDogIGBOU0ZgIC0gVHJhbnNhY3Rpb24gbGlrZWx5IHRvIHJlc3VsdCBpbiBhIHJldHVybiBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFJJU0tgIC0gVHJhbnNhY3Rpb24gaXMgaGlnaC1yaXNrLiAgYFRSQU5TRkVSX0xJTUlUX1JFQUNIRURgIC0gT25lIG9yIHNldmVyYWwgdHJhbnNmZXIgbGltaXRzIGFyZSByZWFjaGVkLCBlLmcuIG1vbnRobHkgdHJhbnNmZXIgbGltaXQuIENoZWNrIHRoZSBhY2NvbXBhbnlpbmcgYGRlc2NyaXB0aW9uYCBmaWVsZCB0byB1bmRlcnN0YW5kIHdoaWNoIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGUge1xuICAgIE5zZiA9ICdOU0YnLFxuICAgIFJpc2sgPSAnUklTSycsXG4gICAgVHJhbnNmZXJMaW1pdFJlYWNoZWQgPSAnVFJBTlNGRVJfTElNSVRfUkVBQ0hFRCcsXG4gICAgTWFudWFsbHlWZXJpZmllZEl0ZW0gPSAnTUFOVUFMTFlfVkVSSUZJRURfSVRFTScsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgUGF5bWVudFByb2ZpbGVMb2dpblJlcXVpcmVkID0gJ1BBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIE1pZ3JhdGVkQWNjb3VudEl0ZW0gPSAnTUlHUkFURURfQUNDT1VOVF9JVEVNJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLiBUaGVzZSBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2ZlciBpcyBndWFyYW50ZWVkIGJ5IFBsYWlkIChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLiBUaGlzIGZpZWxkIHdpbGwgY29udGFpbiBlaXRoZXIgYEdVQVJBTlRFRURgIG9yIGBOT1RfR1VBUkFOVEVFRGAgaW5kaWNhdGluZyB3aGV0aGVyIFBsYWlkIHdpbGwgZ3VhcmFudGVlIHRoZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHtcbiAgICBHdWFyYW50ZWVkID0gJ0dVQVJBTlRFRUQnLFxuICAgIE5vdEd1YXJhbnRlZWQgPSAnTk9UX0dVQVJBTlRFRUQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgcmF0aW9uYWxlIGZvciBQbGFpZFxcJ3MgZGVjaXNpb24gdG8gbm90IGd1YXJhbnRlZSBhIHRyYW5zZmVyLiBXaWxsIGJlIGBudWxsYCB1bmxlc3MgYGd1YXJhbnRlZV9kZWNpc2lvbmAgaXMgYE5PVF9HVUFSQU5URUVEYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBjb2RlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIHRyYW5zZmVyIGNhbm5vdCBiZSBndWFyYW50ZWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cbi8qKlxuICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVhc29uIFBsYWlkIGRlY2xpbmVkIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyOiAgYFJFVFVSTl9CQU5LYDogVGhlIHJpc2sgb2YgYSBiYW5rLWluaXRpYXRlZCByZXR1cm4gKGZvciBleGFtcGxlLCBhbiBSMDEvTlNGKSBpcyB0b28gaGlnaCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2Zlci4gIGBSRVRVUk5fQ1VTVE9NRVJgOiBUaGUgcmlzayBvZiBhIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gKGZvciBleGFtcGxlLCBhIFIxMC9VbmF1dGhvcml6ZWQpIGlzIHRvbyBoaWdoIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyLiAgYEdVQVJBTlRFRV9MSU1JVF9SRUFDSEVEYDogVGhpcyB0cmFuc2ZlciBpcyBsb3ctcmlzaywgYnV0IEd1YXJhbnRlZSBoYXMgZXhoYXVzdGVkIGFuIGludGVybmFsIGxpbWl0IG9uIHRoZSBudW1iZXIgb3IgcmF0ZSBvZiBndWFyYW50ZWVzIHRoYXQgYXBwbGllcyB0byB0aGlzIHRyYW5zZmVyLiAgYFJJU0tfRVNUSU1BVEVfVU5BVkFJTEFCTEVgOiBBIHJpc2sgZXN0aW1hdGUgaXMgdW5hdmFpbGFibGUgZm9yIHRoaXMgSXRlbS4gIGBSRVFVSVJFRF9QQVJBTV9NSVNTSU5HYDogUmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlIHtcbiAgICBSZXR1cm5CYW5rID0gJ1JFVFVSTl9CQU5LJyxcbiAgICBSZXR1cm5DdXN0b21lciA9ICdSRVRVUk5fQ1VTVE9NRVInLFxuICAgIEd1YXJhbnRlZUxpbWl0UmVhY2hlZCA9ICdHVUFSQU5URUVfTElNSVRfUkVBQ0hFRCcsXG4gICAgUmlza0VzdGltYXRlVW5hdmFpbGFibGUgPSAnUklTS19FU1RJTUFURV9VTkFWQUlMQUJMRScsXG4gICAgUmVxdWlyZWRQYXJhbU1pc3NpbmcgPSAnUkVRVUlSRURfUEFSQU1fTUlTU0lORydcbn1cblxuLyoqXG4gKiBUaGlzIG9iamVjdCBpbmNsdWRlcyB0aGUgc2NvcmVzIGFuZCByaXNrIGxldmVsLiBUaGlzIHJlc3BvbnNlIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGVzZSBmaWVsZHMsIHBsZWFzZSBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuICBUaGUgc2NvcmUgZXZhbHVhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBiZWNhdXNlIGFuIGFjY291bnQgaXMgb3ZlcmRyYXduIG9yIGJlY2F1c2UgYW4gaW5lbGlnaWJsZSBhY2NvdW50IGlzIHVzZWQgYW5kIGNvdmVycyByZXR1cm4gY29kZXM6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsICBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICBiYW5rX2luaXRpYXRlZF9yZXR1cm5fc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLiAgVGhlIHNjb3JlIGV2YWx1YXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0IGFuZCBjb3ZlcnMgcmV0dXJuIGNvZGVzOiBcXFwiUjA1XFxcIiwgXFxcIlIwN1xcXCIsIFxcXCJSMTBcXFwiLCBcXFwiUjExXFxcIiwgXFxcIlIyOVxcXCIuIFRoZXNlIHJldHVybnMgdHlwaWNhbGx5IGhhdmUgYSByZXR1cm4gdGltZSBmcmFtZSBvZiB1cCB0byA2MCBjYWxlbmRhciBkYXlzLiBEdXJpbmcgdGhpcyBwZXJpb2QsIGN1c3RvbWVycyBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGNhbiBkaXNwdXRlIGEgdHJhbnNhY3Rpb24gYXMgdW5hdXRob3JpemVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9zY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw6IFRyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIFBsYWlkIExlZGdlciBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb3JpZ2luYWxseSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCB3aGVuIGNyZWF0aW5nIHRoZSBhdXRob3JpemF0aW9uIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjgwMC4wMFxcXCIpLiBUaGlzIG1heSBkaWZmZXIgZnJvbSBgYW1vdW50YCwgdGhlIGFtb3VudCBQbGFpZCBwcm9wb3NlcyB0byB0cmFuc2Zlciwgd2hlbiBvbmx5IGEgcGFydGlhbCBhbW91bnQgaXMgb2ZmZXJlZCBhcyBwYXJ0IG9mIGFuIEFkYXB0aXZlIEd1YXJhbnRlZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVxdWVzdGVkX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlcldpcmVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgd2lyZV9kZXRhaWxzPzogVHJhbnNmZXJXaXJlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWRpdF9mdW5kc19zb3VyY2U6IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG59XG4vKipcbiAqIENvbXByaXNlcyBmaXZlIHJpc2sgY2F0ZWdvcmllcyAoaGlnaCByaXNrLCBtZWRpdW0taGlnaCByaXNrLCBtZWRpdW0gcmlzaywgbWVkaXVtLWxvdyByaXNrLCBsb3cgcmlzaykgYmFzZWQgb24gdGhlIHByb2JhYmlsaXR5IG9mIHJldHVyblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsIHtcbiAgICBIaWdoUmlzayA9ICdISUdIX1JJU0snLFxuICAgIE1lZGl1bUhpZ2hSaXNrID0gJ01FRElVTV9ISUdIX1JJU0snLFxuICAgIE1lZGl1bVJpc2sgPSAnTUVESVVNX1JJU0snLFxuICAgIE1lZGl1bUxvd1Jpc2sgPSAnTUVESVVNX0xPV19SSVNLJyxcbiAgICBMb3dSaXNrID0gJ0xPV19SSVNLJ1xufVxuXG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLiAgSWYgdGhlIGFjY291bnQgaGFzIG11bHRpcGxlIGFjY291bnQgaG9sZGVycywgcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlciBvbiB3aG9zZSBiZWhhbGYgdGhlIGF1dGhvcml6YXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGUgYHVzZXIubGVnYWxfbmFtZWAgZmllbGQgaXMgcmVxdWlyZWQuIE90aGVyIGZpZWxkcyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGFuZCBhcmUgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS4gSWYgdGhlIHVzZXIgaXMgYSBidXNpbmVzcywgcHJvdmlkZSB0aGUgYnVzaW5lc3MgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGlzIGJhbGFuY2UgYXZhaWxhYmxlIGZvciB1c2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UsIHBsdXMgdGhlIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgYXJlIGluIHByb2Nlc3NpbmcgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlckJhbGFuY2VUeXBlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlPzogVHJhbnNmZXJCYWxhbmNlVHlwZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IFRyYW5zZmVyQmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGJhbGFuY2UuICBgcHJlZnVuZGVkX3J0cF9jcmVkaXRzYCAtIFlvdXIgcHJlZnVuZGVkIFJUUCBjcmVkaXQgYmFsYW5jZSB3aXRoIFBsYWlkIGBwcmVmdW5kZWRfYWNoX2NyZWRpdHNgIC0gWW91ciBwcmVmdW5kZWQgQUNIIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQmFsYW5jZVR5cGUge1xuICAgIFJ0cENyZWRpdHMgPSAncHJlZnVuZGVkX3J0cF9jcmVkaXRzJyxcbiAgICBBY2hDcmVkaXRzID0gJ3ByZWZ1bmRlZF9hY2hfY3JlZGl0cydcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWFzb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWFzb25fY29kZT86IFJlYXNvbkNvZGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN1cHBvcnRlZCBzZXJ2aWNlIHR5cGVzIGluIFJUUFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbiBzdXBwb3J0cyBSVFAgY3JlZGl0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICAgICAqL1xuICAgIGNyZWRpdD86IGJvb2xlYW47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zdXBwb3J0ZWRfbmV0d29ya3M6IEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3M7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdXBwb3J0ZWQgc2VydmljZSB0eXBlcyBpbiBSZlBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZlBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUCB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24gc3VwcG9ydHMgUmZQIGRlYml0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUFxuICAgICAqL1xuICAgIGRlYml0PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKSBmb3Igb3JpZ2luYXRpbmcgUmZQIHRyYW5zZmVycyB3aXRoIHRoZSBnaXZlbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUFxuICAgICAqL1xuICAgIG1heF9hbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgYG1heF9hbW91bnRgLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2YgZG9sbGFyIGFtb3VudCBvZiBhIHNpbmdsZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2YgZG9sbGFyIGFtb3VudCBvZiBhIHNpbmdsZSBjcmVkaXQgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfY3JlZGl0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2YgZG9sbGFyIGFtb3VudCBvZiBhIHNpbmdsZSBkZWJpdCB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9kZWJpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X2RhaWx5X2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfZGFpbHlfZGViaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgYW5kIGRlYml0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbWF4X21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIG9uZSBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X21vbnRobHlfY3JlZGl0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIG9uZSBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X21vbnRobHlfZGViaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBkb2xsYXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZC4gYGF1dGhvcml6YXRpb25faWRgIGlzIG5vdyB1c2VkIGFzIGlkZW1wb3RlbmN5IGluc3RlYWQuICBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBUaGlzIHBhcmFtZXRlciBhbHNvIHNlcnZlcyB0aGUgcHVycG9zZSBvZiBhY3RpbmcgYXMgYW4gaWRlbXBvdGVuY3kgaWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0eXBlPzogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgZGVzY3JpcHRpb24sIG1heGltdW0gb2YgMTUgY2hhcmFjdGVycyAoUlRQIHRyYW5zYWN0aW9ucykgb3IgMTAgY2hhcmFjdGVycyAoQUNIIHRyYW5zYWN0aW9ucykuIFNob3VsZCByZXByZXNlbnQgd2h5IHRoZSBtb25leSBpcyBtb3ZpbmcsIG5vdCB5b3VyIGNvbXBhbnkgbmFtZS4gRm9yIHJlY29tbWVuZGF0aW9ucyBvbiBzZXR0aW5nIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkIHRvIGF2b2lkIEFDSCByZXR1cm5zLCBzZWUgW0Rlc2NyaXB0aW9uIGZpZWxkIHJlY29tbWVuZGF0aW9uc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvY3JlYXRpbmctdHJhbnNmZXJzLyNkZXNjcmlwdGlvbi1maWVsZC1yZWNvbW1lbmRhdGlvbnMpLiAgSWYgcmVwcm9jZXNzaW5nIGEgcmV0dXJuZWQgdHJhbnNmZXIsIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkIG11c3QgYmUgYFxcXCJSZXRyeSAxXFxcImAgb3IgYFxcXCJSZXRyeSAyXFxcImAuIFlvdSBtYXkgcmV0cnkgYSB0cmFuc2ZlciB1cCB0byAyIHRpbWVzLCB3aXRoaW4gMTgwIGRheXMgb2YgY3JlYXRpbmcgdGhlIG9yaWdpbmFsIHRyYW5zZmVyLiBPbmx5IHRyYW5zZmVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2l0aCBjb2RlIGBSMDFgIG9yIGBSMDlgIG1heSBiZSByZXRyaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVzZXI/OiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgdHJhbnNmZXJgIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCBgdGVzdF9jbG9ja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBkZWR1Y3QgZnJvbSBgdHJhbnNmZXIuYW1vdW50YCBhbmQgZGlzdHJpYnV0ZSB0byB0aGUgcGxhdGZvcm1cXCdzIExlZGdlciBiYWxhbmNlIGFzIGEgZmFjaWxpdGF0b3IgZmVlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFRoZSByZW1haW5kZXIgd2lsbCBnbyB0byB0aGUgZW5kLWN1c3RvbWVyXFwncyBMZWRnZXIgYmFsYW5jZS4gVGhpcyBtdXN0IGJlIHZhbHVlIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGB0cmFuc2Zlci5hbW91bnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBub3cgZGVwcmVjYXRlZC4gWW91IG1heSBpZ25vcmUgaXQgZm9yIHRyYW5zZmVycyBjcmVhdGVkIG9uIGFuZCBhZnRlciAxMi8wMS8yMDIzLiAgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgZnVuZHMgZm9yIHRoZSB0cmFuc2Zlci4gT25seSB2YWxpZCBmb3IgYGNyZWRpdGAgdHJhbnNmZXJzLCBhbmQgZGVmYXVsdHMgdG8gYHN3ZWVwYCBpZiBub3Qgc3BlY2lmaWVkLiBUaGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGBkZWJpdGAgdHJhbnNmZXJzLiAgYHN3ZWVwYCAtIFN3ZWVwIGZ1bmRzIGZyb20geW91ciBmdW5kaW5nIGFjY291bnQgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgQUNIIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2Uge1xuICAgIFN3ZWVwID0gJ3N3ZWVwJyxcbiAgICBQcmVmdW5kZWRSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgUHJlZnVuZGVkQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGNyZWRpdHMuIEZvciBhbGwgZG9sbGFyIGFtb3VudHMsIHVzZSBhIGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIHRoZSBvcmlnaW5hdG9yIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgY3JlZGl0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBjcmVkaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9oaWdoZXN0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCBhdmVyYWdlIGFtb3VudCBwZXIgY3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfYXZlcmFnZV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvclxcJ3MgbW9udGhseSBleHBlY3RlZCBBQ0ggY3JlZGl0IHByb2Nlc3NpbmcgYW1vdW50IGZvciB0aGUgbmV4dCA2LTEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9yXFwncyBjcmVkaXQgdHJhbnNmZXJzLiBUaGlzIHNob3VsZCBiZSBhIGxpc3QgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzOiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0LiBUaGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLiBBdXRob3JpemF0aW9uIHdhcyBvYnRhaW5lZCBmcm9tIHRoZSBjb25zdW1lciBpbiBwZXJzb24gdmlhIHdyaXRpbmcsIG9yIHRocm91Z2ggb25saW5lIGF1dGhvcml6YXRpb24sIG9yIHZpYSBhbiBlbGVjdHJvbmljIGRvY3VtZW50IHNpZ25pbmcsIGUuZy4gRG9jdXNpZ24uIEZvciBleGFtcGxlIGxhbmd1YWdlIGZvciBvbmxpbmUgYXV0aG9yaXphdGlvbiwgc2VlIHRoZSAyMDI1IE5hY2hhIE9wZXJhdGluZyBSdWxlcyAtLSBTZWN0aW9uIDIuMy4yLCBBdXRob3JpemF0aW9uIG9mIEVudHJpZXMgdmlhIEVsZWN0cm9uaWMgTWVhbnMuIENhbiBiZSB1c2VkIGZvciBjcmVkaXRzIG9yIGRlYml0cy4gIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkuIFRoZSB0cmFuc2ZlciBkZWJpdHMgYSBjb25zdW1lclxcJ3MgYmFuayBhY2NvdW50LiBBdXRob3JpemF0aW9uIGZyb20gdGhlIGNvbnN1bWVyIGlzIG9idGFpbmVkIG92ZXIgdGhlIEludGVybmV0IChlLmcuIGEgd2ViIG9yIG1vYmlsZSBhcHBsaWNhdGlvbikuIENhbiBiZSB1c2VkIGZvciBzaW5nbGUgZGViaXRzIG9yIHJlY3VycmluZyBkZWJpdHMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFDSENsYXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PENyZWRpdEFDSENsYXNzPjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB1c2FnZSBvZiBkZWJpdHMuIEZvciBhbGwgZG9sbGFyIGFtb3VudHMsIHVzZSBhIGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIHRoZSBvcmlnaW5hdG9yIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgZGViaXQgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfZnJlcXVlbmN5OiBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgaGlnaGVzdCBhbW91bnQgZm9yIGEgc2luZ2xlIGRlYml0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9oaWdoZXN0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCBhdmVyYWdlIGFtb3VudCBwZXIgZGViaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2F2ZXJhZ2VfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3JcXCdzIG1vbnRobHkgZXhwZWN0ZWQgQUNIIGRlYml0IHByb2Nlc3NpbmcgYW1vdW50IGZvciB0aGUgbmV4dCA2LTEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfbW9udGhseV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGV4cGVjdGVkIHVzZSBjYXNlcyBmb3IgdGhlIG9yaWdpbmF0b3JcXCdzIGRlYml0IHRyYW5zZmVycy4gVGhpcyBzaG91bGQgYmUgYSBsaXN0IHRoYXQgY29udGFpbnMgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjb2RlczogIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIFRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIuIEF1dGhvcml6YXRpb24gd2FzIG9idGFpbmVkIGluIHdyaXRpbmcgZWl0aGVyIGluIHBlcnNvbiBvciB2aWEgYW4gZWxlY3Ryb25pYyBkb2N1bWVudCBzaWduaW5nLCBlLmcuIERvY3VzaWduLCBieSB0aGUgY29uc3VtZXIuIENhbiBiZSB1c2VkIGZvciBjcmVkaXRzIG9yIGRlYml0cy4gIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkuIFRoZSB0cmFuc2ZlciBkZWJpdHMgYSBjb25zdW1lclxcJ3MgYmFuayBhY2NvdW50LiBBdXRob3JpemF0aW9uIGZyb20gdGhlIGNvbnN1bWVyIGlzIG9idGFpbmVkIG92ZXIgdGhlIEludGVybmV0IChlLmcuIGEgd2ViIG9yIG1vYmlsZSBhcHBsaWNhdGlvbikuIENhbiBiZSB1c2VkIGZvciBzaW5nbGUgZGViaXRzIG9yIHJlY3VycmluZyBkZWJpdHMuICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeS4gVGhlIHRyYW5zZmVyIGRlYml0cyBhIGNvbnN1bWVyLiBEZWJpdCBhdXRob3JpemF0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIG9yYWxseSBvdmVyIHRoZSB0ZWxlcGhvbmUgdmlhIGEgcmVjb3JkZWQgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QUNIQ2xhc3M+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VjX2NvZGVzOiBBcnJheTxBQ0hDbGFzcz47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIENsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvciB3aG9zZSBkb2N1bWVudCB0aGF0IHlvdSB3YW50IHRvIHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmaWxlIHRvIHVwbG9hZC4gVGhlIGZpbGUgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAyME1CLiBTdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zOiAucGRmLlxuICAgICAqIEB0eXBlIHthbnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgZmlsZTogYW55O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRvY3VtZW50UHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBwdXJwb3NlOiBUcmFuc2ZlckRvY3VtZW50UHVycG9zZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogT3JpZ2luYXRvclxcJ3MgZGlsaWdlbmNlIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzIHtcbiAgICBOb3RTdWJtaXR0ZWQgPSAnbm90X3N1Ym1pdHRlZCcsXG4gICAgU3VibWl0dGVkID0gJ3N1Ym1pdHRlZCcsXG4gICAgVW5kZXJSZXZpZXcgPSAndW5kZXJfcmV2aWV3JyxcbiAgICBBcHByb3ZlZCA9ICdhcHByb3ZlZCcsXG4gICAgRGVuaWVkID0gJ2RlbmllZCcsXG4gICAgTW9yZUluZm9ybWF0aW9uUmVxdWlyZWQgPSAnbW9yZV9pbmZvcm1hdGlvbl9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRpbGlnZW5jZSB0aGF0IHlvdSB3YW50IHRvIHN1Ym1pdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfZGlsaWdlbmNlOiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgdXBsb2FkZWQgZmlsZS4gIGBcXFwiRFVFX0RJTElHRU5DRVxcXCJgIC0gVGhlIHRyYW5zZmVyIGR1ZSBkaWxpZ2VuY2UgZG9jdW1lbnQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckRvY3VtZW50UHVycG9zZSB7XG4gICAgRHVlRGlsaWdlbmNlID0gJ0RVRV9ESUxJR0VOQ0UnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC4gSURzIGFyZSBzZXF1ZW50aWFsIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2Zlci4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgYW4gZW1wdHkgc3RyaW5nIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09taXR0YWJsZVRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU/OiBPbWl0dGFibGVUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9hbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaWduZWQgYW1vdW50IG9mIGhvdyBtdWNoIHdhcyBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgIGZvciB0aGlzIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIi01LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHN3ZWVwX2Ftb3VudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNpZ25lZCBhbW91bnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiIG9yIFxcXCItMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfYW1vdW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLiBBIG5vbi1udWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZXZlbnQgaXMgZm9yIHRoZSBhc3NvY2lhdGVkIHJlZnVuZCBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIHRyYW5zZmVyIHRoYXQgdGhpcyBldmVudCBhcHBsaWVzIHRvLiBPbmx5IHByZXNlbnQgaWYgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgcmV0dXJuZWQgYnkgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQsIGZvciB0cmFuc2ZlcnMgY3JlYXRlZCB2aWEgVHJhbnNmZXIgVUkuIEZvciB0cmFuc2ZlcnMgbm90IGNyZWF0ZWQgYnkgVHJhbnNmZXIgVUksIHRoZSB2YWx1ZSBpcyBgbnVsbGAuIFRoaXMgd2lsbCBjdXJyZW50bHkgb25seSBiZSBwb3B1bGF0ZWQgZm9yIFJmUCB0cmFuc2ZlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGludGVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZlZSBhbW91bnQgZGVkdWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgdHJhbnNmZXIgZHVyaW5nIGEgd2lyZSByZXR1cm4sIGlmIGFwcGxpY2FibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHdpcmVfcmV0dXJuX2ZlZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgYGNyZWF0ZWRgIGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGBjcmVhdGVkYCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgYWxsIHRyYW5zYWN0aW9ucyB0by9mcm9tIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl90eXBlPzogVHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBldmVudHMgYnkgZXZlbnQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PFRyYW5zZmVyRXZlbnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvciBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgZXZlbnRzIHRvIGJlIHB1bGxlZCBmcm9tIHRoZSBlbmRwb2ludCB0aGF0IGhhdmUgbm90IGFscmVhZHkgYmVlbiByZXR1cm5lZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IChsYXJnZXN0KSBgZXZlbnRfaWRgIGZldGNoZWQgdmlhIHRoZSBzeW5jIGVuZHBvaW50LCBvciAwIGluaXRpYWxseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBhZnRlcl9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgZXZlbnRzIHRvIGJlIHB1bGxlZCBmcm9tIHRoZSBlbmRwb2ludCB0aGF0IGhhdmUgbm90IGFscmVhZHkgYmVlbiByZXR1cm5lZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgdGhpcyB0cmFuc2ZlciByZXByZXNlbnRzLiBFdmVudCB0eXBlcyB3aXRoIHByZWZpeCBgc3dlZXBgIHJlcHJlc2VudCBldmVudHMgZm9yIFBsYWlkIExlZGdlciBzd2VlcHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGBzZXR0bGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gIGBmdW5kc19hdmFpbGFibGVgOiBGdW5kcyBmcm9tIHRoZSB0cmFuc2ZlciBoYXZlIGJlZW4gcmVsZWFzZWQgZnJvbSBob2xkIGFuZCBhcHBsaWVkIHRvIHRoZSBsZWRnZXJcXCdzIGF2YWlsYWJsZSBiYWxhbmNlLiAoT25seSBhcHBsaWNhYmxlIHRvIEFDSCBkZWJpdHMuKSAgYGd1YXJhbnRlZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gZnVsbHkgZ3VhcmFudGVlZCBieSBQbGFpZC4gIGByZXR1cm5lZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXR1cm5lZC4gIGBndWFyYW50ZWVfcmVpbWJ1cnNlZGA6IFBsYWlkIHJlaW1idXJzZWQgdGhlIGNsaWVudCBmb3IgdGhlIGxvc3Mgb24gYSByZXR1cm5lZCBndWFyYW50ZWVkIHRyYW5zZmVyLiBUaGUgYGV2ZW50X2Ftb3VudGAgaXMgdGhlIHJlaW1idXJzZWQgYW1vdW50LiAgYGNsaWVudF9yZXR1cm5fcmVjb3ZlcmVkYDogVGhlIGNsaWVudCByZXBvcnRlZCByZWNvdmVyaW5nIHRoZSBsb3NzIG9uIGEgcmV0dXJuZWQgdHJhbnNmZXIgdmlhIGAvdHJhbnNmZXIvcmV0dXJuL3JlY292ZXJgLCBhbmQgUGxhaWQgZGViaXRlZCB0aGUgcmVjb3ZlcmVkIGFtb3VudCBmcm9tIHRoZSBjbGllbnRcXCdzIGxlZGdlci4gVGhlIGBldmVudF9hbW91bnRgIGlzIHRoZSByZWNvdmVyZWQgYW1vdW50LiAgYHBsYWlkX3JldHVybl9yZWNvdmVyZWRgOiBQbGFpZCByZWNvdmVyZWQgdGhlIGxvc3Mgb24gYSByZXR1cm5lZCB0cmFuc2ZlciBieSBzdWNjZXNzZnVsbHkgcmVpbml0aWF0aW5nIGl0LiBUaGUgYGV2ZW50X2Ftb3VudGAgaXMgdGhlIHJlY292ZXJlZCBhbW91bnQuIENsaWVudCBzaG91bGQgc3RvcCB0aGVpciByZXR1cm4gcmVjb3ZlcnkgZWZmb3J0LiAgYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlcHRfc2V0dGxlZGA6IENyZWRpdHMgYXJlIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gb3IgZGViaXRzIGhhdmUgYmVlbiBkZWR1Y3RlZCBmcm9tIHRoZSBjdXN0b21lclxcJ3MgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudC4gIGByZXR1cm5fc3dlcHRgOiBEdWUgdG8gdGhlIHRyYW5zZmVyIGJlaW5nIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBmcm9tIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiAgYHN3ZWVwLnBlbmRpbmdgOiBBIG5ldyBsZWRnZXIgc3dlZXAgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHN3ZWVwLnBvc3RlZGA6IFRoZSBsZWRnZXIgc3dlZXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHN3ZWVwLnNldHRsZWRgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIGZ1bmRpbmcgYWNjb3VudC4gVGhpcyBtZWFucyB0aGF0IGZ1bmRzIHdpdGhkcmF3biBmcm9tIFBsYWlkIExlZGdlciBiYWxhbmNlIGhhdmUgcmVhY2hlZCB0aGUgZnVuZGluZyBhY2NvdW50LCBvciBmdW5kcyB0byBiZSBkZXBvc2l0ZWQgaW50byB0aGUgUGxhaWQgTGVkZ2VyIEJhbGFuY2UgaGF2ZSBiZWVuIHB1bGxlZCwgYW5kIHRoZSBob2xkIHBlcmlvZCBoYXMgYmVndW4uICBgc3dlZXAucmV0dXJuZWRgOiBBIHBvc3RlZCBsZWRnZXIgc3dlZXAgd2FzIHJldHVybmVkLiAgYHN3ZWVwLmZhaWxlZGA6IFRoZSBsZWRnZXIgc3dlZXAgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHN3ZWVwLmZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIGxlZGdlciBzd2VlcCBoYXZlIGJlZW4gcmVsZWFzZWQgZnJvbSBob2xkIGFuZCBhcHBsaWVkIHRvIHRoZSBsZWRnZXJcXCdzIGF2YWlsYWJsZSBiYWxhbmNlLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBkZWJpdHMuICBgcmVmdW5kLnBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHJlZnVuZC5jYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQuICBgcmVmdW5kLmZhaWxlZGA6IFRoZSByZWZ1bmQgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHJlZnVuZC5wb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZWZ1bmQuc2V0dGxlZGA6IFRoZSByZWZ1bmQgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiAgYHJlZnVuZC5yZXR1cm5lZGA6IEEgcG9zdGVkIHJlZnVuZCB3YXMgcmV0dXJuZWQuICBgcmVmdW5kLnN3ZXB0YDogVGhlIHJlZnVuZCB3YXMgc3dlcHQgZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGByZWZ1bmQucmV0dXJuX3N3ZXB0YDogRHVlIHRvIHRoZSByZWZ1bmQgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIEZ1bmRzQXZhaWxhYmxlID0gJ2Z1bmRzX2F2YWlsYWJsZScsXG4gICAgR3VhcmFudGVlZCA9ICdndWFyYW50ZWVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgR3VhcmFudGVlUmVpbWJ1cnNlZCA9ICdndWFyYW50ZWVfcmVpbWJ1cnNlZCcsXG4gICAgQ2xpZW50UmV0dXJuUmVjb3ZlcmVkID0gJ2NsaWVudF9yZXR1cm5fcmVjb3ZlcmVkJyxcbiAgICBQbGFpZFJldHVyblJlY292ZXJlZCA9ICdwbGFpZF9yZXR1cm5fcmVjb3ZlcmVkJyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCcsXG4gICAgU3dlZXBQZW5kaW5nID0gJ3N3ZWVwLnBlbmRpbmcnLFxuICAgIFN3ZWVwUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU3dlZXBTZXR0bGVkID0gJ3N3ZWVwLnNldHRsZWQnLFxuICAgIFN3ZWVwUmV0dXJuZWQgPSAnc3dlZXAucmV0dXJuZWQnLFxuICAgIFN3ZWVwRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCcsXG4gICAgU3dlZXBGdW5kc0F2YWlsYWJsZSA9ICdzd2VlcC5mdW5kc19hdmFpbGFibGUnLFxuICAgIFJlZnVuZFBlbmRpbmcgPSAncmVmdW5kLnBlbmRpbmcnLFxuICAgIFJlZnVuZENhbmNlbGxlZCA9ICdyZWZ1bmQuY2FuY2VsbGVkJyxcbiAgICBSZWZ1bmRGYWlsZWQgPSAncmVmdW5kLmZhaWxlZCcsXG4gICAgUmVmdW5kUG9zdGVkID0gJ3JlZnVuZC5wb3N0ZWQnLFxuICAgIFJlZnVuZFNldHRsZWQgPSAncmVmdW5kLnNldHRsZWQnLFxuICAgIFJlZnVuZFJldHVybmVkID0gJ3JlZnVuZC5yZXR1cm5lZCcsXG4gICAgUmVmdW5kU3dlcHQgPSAncmVmdW5kLnN3ZXB0JyxcbiAgICBSZWZ1bmRSZXR1cm5Td2VwdCA9ICdyZWZ1bmQucmV0dXJuX3N3ZXB0J1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zZmVyIGV2ZW50cyBhcmUgYXZhaWxhYmxlLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC90cmFuc2Zlci9ldmVudC9zeW5jYC4gSWYgbXVsdGlwbGUgdHJhbnNmZXIgZXZlbnRzIG9jY3VyIHdpdGhpbiBhIHNpbmdsZSBtaW51dGUsIG9ubHkgb25lIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCwgc28gYSBzaW5nbGUgd2ViaG9vayBpbnN0YW5jZSBtYXkgY29ycmVzcG9uZCB0byBtdWx0aXBsZSB0cmFuc2ZlciBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlZmluZXMgYW4gZXhwZWN0ZWQgc3dlZXAgZGF0ZSBhbmQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZW1lbnQgZGF0ZSBvZiBhIHN3ZWVwIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBzd2VlcF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjdW11bGF0ZWQgYW1vdW50IHRoYXQgaGFzIGJlZW4gc3dlcHQgYnkgYHN3ZWVwX3NldHRsZW1lbnRfZGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIHN3ZXB0X3NldHRsZWRfYW1vdW50OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgZXZlbnQgdHlwZSBmb3IgYSB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV0dXJuZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRmFpbHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRmFpbHVyZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZhaWx1cmUgY29kZSwgZS5nLiBgUjAxYC4gIEEgZmFpbHVyZSBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBTZWUgW0FDSCByZXR1cm4gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2RlcyBhbmQgW1JUUC9SZlAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHByZnAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBmdW5kaW5nIGFjY291bnQsIGxpbmtlZCB3aXRoIFBsYWlkIExpbmsgb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBmdW5kaW5nIGFjY291bnQsIGxpbmtlZCB3aXRoIFBsYWlkIExpbmsgb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50V2l0aERpc3BsYXlOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRXaXRoRGlzcGxheU5hbWVcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRXaXRoRGlzcGxheU5hbWVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgZm9yIHRoZSBmdW5kaW5nIGFjY291bnQgdGhhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50V2l0aERpc3BsYXlOYW1lXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBmb3IgdGhlIGZ1bmRpbmcgYWNjb3VudCB0aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRXaXRoRGlzcGxheU5hbWVBbGxPZlxuICAgICAqL1xuICAgIGRpc3BsYXlfbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQWRhcHRpdmUgZ3VhcmFudGVlIGRldGFpbHMgZm9yIGEgdHJhbnNmZXIsIGluY2x1ZGluZyB0aGUgZ3VhcmFudGVlZCBhbW91bnQgYW5kIHNldHRsZW1lbnQgc2NoZWR1bGUuIE9taXR0ZWQgd2hlbiBubyBndWFyYW50ZWUgd2FzIGF0dGVtcHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHdWFyYW50ZWVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHdWFyYW50ZWVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGN1cnJlbnRseSBjb3ZlcmVkIGJ5IFBsYWlkXFwncyBndWFyYW50ZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhcyBzY2hlZHVsZWQgdHJhbmNoZXMgcmVhY2ggdGhlaXIgb2JzZXJ2YXRpb24gd2luZG93IGV4cGlyYXRpb24gYW5kIGJlY29tZSBndWFyYW50ZWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR3VhcmFudGVlRGV0YWlsc1xuICAgICAqL1xuICAgIGd1YXJhbnRlZWRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFkYXB0aXZlIGd1YXJhbnRlZSBzZXR0bGVtZW50IHNjaGVkdWxlIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR3VhcmFudGVlRGV0YWlsc1xuICAgICAqL1xuICAgIHNjaGVkdWxlOiBBcnJheTxUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbT47XG59XG4vKipcbiAqIFRoZSBhZGFwdGl2ZSBndWFyYW50ZWUgb3V0Y29tZSBmb3IgYSB0cmFuc2Zlci4gIGBGVUxMX0lOU1RBTlRgOiBUaGUgZnVsbCB0cmFuc2ZlciBhbW91bnQgaXMgZ3VhcmFudGVlZCBhbmQgZnVuZHMgYXJlIGF2YWlsYWJsZSBpbnN0YW50bHkuICBgUEFSVElBTF9JTlNUQU5UX09OTFlgOiBBIHBhcnRpYWwgYW1vdW50IGlzIGd1YXJhbnRlZWQgYW5kIGF2YWlsYWJsZSBpbnN0YW50bHk7IHRoZSByZW1haW5kZXIgaXMgbm90IGd1YXJhbnRlZWQuICBgUEFSVElBTF9JTlNUQU5UX1dJVEhfT0JTRVJWQVRJT05fV0lORE9XYDogQSBwYXJ0aWFsIGFtb3VudCBpcyBndWFyYW50ZWVkIGluc3RhbnRseTsgYW4gYWRkaXRpb25hbCBhbW91bnQgaXMgY29uZGl0aW9uYWxseSBndWFyYW50ZWVkIHN1YmplY3QgdG8gYW4gb2JzZXJ2YXRpb24gd2luZG93LiAgYE5PVF9HVUFSQU5URUVEYDogUGxhaWQgZGlkIG5vdCBwcm92aWRlIGEgZ3VhcmFudGVlIGZvciB0aGlzIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJHdWFyYW50ZWVPdXRjb21lIHtcbiAgICBGdWxsSW5zdGFudCA9ICdGVUxMX0lOU1RBTlQnLFxuICAgIFBhcnRpYWxJbnN0YW50T25seSA9ICdQQVJUSUFMX0lOU1RBTlRfT05MWScsXG4gICAgUGFydGlhbEluc3RhbnRXaXRoT2JzZXJ2YXRpb25XaW5kb3cgPSAnUEFSVElBTF9JTlNUQU5UX1dJVEhfT0JTRVJWQVRJT05fV0lORE9XJyxcbiAgICBOb3RHdWFyYW50ZWVkID0gJ05PVF9HVUFSQU5URUVEJ1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBhZGFwdGl2ZSBndWFyYW50ZWUgc2V0dGxlbWVudCBzY2hlZHVsZSwgZGVzY3JpYmluZyBvbmUgdHJhbmNoZSBvZiBndWFyYW50ZWVkIGZ1bmRzLiBBZGRzIGBvYnNlcnZhdGlvbl93aW5kb3dfZXhwaXJhdGlvbl90aW1lYCwgd2hpY2ggaXMgb25seSBrbm93biBvbmNlIGEgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHdWFyYW50ZWVTY2hlZHVsZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGd1YXJhbnRlZWQgYW1vdW50IGZvciB0aGlzIHNjaGVkdWxlIGVudHJ5IChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHdWFyYW50ZWVTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJ1c2luZXNzIGRheXMgaW4gdGhlIG9ic2VydmF0aW9uIHdpbmRvdyBmb3IgdGhpcyB0cmFuY2hlLiBgMGAgd2hlbiB0aGUgdHJhbmNoZSBpcyBub3Qgc3ViamVjdCB0byBhbiBvYnNlcnZhdGlvbiB3aW5kb3cuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHdWFyYW50ZWVTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBvYnNlcnZhdGlvbl93aW5kb3dfYnVzaW5lc3NfZGF5czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBvYnNlcnZhdGlvbiB3aW5kb3cgZm9yIHRoaXMgdHJhbmNoZSBleHBpcmVzLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgdHJhbmNoZSBpcyBzdWJqZWN0IHRvIGFuIG9ic2VydmF0aW9uIHdpbmRvdy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHdWFyYW50ZWVTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBvYnNlcnZhdGlvbl93aW5kb3dfZXhwaXJhdGlvbl90aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR3VhcmFudGVlU2NoZWR1bGVJdGVtQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckd1YXJhbnRlZVNjaGVkdWxlSXRlbUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgb2JzZXJ2YXRpb24gd2luZG93IGZvciB0aGlzIHRyYW5jaGUgZXhwaXJlcy4gUHJlc2VudCBvbmx5IHdoZW4gdGhlIHRyYW5jaGUgaXMgc3ViamVjdCB0byBhbiBvYnNlcnZhdGlvbiB3aW5kb3cuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR3VhcmFudGVlU2NoZWR1bGVJdGVtQWxsT2ZcbiAgICAgKi9cbiAgICBvYnNlcnZhdGlvbl93aW5kb3dfZXhwaXJhdGlvbl90aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogIEEgZGVjaXNpb24gcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci4gIGBBUFBST1ZFRGAgLSBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIHJlLWF1dGhlbnRpY2F0ZSB5b3VyIHVzZXIgd2hlbiBgZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCkuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBERUNMSU5FRGAgLSBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50QXV0aG9yaXphdGlvbkRlY2lzaW9uIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGUge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmV0dXJuZWQgb25seSBpZiBgYWNjb3VudF9pZGAgd2FzIHNldCBvbiBpbnRlbnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiAxNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSB0cmFuc2ZlciByZXF1aXJlcyBhIGBHVUFSQU5URUVEYCBkZWNpc2lvbiBieSBQbGFpZCB0byBwcm9jZWVkIChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIHJlcXVpcmVfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIGZsb3cgb2YgdHJhbnNmZXIgZnVuZHMuICBgUEFZTUVOVGA6IFRyYW5zZmVycyBmdW5kcyBmcm9tIGFuIGVuZCB1c2VyXFwncyBhY2NvdW50IHRvIHlvdXIgYnVzaW5lc3MgYWNjb3VudC4gIGBESVNCVVJTRU1FTlRgOiBUcmFuc2ZlcnMgZnVuZHMgZnJvbSB5b3VyIGJ1c2luZXNzIGFjY291bnQgdG8gYW4gZW5kIHVzZXJcXCdzIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudENyZWF0ZU1vZGUge1xuICAgIFBheW1lbnQgPSAnUEFZTUVOVCcsXG4gICAgRGlzYnVyc2VtZW50ID0gJ0RJU0JVUlNFTUVOVCdcbn1cblxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuIERlZmF1bHRzIHRvIGBzYW1lLWRheS1hY2hgLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgdXNpbmcgYGFjaGAsIHRoZSBTdGFuZGFyZCBBQ0ggY3V0b2ZmIGlzIDg6MzAgUE0gRWFzdGVybiBUaW1lLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgdXNpbmcgYHNhbWUtZGF5LWFjaGAsIHRoZSBTYW1lIERheSBBQ0ggY3V0b2ZmIGlzIDM6MDAgUE0gRWFzdGVybiBUaW1lLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZW5kIHRoZSByZXF1ZXN0IDE1IG1pbnV0ZXMgcHJpb3IgdG8gdGhlIGN1dG9mZiB0byBlbnN1cmUgdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBpbiB0aW1lIGZvciBzdWJtaXNzaW9uIGJlZm9yZSB0aGUgY3V0b2ZmLiBJZiB0aGUgdHJhbnNmZXIgaXMgcHJvY2Vzc2VkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIFN0YW5kYXJkIEFDSCBjdXRvZmYsIGl0IHdpbGwgYmUgc2VudCBvdmVyIFN0YW5kYXJkIEFDSCByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlcy4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBydHBgLCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhY2NvdW50IGJlaW5nIGNyZWRpdGVkIGRvZXMgbm90IHN1cHBvcnQgUlRQLCB0aGUgdHJhbnNmZXIgd2lsbCBiZSBzZW50IG92ZXIgQUNIIGFzIGxvbmcgYXMgYW4gYGFjaF9jbGFzc2AgaXMgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QuIElmIFJUUCBpc25cXCd0IHN1cHBvcnRlZCBieSB0aGUgYWNjb3VudCBhbmQgbm8gYGFjaF9jbGFzc2AgaXMgcHJvdmlkZWQsIHRoZSB0cmFuc2ZlciB3aWxsIGZhaWwgdG8gYmUgc3VibWl0dGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50Q3JlYXRlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJldHVybmVkIG9ubHkgaWYgYGFjY291bnRfaWRgIHdhcyBzZXQgb24gaW50ZW50IGNyZWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSByZWFzb24gZm9yIGEgZmFpbGVkIHRyYW5zZmVyIGludGVudC4gUmV0dXJuZWQgb25seSBpZiB0aGUgdHJhbnNmZXIgaW50ZW50IHN0YXR1cyBpcyBgZmFpbGVkYC4gTnVsbCBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbiB7XG4gICAgLyoqXG4gICAgICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByZWFzb24gZm9yIGEgZmFpbGVkIHRyYW5zZmVyIGludGVudCAoaS5lLiwgYW4gQVBJIGVycm9yIG9yIHRoZSBhdXRob3JpemF0aW9uIGJlaW5nIGRlY2xpbmVkKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgYXNzb2NpYXRlZCB3aXRoIGEgZmFpbGVkIHRyYW5zZmVyIGludGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50R2V0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50OiBUcmFuc2ZlckludGVudEdldDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIgaW50ZW50LiAgYFBFTkRJTkdgOiBUaGUgdHJhbnNmZXIgaW50ZW50IGlzIHBlbmRpbmcuIGBTVUNDRUVERURgOiBUaGUgdHJhbnNmZXIgaW50ZW50IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gYEZBSUxFRGA6IFRoZSB0cmFuc2ZlciBpbnRlbnQgd2FzIHVuYWJsZSB0byBiZSBjcmVhdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAnUEVORElORycsXG4gICAgU3VjY2VlZGVkID0gJ1NVQ0NFRURFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoaXMgYmFsYW5jZSBhdmFpbGFibGUgZm9yIHVzZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgcGVuZGluZyBmdW5kcyB0aGF0IGFyZSBpbiBwcm9jZXNzaW5nIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJCYWxhbmNlXG4gICAgICovXG4gICAgcGVuZGluZzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGN1c3RvbWVyIHRoYXQgb3ducyB0aGUgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgaXMgc28gUGxhaWQga25vd3Mgd2hpY2ggb2YgeW91ciBjdXN0b21lcnMgdG8gcGF5IG91dCB0byBvciBjb2xsZWN0IGZ1bmRzIGZyb20uIE9ubHkgYXBwbGljYWJsZSBmb3IgW1BsYXRmb3JtIGN1c3RvbWVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS4gRG8gbm90IGluY2x1ZGUgaWYgeW91XFwncmUgcGF5aW5nIG91dCB0byB5b3Vyc2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgdGhlIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBMZWRnZXIgd2lsbCBiZSB1c2VkLiBJZiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgIGlzIHNwZWNpZmllZCwgdGhlIGBmdW5kaW5nX2FjY291bnRfaWRgIG11c3QgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGxlZGdlciBiYWxhbmNlIHRvIGRlcG9zaXQgdG8uIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGxlZGdlcl9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBvc2l0aXZlIGFtb3VudCBvZiBob3cgbXVjaCB3aWxsIGJlIGRlcG9zaXRlZCBpbnRvIGxlZGdlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCI1LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciBkZXBvc2l0LiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgdGhlIHJlcXVlc3Qgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgZGVwb3NpdCBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBQ0hOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJBQ0hOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExlZGdlciB0byBwdWxsIG1vbmV5IGZyb20uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyb21fbGVkZ2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExlZGdlciB0byBjcmVkaXQgbW9uZXkgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRvX2xlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gbW92ZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIGRpc3RyaWJ1dGUuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgZGlzdHJpYnV0ZSBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBkaXN0cmlidXRlIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgbGVkZ2VyIGRpc3RyaWJ1dGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBsZWRnZXIgZXZlbnQgaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgbGVkZ2VyIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICBsZWRnZXJfZXZlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGxlZGdlciB0aGlzIGV2ZW50IGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudFxuICAgICAqL1xuICAgIGxlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxlZGdlciBldmVudCBhcyBhIGRlY2ltYWwgc3RyaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRyYW5zZmVyIHNvdXJjZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGxlZGdlciBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVmdW5kIHNvdXJjZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGxlZGdlciBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHN3ZWVwIHNvdXJjZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGxlZGdlciBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGxlZGdlciBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHBlbmRpbmcgYmFsYW5jZSBhZnRlciB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICBwZW5kaW5nX2JhbGFuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IGF2YWlsYWJsZSBiYWxhbmNlIGFmdGVyIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudFxuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFsYW5jZSB0aGF0IHdhcyBpbXBhY3RlZCBieSB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBsZWRnZXIgZXZlbnQgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVyIGV2ZW50cyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC4gKFRoaXMgZmllbGQgaXMgc3BlY2lmaWNhbGx5IGZvciByZXNlbGxlcnMuIENhbGxlclxcJ3MgY2xpZW50IElEIHdpbGwgYmUgdXNlZCBpZiB0aGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQuKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGNyZWF0ZWQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiAyMDE5LTEyLTA2VDIyOjM1OjQ5WilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGNyZWF0ZWQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiAyMDE5LTEyLTA2VDIyOjM1OjQ5WilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIFBsYWlkIExlZGdlciBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbGVkZ2VyIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9ldmVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xlZGdlckV2ZW50U291cmNlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc291cmNlX3R5cGU/OiBMZWRnZXJFdmVudFNvdXJjZVR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlciwgc3dlZXAsIG9yIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzb3VyY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyTGVkZ2VyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbGVkZ2VyX2V2ZW50czogQXJyYXk8VHJhbnNmZXJMZWRnZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgbW9yZSBldmVudHMgdG8gYmUgcHVsbGVkIGZyb20gdGhlIGVuZHBvaW50IHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldHVybmVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggbGVkZ2VyIGJhbGFuY2UgdG8gZ2V0LiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBMZWRnZXIgdGhhdCB3YXMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckxlZGdlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIExlZGdlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIExlZGdlciBpcyB0aGUgY2xpZW50XFwncyBkZWZhdWx0IGxlZGdlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2RlZmF1bHQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBsZWRnZXIgc3dlZXAgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAucG9zdGVkYCAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAuZmFpbGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5zZXR0bGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgIGBzd2VlcC5zZXR0bGVkYCAtLT4gYHN3ZWVwLnJldHVybmVkYCBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZSB7XG4gICAgUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdzd2VlcC5yZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgY3VzdG9tZXIgdGhhdCBvd25zIHRoZSBMZWRnZXIgYmFsYW5jZS4gVGhpcyBpcyBzbyBQbGFpZCBrbm93cyB3aGljaCBvZiB5b3VyIGN1c3RvbWVycyB0byBwYXkgb3V0IHRvIG9yIGNvbGxlY3QgZnVuZHMgZnJvbS4gT25seSBhcHBsaWNhYmxlIGZvciBbUGxhdGZvcm0gY3VzdG9tZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLiBEbyBub3QgaW5jbHVkZSBpZiB5b3VcXCdyZSBwYXlpbmcgb3V0IHRvIHlvdXJzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgdGhlIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBMZWRnZXIgd2lsbCBiZSB1c2VkLiBJZiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgIGlzIHNwZWNpZmllZCwgdGhlIGBmdW5kaW5nX2FjY291bnRfaWRgIG11c3QgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhlIGxlZGdlciBiYWxhbmNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgd2l0aGRyYXcuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgd2l0aGRyYXcgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGBjcmVhdGVkYCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJzOiBBcnJheTxUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyBhdXRob3JpemF0aW9uIHVzYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYWlseSBjcmVkaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBkYWlseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhaWx5IGRlYml0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgZGFpbHlfZGViaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgY3JlZGl0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgbW9udGhseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgZGViaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBtb250aGx5X2RlYml0X3V0aWxpemF0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYWlseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgYW5kIGRlYml0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1vbnRobHlfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfZGViaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb250aGx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXR1cm5fcmF0ZXM/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTWV0cmljc0dldEF1dGhvcml6YXRpb25Vc2FnZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX3VzYWdlPzogVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgcmV0dXJuIHJhdGVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzXG4gICAgICovXG4gICAgbGFzdF82MGQ/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHJldHVybiByYXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB7XG4gICAgLyoqXG4gICAgICogVGhlIG92ZXJhbGwgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICBvdmVyYWxsX3JldHVybl9yYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmF1dGhvcml6ZWQgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFkbWluaXN0cmF0aXZlIHJldHVybiByYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsXG4gICAgICovXG4gICAgYWRtaW5pc3RyYXRpdmVfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGlzIHRoZSBBQkEgbnVtYmVyOyBmb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBBQ0ggbnVtYmVyIHVzZWQgaW4gYHJvdXRpbmdfbnVtYmVyYC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCBmb3IgdGhlIGNyZWF0ZWQgaXRlbSB0byBiZSBlbGlnaWJsZSBmb3Igd2lyZSB0cmFuc2ZlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBiYW5rIGFjY291bnQgKGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCwgdGhlIFN0YW5kYXJkIEFDSCBjdXRvZmYgaXMgODozMCBQTSBFYXN0ZXJuIFRpbWUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgc2FtZS1kYXktYWNoYCwgdGhlIFNhbWUgRGF5IEFDSCBjdXRvZmYgaXMgMzowMCBQTSBFYXN0ZXJuIFRpbWUuICBJdCBpcyByZWNvbW1lbmRlZCB0byBzZW5kIHRoZSByZXF1ZXN0IDE1IG1pbnV0ZXMgcHJpb3IgdG8gdGhlIGN1dG9mZiB0byBlbnN1cmUgdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBpbiB0aW1lIGZvciBzdWJtaXNzaW9uIGJlZm9yZSB0aGUgY3V0b2ZmLiBJZiB0aGUgdHJhbnNmZXIgaXMgcHJvY2Vzc2VkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIFN0YW5kYXJkIEFDSCBjdXRvZmYsIGl0IHdpbGwgYmUgc2VudCBvdmVyIFN0YW5kYXJkIEFDSCByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlczsgdGhpcyB3aWxsIGFwcGx5IHRvIGJvdGggbGVncyBvZiB0aGUgdHJhbnNmZXIgaWYgYXBwbGljYWJsZS4gVGhlIHRyYW5zYWN0aW9uIGxpbWl0IGZvciBhIFNhbWUgRGF5IEFDSCB0cmFuc2ZlciBpcyAkMSwwMDAsMDAwLiBBdXRob3JpemF0aW9uIHJlcXVlc3RzIHNlbnQgd2l0aCBhbiBhbW91bnQgZ3JlYXRlciB0aGFuICQxLDAwMCwwMDAgd2lsbCBmYWlsLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYHJ0cGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSByb3V0ZSBiZXR3ZWVuIHRoZSBSZWFsLVRpbWUgUGF5bWVudHMgKFJUUCkgcmFpbCBieSBUQ0ggb3IgRmVkTm93IHJhaWxzIGFzIG5lY2Vzc2FyeS4gSWYgYSB0cmFuc2ZlciBpcyBzdWJtaXR0ZWQgYXMgYHJ0cGAgYW5kIHRoZSBjb3VudGVycGFydHkgYWNjb3VudCBpcyBub3QgZWxpZ2libGUgZm9yIFJUUCwgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHJlcXVlc3Qgd2lsbCBmYWlsIHdpdGggYW4gYElOVkFMSURfRklFTERgIGVycm9yIGNvZGUuIFRvIHByZS1jaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvdW50ZXJwYXJ0eSBhY2NvdW50IGNhbiBzdXBwb3J0IFJUUCwgY2FsbCBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGJlZm9yZSBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLiAgV2lyZSB0cmFuc2ZlcnMgYXJlIGN1cnJlbnRseSBpbiBlYXJseSBhdmFpbGFiaWxpdHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIGB3aXJlYCBhcyBhIHBheW1lbnQgbmV0d29yaywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci4gRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYHdpcmVgLCB0aGUgYHR5cGVgIG11c3QgYmUgYGNyZWRpdGA7IHdpcmUgZGViaXRzIGFyZSBub3Qgc3VwcG9ydGVkLiBUaGUgY3V0b2ZmIHRvIHN1Ym1pdCBhIHdpcmUgcGF5bWVudCBpcyA2OjMwIFBNIEVhc3Rlcm4gVGltZSBvbiBhIGJ1c2luZXNzIGRheTsgd2lyZXMgc3VibWl0dGVkIGFmdGVyIHRoYXQgdGltZSB3aWxsIGJlIHByb2Nlc3NlZCBvbiB0aGUgbmV4dCBidXNpbmVzcyBkYXkuIFRoZSB0cmFuc2FjdGlvbiBsaW1pdCBmb3IgYSB3aXJlIGlzICQ5OTksOTk5Ljk5LiBBdXRob3JpemF0aW9uIHJlcXVlc3RzIHNlbnQgd2l0aCBhbiBhbW91bnQgZ3JlYXRlciB0aGFuICQ5OTksOTk5Ljk5IHdpbGwgZmFpbC4gIFN1cHBvcnQgZm9yIGByZnBgIChyZXF1ZXN0IGZvciBwYXltZW50KSBpcyBjdXJyZW50bHkgaW4gY2xvc2VkIGJldGEuIFRvIGxlYXJuIG1vcmUsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGByZnBgLCB0aGUgYHR5cGVgIG11c3QgYmUgYGRlYml0YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFJ0cCA9ICdydHAnLFxuICAgIFdpcmUgPSAnd2lyZScsXG4gICAgUmZwID0gJ3JmcCdcbn1cblxuLyoqXG4gKiBUaGUgb3JpZ2luYXRvclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHdvLWxldHRlciBjb2RlIGZvciB0aGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnlfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIgYmVpbmcgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwdWJsaWMtZmFjaW5nIHN1cmZhY2VzLCBlLmcuIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yLiBUaGlzIGlkZW50aWZpZXIgd2lsbCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIGFuZCBzaG91bGQgYmUgc3RvcmVkIGFzc29jaWF0ZWQgd2l0aCBlbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYXRvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBkYmE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IElEIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIHRheF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgY3JlZGl0X3VzYWdlX2NvbmZpZ3VyYXRpb24/OiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGRlYml0X3VzYWdlX2NvbmZpZ3VyYXRpb24/OiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgYWRkcmVzczogVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE5BSUNTIGNvZGUgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgbmFpY3NfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZ1bmRpbmdBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnQ6IFRyYW5zZmVyRnVuZGluZ0FjY291bnQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGdW5kaW5nQWNjb3VudFdpdGhEaXNwbGF5TmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50OiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50V2l0aERpc3BsYXlOYW1lO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGdW5kaW5nQWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50OiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyIChpLmUuIHRoZSBvcmlnaW5hdG9yKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGV0YWlsZWRPcmlnaW5hdG9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3I6IERldGFpbGVkT3JpZ2luYXRvcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG9yaWdpbmF0b3JzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG9yaWdpbmF0b3JzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3JpZ2luYXRvcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JzOiBBcnJheTxPcmlnaW5hdG9yPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gb25ib2FyZGluZyBvcmlnaW5hdG9yIGhhcyBiZWVuIHVwZGF0ZWQuIENhbGwgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgdG8gY2hlY2sgdGhlIGxhdGVzdCBzdGF0dXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIlRSQU5TRkVSXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgXFxcIlBMQVRGT1JNX09OQk9BUkRJTkdfVVBEQVRFXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0b3NfYWNjZXB0YW5jZV9tZXRhZGF0YTogVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBJU084NjAxIHRpbWVzdGFtcCBpbmRpY2F0aW5nIHRoZSBtb3N0IHJlY2VudCB0aW1lIHRoZSBwbGF0Zm9ybSBjb2xsZWN0ZWQgb25ib2FyZGluZyBkYXRhIGZyb20gdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX3Jldmlld2VkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgVVJMIHRvIHdoaWNoIGEgYFBMQVRGT1JNX09OQk9BUkRJTkdfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3Mgb2YgYSBwZXJzb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5hbWU/OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZTtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC4gUGhvbmUgbnVtYmVyIGlucHV0IG1heSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgYmlydGggb2YgdGhlIHBlcnNvbi4gRm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIHBlcnNvbiBhbmQgdGhlIG9yaWdpbmF0b3IgdGhleSBhcmUgcmVsYXRlZCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF0aW9uc2hpcF90b19vcmlnaW5hdG9yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIG93bmVyc2hpcCB0aGlzIHBlcnNvbiBoYXMgaW4gdGhlIG9uYm9hcmRpbmcgYnVzaW5lc3MuIE9ubHkgYXBwbGljYWJsZSB0byBiZW5lZmljaWFsIG93bmVycyB3aXRoIDI1JSBvciBtb3JlIG93bmVyc2hpcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG93bmVyc2hpcF9wZXJjZW50YWdlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgcGVyc29uIGF0IHRoZSBidXNpbmVzcy4gT25seSBhcHBsaWNhYmxlIHRvIGNvbnRyb2wgcGVyc29ucyAtIGZvciBleGFtcGxlLCBcXFwiQ0VPXFxcIiwgXFxcIlByZXNpZGVudFxcXCIsIFxcXCJPd25lclxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRpdGxlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElEIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBzdWJtaXR0aW5nIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBlcnNvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwZXJzb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogSUQgbnVtYmVyIG9mIHRoZSBwZXJzb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiB0aGUgcGVyc29uXFwncyBJRCBOdW1iZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVGhlIHBlcnNvblxcJ3MgbGVnYWwgbmFtZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHBpZWNlIG9mIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIG9yaWdpbmF0b3Igb25ib2FyZGluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRcbiAgICAgKi9cbiAgICByZXF1aXJlbWVudF90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVVSUQgb2YgdGhlIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVpcmVtZW50LiBPbmx5IHByZXNlbnQgZm9yIGluZGl2aWR1YWwtc2NvcGVkIHJlcXVpcmVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRcbiAgICAgKi9cbiAgICBwZXJzb25faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNpbmdsZSByZXF1aXJlbWVudCBzdWJtaXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByZXF1aXJlbWVudCBiZWluZyBzdWJtaXR0ZWQuIFNlZSBbUmVxdWlyZW1lbnQgdHlwZSBzY2hlbWEgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xTkVRa1REMHNWSzUwaUFRaTZ4SGlncmV4RFV4WjRReFhxU0VmVl9GRlRpVS8pIGZvciBhIGxpc3Qgb2YgcmVxdWlyZW1lbnQgdHlwZXMgYW5kIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uXG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZW1lbnQsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhbiBvYmplY3QgZGVwZW5kaW5nIG9uIHRoZSBgcmVxdWlyZW1lbnRfdHlwZWAuIElmIGl0IGlzIGFuIG9iamVjdCwgdGhlIG9iamVjdCBzaG91bGQgYmUgSlNPTiBtYXJzaGFsZWQgaW50byBhIHN0cmluZy4gU2VlIFtSZXF1aXJlbWVudCB0eXBlIHNjaGVtYSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFORVFrVEQwc1ZLNTBpQVFpNnhIaWdyZXhEVXhaNFF4WHFTRWZWX0ZGVGlVLykgZm9yIGEgbGlzdCBvZiByZXF1aXJlbWVudCB0eXBlcyBhbmQgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGVyc29uX2lkYCBvZiB0aGUgcGVyc29uIHRoZSByZXF1aXJlbWVudCBzdWJtaXNzaW9uIGlzIHJlbGF0ZWQgdG8uIEEgYHBlcnNvbl9pZGAgaXMgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYC4gVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGZvciByZXF1aXJlbWVudHMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gYSBwZXJzb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvblxuICAgICAqL1xuICAgIHBlcnNvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgYSBsaXN0IG9mIHJlcXVpcmVtZW50IHN1Ym1pc3Npb25zIHRoYXQgYWxsIHJlbGF0ZSB0byB0aGUgb3JpZ2luYXRvci4gTXVzdCBjb250YWluIGJldHdlZW4gMSBhbmQgNTAgcmVxdWlyZW1lbnQgc3VibWlzc2lvbnMuIFNlZSBbUmVxdWlyZW1lbnQgdHlwZSBzY2hlbWEgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xTkVRa1REMHNWSzUwaUFRaTZ4SGlncmV4RFV4WjRReFhxU0VmVl9GRlRpVS8pIGZvciBhIGxpc3Qgb2YgcmVxdWlyZW1lbnRzIGFuZCBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRfc3VibWlzc2lvbnM6IEFycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb24+O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIGFjY2VwdGFuY2Ugb2YgVGVybXMgb2YgU2VydmljZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRPUyBhZ3JlZW1lbnQgd2FzIGFjY2VwdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhZ3JlZW1lbnRfYWNjZXB0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIG9yaWdpbmF0b3Igd2hlbiB0aGV5IGFjY2VwdGVkIHRoZSBUT1MuIEZvcm1hdHRlZCBhcyBhbiBJUHY0IG9yIElQdjYgSVAgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2lwX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU084NjAxIHRpbWVzdGFtcCBpbmRpY2F0aW5nIHdoZW4gdGhlIG9yaWdpbmF0b3IgYWNjZXB0ZWQgdGhlIFRPU1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhZ3JlZW1lbnRfYWNjZXB0ZWRfYXQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRoZSBlbmQgY3VzdG9tZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGFmdGVyIGNvbXBsZXRpbmcgcXVlc3Rpb25zIGluIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVSTCB0aGF0IHlvdSB3aWxsIHJlZGlyZWN0IHRoZSBlbmQgY3VzdG9tZXIgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbmJvYXJkaW5nX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHJlY3VycmluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2ZlclJlY3VycmluZ05ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbmQgdXNlciBpcyBpbml0aWF0aW5nIHRoZSBzcGVjaWZpYyB0cmFuc2ZlciB0aGVtc2VsdmVzIHZpYSBhbiBpbnRlcmFjdGl2ZSBVSSwgdGhpcyBzaG91bGQgYmUgYHRydWVgOyBmb3IgYXV0b21hdGljIHJlY3VycmluZyBwYXltZW50cyB3aGVyZSB0aGUgZW5kIHVzZXIgaXMgbm90IGFjdHVhbGx5IGluaXRpYXRpbmcgZWFjaCBpbmRpdmlkdWFsIHRyYW5zZmVyLCBpdCBzaG91bGQgYmUgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdXNpbmcgdGhlIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBjcmVhdGVkIGByZWN1cnJpbmdfdHJhbnNmZXJgIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiBOZXcgb3JpZ2luYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIGB0ZXN0X2Nsb2NrYCBhZHZhbmNlcy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtTaW11bGF0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvc2FuZGJveC8jc2ltdWxhdGluZy1yZWN1cnJpbmctdHJhbnNmZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogVHJhbnNmZXJEZXZpY2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zZmVyTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXI/OiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9yYXRpb25hbGU/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2ZlcjogUmVjdXJyaW5nVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJzOiBBcnJheTxSZWN1cnJpbmdUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBOZXR3b3JrcyBlbGlnaWJsZSBmb3IgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFJ0cCA9ICdydHAnXG59XG5cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciB3aWxsIGJlIGV4ZWN1dGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU2NoZWR1bGVJbnRlcnZhbFVuaXR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF91bml0OiBUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVjdXJyaW5nIGBpbnRlcnZhbF91bml0c2AgYmV0d2VlbiBvcmlnaW5hdGlvbnMuIFRoZSByZWN1cnJpbmcgaW50ZXJ2YWwgKGJlZm9yZSBob2xpZGF5IGFkanVzdG1lbnQpIGlzIGNhbGN1bGF0ZWQgYnkgbXVsdGlwbHlpbmcgYGludGVydmFsX3VuaXRgIGFuZCBgaW50ZXJ2YWxfY291bnRgLiBGb3IgZXhhbXBsZSwgdG8gc2NoZWR1bGUgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2hpY2ggb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IHR3byB3ZWVrcywgc2V0IGBpbnRlcnZhbF91bml0YCA9IGB3ZWVrYCBhbmQgYGludGVydmFsX2NvdW50YCA9IDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHRyYW5zZmVyLiAgSWYgdGhlIGBpbnRlcnZhbF91bml0YCBpcyBgd2Vla2AsIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNSAoRnJpZGF5KS4gIElmIHRoZSBgaW50ZXJ2YWxfdW5pdGAgaXMgYG1vbnRoYCwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSB0cmFuc2ZlciBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHRyYW5zZmVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgdHJhbnNmZXIgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi4gIFRoZSB0cmFuc2ZlciB3aWxsIGJlIG9yaWdpbmF0ZWQgb24gdGhlIG5leHQgYXZhaWxhYmxlIGJhbmtpbmcgZGF5IGlmIHRoZSBkZXNpZ25hdGVkIGRheSBpcyBhIG5vbiBiYW5raW5nIGRheS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgRm9yIGBydHBgIHJlY3VycmluZyB0cmFuc2ZlcnMsIGBzdGFydF9kYXRlYCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuIE90aGVyd2lzZSwgaWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiAgYGFjdGl2ZWA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY3VycmVudGx5IGFjdGl2ZS4gYGNhbmNlbGxlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50IG9yIFBsYWlkLiBgZXhwaXJlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZCBhbGwgb3JpZ2luYXRpb25zIGFjY29yZGluZyB0byBpdHMgcmVjdXJyaW5nIHNjaGVkdWxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVmdW5kIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHJlZnVuZCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWZ1bmRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgcmVmdW5kIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEZvciBgcnRwYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIFRyYW5zYWN0aW9uIElkZW50aWZpY2F0aW9uIG51bWJlci4gRm9yIGB3aXJlYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIElNQUQgKElucHV0IE1lc3NhZ2UgQWNjb3VudGFiaWxpdHkgRGF0YSkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSByZWZ1bmQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSByZWZ1bmQuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSByZWZ1bmQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcmVmdW5kIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kOiBUcmFuc2ZlclJlZnVuZDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBzdGF0dXMgZm9yIGEgcmVmdW5kIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXR1cm5lZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmFpbHVyZSBjb2RlLCBlLmcuIGBSMDFgLiAgQSBmYWlsdXJlIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgcmVmdW5kIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBTZWUgW0FDSCByZXR1cm4gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2RlcyBhbmQgW1JUUC9SZlAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHByZnAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSByZWZ1bmQgc3RhdHVzIGlzIGByZXR1cm5lZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW1RyYW5zZmVyIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIG1vcmUgdmVyc2F0aWxlIGBmYWlsdXJlX2NvZGVgLCB3aGljaCBlbmNvbXBhc3NlcyBub24tQUNIIGZhaWx1cmUgY29kZXMgYXMgd2VsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kOiBUcmFuc2ZlclJlZnVuZDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcmVmdW5kLiAgYHBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHJlZnVuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuIGBzZXR0bGVkYDogQ3JlZGl0cyBoYXZlIGJlZW4gcmVmdW5kZWQgdG8gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiBgY2FuY2VsbGVkYDogVGhlIHJlZnVuZCB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuIGBmYWlsZWRgOiBUaGUgcmVmdW5kIGhhcyBmYWlsZWQuIGByZXR1cm5lZGA6IFRoZSByZWZ1bmQgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWZ1bmRTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCdcbn1cblxuLyoqXG4gKiBBIHJlcGF5bWVudCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgb25lIG9yIG1vcmUgZ3VhcmFudGVlZCB0cmFuc2FjdGlvbnMgcmVjZWl2ZSBhIHJldHVybi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsaWdpYmxlIHJldHVybnMgaW4gYSBkYXksIHRoZXkgYXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byBhIHNpbmdsZSByZXBheW1lbnQuICBSZXBheW1lbnRzIGFyZSBzZW50IG92ZXIgQUNILCB3aXRoIGZ1bmRzIHR5cGljYWxseSBhdmFpbGFibGUgb24gdGhlIG5leHQgYmFua2luZyBkYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnQge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSByZXBheW1lbnQgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZWNpbWFsIGFtb3VudCBvZiB0aGUgcmVwYXltZW50IGFzIGl0IGFwcGVhcnMgb24geW91ciBhY2NvdW50IGxlZGdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGBjcmVhdGVkYCBkYXRldGltZSBvZiByZXBheW1lbnRzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZXBheW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcGF5bWVudHM6IEFycmF5PFRyYW5zZmVyUmVwYXltZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZXR1cm4gb24gYSBHdWFyYW50ZWVkIEFDSCB0cmFuc2ZlciB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGd1YXJhbnRlZWQgdHJhbnNmZXIgdGhhdCB3YXMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29ycmVzcG9uZGluZyBgcmV0dXJuZWRgIHRyYW5zZmVyIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJldHVybmVkIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSByZXBheW1lbnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50IHRvIHF1ZXJ5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUmVwYXltZW50UmV0dXJuPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBheW1lbnRfcmV0dXJuczogQXJyYXk8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm4+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmV0dXJuL3JlY292ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZXR1cm5lZCB0cmFuc2ZlciB0aGF0IHdhcyByZWNvdmVyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBiZWluZyByZWNvdmVyZWQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHN1bSBvZiByZWNvdmVyZWQgYW1vdW50cyBhY3Jvc3MgY2FsbHMgY2Fubm90IGV4Y2VlZCB0aGUgb3JpZ2luYWwgdHJhbnNmZXJcXCdzIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgcmVjb3ZlcnkuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byByZXBvcnQgYSByZWNvdmVyeSBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSByZWNvdmVyeSBpcyByZWNvcmRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXR1cm4vcmVjb3ZlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJldHVyblJlY292ZXJSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdW5pdCBvZiB0aGUgcmVjdXJyaW5nIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdCB7XG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBNb250aCA9ICdtb250aCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gTm90ZSB0aGF0IGZ1bmRzIGZyb20gcmVjZWl2ZWQgZGViaXRzIGFyZSBub3QgYXZhaWxhYmxlIHRvIGJlIG1vdmVkIG91dCBvZiB0aGUgTGVkZ2VyIHVudGlsIHRoZSB0cmFuc2ZlciByZWFjaGVzIGBmdW5kc19hdmFpbGFibGVgIHN0YXR1cy4gRm9yIGNyZWRpdCB0cmFuc2FjdGlvbnMsIGBzZXR0bGVkYCBtZWFucyB0aGUgZnVuZHMgaGF2ZSBiZWVuIGRlbGl2ZXJlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgYWNjb3VudC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSBzdWNjZXNzZnVsIGNyZWRpdCB0cmFuc2Zlci4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIChPbmx5IGFwcGxpY2FibGUgdG8gQUNIIGRlYml0cy4pIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2Zlci4gYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgaXMgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIGEgY2FuY2VsbGVkIHRyYW5zZmVyLiBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSBmYWlsZWQgdHJhbnNmZXIuIGByZXR1cm5lZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXR1cm5lZC4gVGhpcyBpcyB0aGUgdGVybWluYWwgc3RhdGUgb2YgYSByZXR1cm5lZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc2V0dGxlZCcsXG4gICAgRnVuZHNBdmFpbGFibGUgPSAnZnVuZHNfYXZhaWxhYmxlJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCdcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBzd2VlcCBvZiBmdW5kcyB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBBIHN3ZWVwIGlzIGFzc29jaWF0ZWQgd2l0aCBtYW55IHN3ZWVwIGV2ZW50cyAoZXZlbnRzIG9mIHR5cGUgYHN3ZXB0YCBvciBgcmV0dXJuX3N3ZXB0YCkgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCBieSBpbnZva2luZyB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBzd2VlcF9pZGAuICBgc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIHRoZSB0cmFuc2ZlciBhbW91bnQgaXMgY3JlZGl0ZWQgb3IgZGViaXRlZCBmcm9tIHlvdXIgc3dlZXAgYWNjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgdHlwZWAgb2YgdGhlIHRyYW5zZmVyLiBgcmV0dXJuX3N3ZXB0YCBldmVudHMgb2NjdXIgd2hlbiBhIHRyYW5zZmVyIGlzIHJldHVybmVkIGFuZCBQbGFpZCB1bmRvZXMgdGhlIGNyZWRpdCBvciBkZWJpdC4gIFRoZSB0b3RhbCBzdW0gb2YgdGhlIGBzd2VwdGAgYW5kIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBpcyBlcXVhbCB0byB0aGUgYGFtb3VudGAgb2YgdGhlIHN3ZWVwIFBsYWlkIGNyZWF0ZXMgYW5kIG1hdGNoZXMgdGhlIGFtb3VudCBvZiB0aGUgZW50cnkgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXAge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIFBsYWlkIExlZGdlciBCYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2lnbmVkIGRlY2ltYWwgYW1vdW50IG9mIHRoZSBzd2VlcCBhcyBpdCBhcHBlYXJzIG9uIHlvdXIgc3dlZXAgYWNjb3VudCBsZWRnZXIgKGUuZy4gXFxcIi0xMC4wMFxcXCIpICBJZiBhbW91bnQgaXMgbm90IHByZXNlbnQsIHRoZSBzd2VlcCB3YXMgbmV0LXNldHRsZWQgdG8gemVybyBhbmQgb3V0c3RhbmRpbmcgZGViaXRzIGFuZCBjcmVkaXRzIGJldHdlZW4gdGhlIHN3ZWVwIGFjY291bnQgYW5kIFBsYWlkIGFyZSBiYWxhbmNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzd2VlcCBzZXR0bGVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHNldHRsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgd2hlbiBmdW5kcyBmcm9tIGEgbGVkZ2VyIGRlcG9zaXQgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhc3NvY2lhdGVkIGxlZGdlciBiYWxhbmNlLiBPbmx5IGFwcGxpZXMgdG8gZGVwb3NpdHMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBleHBlY3RlZF9mdW5kc19hdmFpbGFibGVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc3RhdHVzPzogU3dlZXBTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEZvciBgcnRwYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIFRyYW5zYWN0aW9uIElkZW50aWZpY2F0aW9uIG51bWJlci4gRm9yIGB3aXJlYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIElNQUQgKElucHV0IE1lc3NhZ2UgQWNjb3VudGFiaWxpdHkgRGF0YSkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBTd2VlcEZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN3ZWVwIChVVUlEKSBvciBhIHNob3J0ZW5lZCBmb3JtIGNvbnNpc3Rpbmcgb2YgdGhlIGZpcnN0IDggY2hhcmFjdGVycyBvZiB0aGUgaWRlbnRpZmllciAoOC1kaWdpdCBoZXhhZGVjaW1hbCBzdHJpbmcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBgY3JlYXRlZGAgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGBjcmVhdGVkYCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzd2VlcHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBpbmNsdWRlZCBgdHJhbnNmZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PFRyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBzd2VlcCBmb3IgdGhlIHRyYW5zZmVyLiAgYHVuc3dlcHRgOiBUaGUgdHJhbnNmZXIgaGFzblxcJ3QgYmVlbiBzd2VwdCB5ZXQuIGBzd2VwdGA6IFRoZSB0cmFuc2ZlciB3YXMgc3dlcHQgdG8gdGhlIHN3ZWVwIGFjY291bnQuIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVyXFwncyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiBgcmV0dXJuX3N3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdWxsZWQgYmFjayBvciBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC4gYG51bGxgOiBUaGUgdHJhbnNmZXIgd2lsbCBuZXZlciBiZSBzd2VwdCAoZS5nLiBpZiB0aGUgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIG9yIHJldHVybmVkIGJlZm9yZSBiZWluZyBzd2VwdClcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3dlZXBTdGF0dXMge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgVW5zd2VwdCA9ICd1bnN3ZXB0JyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB0ZXN0IGNsb2NrIGZvciBhIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclRlc3RDbG9ja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYW5kIG9ubHkgaWYgYSBgdGVzdF9jbG9ja19pZGAgd2FzIGluY2x1ZGVkIGluIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHJlcXVlc3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2ltdWxhdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3NhbmRib3gvI3NpbXVsYXRpbmctcmVjdXJyaW5nLXRyYW5zZmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclRlc3RDbG9ja1xuICAgICAqL1xuICAgIHZpcnR1YWxfdGltZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBUaGUgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXguIFxcXCJTYW4gRnJhbmNpc2NvXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIChlLmcuLCBcXFwiVVNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci4gUGhvbmUgbnVtYmVyIGlucHV0IG1heSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHdpcmUgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlcldpcmVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJXaXJlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3aXJlIG9yaWdpbmF0b3IgdG8gdGhlIGJlbmVmaWNpYXJ5LiBNYXggMTQwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJXaXJlRGV0YWlsc1xuICAgICAqL1xuICAgIG1lc3NhZ2VfdG9fYmVuZWZpY2lhcnk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmZWUgYW1vdW50IGRlZHVjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHRyYW5zZmVyIGR1cmluZyBhIHdpcmUgcmV0dXJuLCBpZiBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyV2lyZURldGFpbHNcbiAgICAgKi9cbiAgICB3aXJlX3JldHVybl9mZWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2FsY3VsYXRlZCBUcnVzdCBJbmRleCBTY29yZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJ1c3RJbmRleFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0SW5kZXgge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdmVyYWxsIHRydXN0IGluZGV4IHNjb3JlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uZWQgbmFtZSBvZiB0aGUgVHJ1c3QgSW5kZXggbW9kZWwgdXNlZCBmb3Igc2NvcmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcnVzdEluZGV4XG4gICAgICovXG4gICAgbW9kZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJ1c3RJbmRleFN1YnNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJ1c3RJbmRleFxuICAgICAqL1xuICAgIHN1YnNjb3JlczogVHJ1c3RJbmRleFN1YnNjb3JlcyB8IG51bGw7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgVHJ1c3QgSW5kZXggU3Vic2NvcmUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRydXN0SW5kZXhTdWJzY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0SW5kZXhTdWJzY29yZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YnNjb3JlIHNjb3JlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhTdWJzY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIENvbnRhaW5zIHN1Yi1zY29yZSBtZXRhZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJ1c3RJbmRleFN1YnNjb3Jlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0SW5kZXhTdWJzY29yZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcnVzdEluZGV4U3Vic2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhTdWJzY29yZXNcbiAgICAgKi9cbiAgICBkZXZpY2VfYW5kX2Nvbm5lY3Rpb24/OiBUcnVzdEluZGV4U3Vic2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcnVzdEluZGV4U3Vic2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFRydXN0SW5kZXhTdWJzY29yZXNcbiAgICAgKi9cbiAgICBiYW5rX2FjY291bnRfaW5zaWdodHM/OiBUcnVzdEluZGV4U3Vic2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBUcnVzdGVkIERldmljZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJldmlvdXMgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcnVzdGVkRGV2aWNlRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRydXN0ZWREZXZpY2VEYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcnVzdGVkRGV2aWNlRGF0YVxuICAgICAqL1xuICAgIHRydXN0X2xldmVsPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXZpY2VJZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJ1c3RlZERldmljZURhdGFcbiAgICAgKi9cbiAgICBkZXZpY2VfaWQ/OiBEZXZpY2VJZDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybD86IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGZvciBlZGl0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgYmVpbmcgc2NyZWVuZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWxwaGFiZXRpY2FsIGNoYXJhY3RlciwgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLCBhbmQgbm90IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZGF0YSBwZXJtaXNzaW9uZWQgYnkgdGhlIGVuZCB1c2VyIGR1cmluZyB0aGUgYXV0aG9yaXphdGlvbiBmbG93LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHlOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbmFtZT86IFVzZXJBY2NvdW50SWRlbnRpdHlOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIgaW4gW0UuMTY0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FLjE2NCkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy4gIE5vdGU6IGVtYWlsIGlzIGN1cnJlbnRseSBub3QgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZGF0ZSBvZiBiaXJ0aC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIFNvY2lhbCBTZWN1cml0eSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHNzbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHVzZXJcXCdzIFNvY2lhbCBTZWN1cml0eSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHNzbl9sYXN0XzQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWNvbmQgbGluZSBzdHJlZXQgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFZGl0IGNvdW50cyBvdmVyIHZhcmlvdXMgdGltZSBwZXJpb2RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZWRpdHMgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzXG4gICAgICovXG4gICAgZWRpdHNfY3VycmVudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZWRpdHMgaW4gdGhlIGxhc3QgMSBkYXlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c1xuICAgICAqL1xuICAgIGVkaXRzXzFkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBlZGl0cyBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRDb3VudHNcbiAgICAgKi9cbiAgICBlZGl0c18zMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGVkaXRzIGluIHRoZSBsYXN0IDM2NSBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRDb3VudHNcbiAgICAgKi9cbiAgICBlZGl0c18zNjVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBlZGl0c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzXG4gICAgICovXG4gICAgZWRpdHNfYWxsX3RpbWU/OiBudW1iZXI7XG59XG4vKipcbiAqIFN0YXRpc3RpY3MgdHJhY2tpbmcgdGhlIG51bWJlciBvZiBlZGl0cyBtYWRlIHRvIGlkZW50aXR5IGZpZWxkcyBvdmVyIHZhcmlvdXMgdGltZSBwZXJpb2RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5RWRpdEhpc3RvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5RWRpdEhpc3Rvcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5XG4gICAgICovXG4gICAgbmFtZT86IFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5XG4gICAgICovXG4gICAgZW1haWw/OiBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eUVkaXRDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0SGlzdG9yeVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBVc2VyQWNjb3VudElkZW50aXR5RWRpdENvdW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eU9mZmljaWFsRG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0SGlzdG9yeVxuICAgICAqL1xuICAgIG9mZmljaWFsX2RvY3VtZW50PzogVXNlckFjY291bnRJZGVudGl0eU9mZmljaWFsRG9jdW1lbnQgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZSBhbmQgbGFzdCBuYW1lLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5TmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlOYW1lIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5TmFtZVxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9mZmljaWFsIGlkZW50aXR5IGRvY3VtZW50IGVkaXQgc3RhdGlzdGljcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eU9mZmljaWFsRG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5T2ZmaWNpYWxEb2N1bWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5T2ZmaWNpYWxEb2N1bWVudFxuICAgICAqL1xuICAgIHNzbj86IFVzZXJBY2NvdW50SWRlbnRpdHlFZGl0Q291bnRzO1xufVxuLyoqXG4gKiBBbiBJdGVtIGNyZWF0ZWQgZHVyaW5nIGEgTGF5ZXIgYXV0aG9yaXphdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYCB3ZWJob29rIGlzIGZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBzZW50IG9ubHkgZm9yIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdGhhdCBhbGxvdyBhY2NvdW50LWxldmVsIHBlcm1pc3Npb25zIHJldm9jYXRpb24gdGhyb3VnaCB0aGVpciBwb3J0YWxzLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgUGxhaWQtZGVyaXZlZCBkYXRhIHlvdSBoYXZlIHN0b3JlZCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV2b2tlZCBhY2NvdW50LiAgSWYgeW91IGFyZSB1c2luZyBBdXRoIGFuZCByZWNlaXZlIHRoaXMgd2ViaG9vaywgdGhpcyB3ZWJob29rIGluZGljYXRlcyB0aGF0IHRoZSBUQU4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXZva2VkIGFjY291bnQgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgbmV3IHRyYW5zZmVycy4gWW91IHNob3VsZCBub3QgY3JlYXRlIG5ldyBBQ0ggdHJhbnNmZXJzIGZvciB0aGUgYWNjb3VudCB0aGF0IHdhcyByZXZva2VkIHVudGlsIGFjY2VzcyBoYXMgYmVlbiByZS1ncmFudGVkLiAgWW91IGNhbiByZXF1ZXN0IHRoZSB1c2VyIHRvIHJlLWdyYW50IGFjY2VzcyB0byB0aGVpciBhY2NvdW50IGJ5IHNlbmRpbmcgdGhlbSB0aHJvdWdoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gQWx0ZXJuYXRpdmVseSwgdGhleSBtYXkgcmUtZ3JhbnQgYWNjZXNzIGRpcmVjdGx5IHRocm91Z2ggdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gIEFmdGVyIHRoZSB1c2VyIGhhcyByZS1ncmFudGVkIGFjY2VzcywgQXV0aCBjdXN0b21lcnMgc2hvdWxkIGNhbGwgdGhlIGF1dGggZW5kcG9pbnQgYWdhaW4gdG8gb2J0YWluIHRoZSBuZXcgVEFOLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRSZXZva2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX0FDQ09VTlRfUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEV2ZW50IGRhdGEgZm9yIHVzZXIgYWNjb3VudCBzZXNzaW9uIHRyYWNraW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGV2ZW50IG9jY3VycmVkIGluIElTTyA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIG91dGNvbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50XG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyX2FjY291bnQvc2Vzc2lvbi9ldmVudC9zZW5kYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGNvaG9ydCBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb2hvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRTZXNzaW9uRXZlbnR9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudDogVXNlckFjY291bnRTZXNzaW9uRXZlbnQ7XG59XG4vKipcbiAqIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyX2FjY291bnQvc2Vzc2lvbi9ldmVudC9zZW5kYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBlbmQgdXNlciBMYXllciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHk6IFVzZXJBY2NvdW50SWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxVc2VyQWNjb3VudEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxVc2VyQWNjb3VudEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5RWRpdEhpc3Rvcnl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHlfZWRpdF9oaXN0b3J5PzogVXNlckFjY291bnRJZGVudGl0eUVkaXRIaXN0b3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEhvbWUgYWRkcmVzcyBmb3IgdGhlIHVzZXIuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBub3QgcHJvdmlkZWQsIGFkZHJlc3Mgd2l0aCBvbmx5IGNvdW50cnkgY29kZSBvciBmdWxsIGFkZHJlc3MuICBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3ViZGl2aXNpb24gY29kZS4gXFxcIlN1YmRpdmlzaW9uXFxcIiBpcyBhIGdlbmVyaWMgdGVybSBmb3IgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIGV0Yy4gRm9yIHRoZSBsaXN0IG9mIHZhbGlkIGNvZGVzLCBzZWUgW2NvdW50cnkgc3ViZGl2aXNpb24gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jb3VudHJ5X3N1YmRpdmlzaW9uX2NvZGVzLmpzb24pLiBDb3VudHJ5IHByZWZpeGVzIGFyZSBvbWl0dGVkLCBzaW5jZSB0aGV5IGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBgY291bnRyeWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgdXNlci1iYXNlZCBwcm9kdWN0cy4gVXNlci1iYXNlZCBwcm9kdWN0cyBpbmNsdWRlIEZpbmFuY2lhbCBNYW5hZ2VtZW50IHByb2R1Y3RzLCBQcm90ZWN0IHByb2R1Y3RzLCBDUkEgcHJvZHVjdHMsIGFuZCBzdWJzY3JpcHRpb24gcHJvZHVjdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyQmFzZWRQcm9kdWN0cyB7XG4gICAgQ3JhQmFzZVJlcG9ydCA9ICdjcmFfYmFzZV9yZXBvcnQnLFxuICAgIENyYUluY29tZUluc2lnaHRzID0gJ2NyYV9pbmNvbWVfaW5zaWdodHMnLFxuICAgIENyYVBhcnRuZXJJbnNpZ2h0cyA9ICdjcmFfcGFydG5lcl9pbnNpZ2h0cycsXG4gICAgQ3JhTmV0d29ya0luc2lnaHRzID0gJ2NyYV9uZXR3b3JrX2luc2lnaHRzJyxcbiAgICBDcmFDYXNoZmxvd0luc2lnaHRzID0gJ2NyYV9jYXNoZmxvd19pbnNpZ2h0cycsXG4gICAgQ3JhTW9uaXRvcmluZyA9ICdjcmFfbW9uaXRvcmluZycsXG4gICAgQ3JhTGVuZFNjb3JlID0gJ2NyYV9sZW5kX3Njb3JlJyxcbiAgICBDcmFQbGFpZENyZWRpdFNjb3JlID0gJ2NyYV9wbGFpZF9jcmVkaXRfc2NvcmUnLFxuICAgIEludmVzdG1lbnRzID0gJ2ludmVzdG1lbnRzJyxcbiAgICBMaWFiaWxpdGllcyA9ICdsaWFiaWxpdGllcycsXG4gICAgUHJvdGVjdExpbmtlZEJhbmsgPSAncHJvdGVjdF9saW5rZWRfYmFuaycsXG4gICAgUHJvdGVjdFRyYW5zYWN0aW9ucyA9ICdwcm90ZWN0X3RyYW5zYWN0aW9ucycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ3RyYW5zYWN0aW9ucydcbn1cblxuLyoqXG4gKiBVc2VyQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NsaWVudFVzZXJJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IENsaWVudFVzZXJJZGVudGl0eSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIGEgQ1JBIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5PzogQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHlvdXIgaW50ZWdyYXRpb24gd2l0aCB0aGUgVXNlciBBUEkgcHJlZGF0ZXMgRGVjZW1iZXIgMTAsIDIwMjUsIHNldCB0aGlzIGZpZWxkIHRvIGB0cnVlYCB0byBvcHQgaW50byB0aGUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcy8pLiBXaGVuIGVuYWJsZWQsIHlvdSBjYW4gdXNlIHRoZSBgaWRlbnRpdHlgIGZpZWxkIGluc3RlYWQgb2YgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXRoX3VwZ3JhZGVkX3VzZXI/OiBib29sZWFuO1xufVxuLyoqXG4gKiBVc2VyQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQuIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IGN1c3RvbWVycyB3aXRoIHByZS1leGlzdGluZyBpbnRlZ3JhdGlvbnMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYHVzZXJfdG9rZW5gIGZpZWxkLiBBbGwgb3RoZXIgY3VzdG9tZXJzIHNob3VsZCB1c2UgdGhlIGB1c2VyX2lkYCBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmQge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGFPdmVydmlldyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9maW5hbmNpYWxfZGF0YS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZnJlc2ggcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFJlZnJlc2hSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBBcnJheTxSZWZyZXNoUmVzdWx0Pjtcbn1cbi8qKlxuICogVXNlckdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlckdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IHByb3ZpZGVkIHVzZXIgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIG9mIHVzZXIgY3JlYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBvZiBsYXN0IHVzZXIgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NsaWVudFVzZXJJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBDbGllbnRVc2VySWRlbnRpdHkgfCBudWxsO1xufVxuLyoqXG4gKiBJRCBudW1iZXIgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLCBjdXJyZW50bHkgdXNlZCBvbmx5IGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QuIElmIHRoZSB1c2VyIGhhcyBub3Qgc3VibWl0dGVkIHRoaXMgZGF0YSB5ZXQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuIE90aGVyd2lzZSwgYm90aCBmaWVsZHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySUROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySUROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIHRoZSBpZGVudGl0eSBkb2N1bWVudCB0eXBlZCBpbiBieSB0aGUgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLiBGb3Igc3BlY2lmaWMgZm9ybWF0IHJlcXVpcmVtZW50cyBieSBJRCB0eXBlLCBzZWUgW0lucHV0IFZhbGlkYXRpb24gUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpZC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2lkZW50aXR5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VySWRlbnRpdHlSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9pZGVudGl0eS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJZGVudGl0eVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlcklkZW50aXR5UmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySWRlbnRpdHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2l0ZW1zL2Fzc29jaWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVXNlckl0ZW1zQXNzb2NpYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvYXNzb2NpYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNBc3NvY2lhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc0Fzc29jaWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zQXNzb2NpYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJJdGVtc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9pdGVtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJdGVtc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgYnkgY3VzdG9tZXJzIHdpdGggcHJlLWV4aXN0aW5nIGludGVncmF0aW9ucyB0aGF0IGFscmVhZHkgdXNlIHRoZSBgdXNlcl90b2tlbmAgZmllbGQuIEFsbCBvdGhlciBjdXN0b21lcnMgc2hvdWxkIHVzZSB0aGUgYHVzZXJfaWRgIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkZW50aWZpZXIsIGNyZWF0ZWQgYnkgYC91c2VyL2NyZWF0ZWAuIEludGVncmF0aW9ucyB0aGF0IGJlZ2FuIHVzaW5nIGAvdXNlci9jcmVhdGVgIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1IHVzZSB0aGlzIGZpZWxkIHRvIGlkZW50aWZ5IGEgdXNlciBpbnN0ZWFkIG9mIHRoZSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVXNlckl0ZW1zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbT59XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2l0ZW1zL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgdG8gYmUgZGVsZXRlZC4gQWxsIEl0ZW1zIGZvciByZW1vdmFsIG11c3QgYmUgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYC4gT3RoZXJ3aXNlLCB0aGUgZW50aXJlIG9wZXJhdGlvbiB3aWxsIGVycm9yIGFuZCBubyBJdGVtcyB3aWxsIGJlIGRlbGV0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVXNlckl0ZW1zUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc1JlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgIHdlYmhvb2sgbWF5IGJlIGZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gSWYgdGhlIGVuZCB1c2VyIHJldm9rZWQgdGhlaXIgcGVybWlzc2lvbnMgdGhyb3VnaCBQbGFpZCAoc3VjaCBhcyB2aWEgdGhlIFBsYWlkIFBvcnRhbCBvciBieSBjb250YWN0aW5nIFBsYWlkIHN1cHBvcnQpLCB0aGUgd2ViaG9vayB3aWxsIGZpcmUuIElmIHRoZSBlbmQgdXNlciByZXZva2VkIHRoZWlyIHBlcm1pc3Npb25zIGRpcmVjdGx5IHRocm91Z2ggdGhlIGluc3RpdHV0aW9uLCB0aGlzIHdlYmhvb2sgbWF5IG5vdCBhbHdheXMgZmlyZSwgc2luY2Ugc29tZSBpbnN0aXR1dGlvbnNcXCcgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVG8gYXR0ZW1wdCB0byByZXN0b3JlIHRoZSBJdGVtLCBpdCBjYW4gYmUgc2VudCB0aHJvdWdoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gRGVwZW5kaW5nIG9uIHRoZSBleGFjdCBwcm9jZXNzIHRoZSBlbmQgdXNlciB1c2VkIHRvIHJldm9rZSBwZXJtaXNzaW9ucywgaXQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byBsYXVuY2ggdXBkYXRlIG1vZGUgZm9yIHRoZSBJdGVtLiBJZiB5b3UgZW5jb3VudGVyIGFuIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1cGRhdGUgbW9kZSBvbiBhbiBJdGVtIHdpdGggcmV2b2tlZCBwZXJtaXNzaW9ucywgY3JlYXRlIGEgZnJlc2ggTGluayB0b2tlbiBmb3IgdGhlIHVzZXIuICBOb3RlIHRoYXQgd2hlbiB3b3JraW5nIHdpdGggdG9rZW5pemVkIGFjY291bnQgbnVtYmVycyB3aXRoIEF1dGggb3IgVHJhbnNmZXIsIHRoZSBhY2NvdW50IG51bWJlciBwcm92aWRlZCBieSBQbGFpZCB3aWxsIG5vIGxvbmdlciB3b3JrIGZvciBjcmVhdGluZyB0cmFuc2ZlcnMgb25jZSB1c2VyIHBlcm1pc3Npb24gaGFzIGJlZW4gcmV2b2tlZCwgZXhjZXB0IGZvciBVUyBCYW5rIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9wcm9kdWN0cy90ZXJtaW5hdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZGVudGlmaWVyLCBjcmVhdGVkIGJ5IGAvdXNlci9jcmVhdGVgLiBJbnRlZ3JhdGlvbnMgdGhhdCBiZWdhbiB1c2luZyBgL3VzZXIvY3JlYXRlYCBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSB1c2UgdGhpcyBmaWVsZCB0byBpZGVudGlmeSBhIHVzZXIgaW5zdGVhZCBvZiB0aGUgYHVzZXJfdG9rZW5gLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdHNUZXJtaW5hdGVSZWFzb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVhc29uX2NvZGU6IFByb2R1Y3RzVGVybWluYXRlUmVhc29uQ29kZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGNvbnRleHQgb3IgZGV0YWlscyBhYm91dCB0aGUgcmVhc29uIGZvciB0ZXJtaW5hdGluZyB1c2VyLWJhc2VkIHByb2R1Y3RzLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYHJlYXNvbl9ub3RlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVhc29uX25vdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9wcm9kdWN0cy90ZXJtaW5hdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlclJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogVXNlclJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIGNhdGVnb3J5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlQ2F0ZWdvcnkge1xuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBTYWxhcnkgPSAnU0FMQVJZJyxcbiAgICBVbmVtcGxveW1lbnQgPSAnVU5FTVBMT1lNRU5UJyxcbiAgICBDYXNoID0gJ0NBU0gnLFxuICAgIEdpZ0Vjb25vbXkgPSAnR0lHX0VDT05PTVknLFxuICAgIFJlbnRhbCA9ICdSRU5UQUwnLFxuICAgIENoaWxkU3VwcG9ydCA9ICdDSElMRF9TVVBQT1JUJyxcbiAgICBNaWxpdGFyeSA9ICdNSUxJVEFSWScsXG4gICAgUmV0aXJlbWVudCA9ICdSRVRJUkVNRU5UJyxcbiAgICBMb25nVGVybURpc2FiaWxpdHkgPSAnTE9OR19URVJNX0RJU0FCSUxJVFknLFxuICAgIEJhbmtJbnRlcmVzdCA9ICdCQU5LX0lOVEVSRVNUJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgZnJlcXVlbmN5IG9mIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3kge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgdHlwZSAtIGBHUk9TU2AsIGBORVRgLCBvciBgVU5LTk9XTmAgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEdyb3NzID0gJ0dST1NTJyxcbiAgICBOZXQgPSAnTkVUJ1xufVxuXG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgQVBJIGBjbGllbnRfaWRgIG9mIHRoZSB0aGlyZC1wYXJ0eSBjbGllbnQgdGhlIHRva2VuIHdpbGwgYmUgc2hhcmVkIHdpdGguIFRoZSB0b2tlbiB3aWxsIG9ubHkgYmUgdmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBhbmQgdGltZSBmb3IgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhlIGV4cGlyYXRpb24gaXMgcmVzdHJpY3RlZCB0byBhIG1heGltdW0gb2YgMjQgaG91cnMgZnJvbSB0aGUgdG9rZW5cXCdzIGNyZWF0aW9uIHRpbWUuIElmIG5vdCBwcm92aWRlZCwgdGhlIHRva2VuIHdpbGwgYXV0b21hdGljYWxseSBleHBpcmUgYWZ0ZXIgMjQgaG91cnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3RoaXJkX3BhcnR5X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVmcmVzaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxSZWZyZXNoUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBBcnJheTxSZWZyZXNoUmVzdWx0Pjtcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWRlbnRpZmllciwgY3JlYXRlZCBieSBgL3VzZXIvY3JlYXRlYC4gSW50ZWdyYXRpb25zIHRoYXQgYmVnYW4gdXNpbmcgYC91c2VyL2NyZWF0ZWAgYWZ0ZXIgRGVjZW1iZXIgMTAsIDIwMjUgdXNlIHRoaXMgZmllbGQgdG8gaWRlbnRpZnkgYSB1c2VyIGluc3RlYWQgb2YgdGhlIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2xpZW50VXNlcklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5PzogQ2xpZW50VXNlcklkZW50aXR5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkLiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSBjdXN0b21lcnMgd2l0aCBwcmUtZXhpc3RpbmcgaW50ZWdyYXRpb25zIHRoYXQgYWxyZWFkeSB1c2UgdGhlIGB1c2VyX3Rva2VuYCBmaWVsZC4gQWxsIG90aGVyIGN1c3RvbWVycyBzaG91bGQgdXNlIHRoZSBgdXNlcl9pZGAgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWYWxpZGF0aW9uU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VcbiAgICAgKi9cbiAgICBWYWxpZGF0aW9uU291cmNlTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VSZWZlcmVuY2VJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VmFsaWRhdGlvblNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VzXG4gICAgICovXG4gICAgVkFMSURBVElPTl9TT1VSQ0U6IEFycmF5PFZhbGlkYXRpb25Tb3VyY2U+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2FzIG5vdCB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFmdGVyIHNldmVuIGRheXMgc2luY2UgdGhlIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0IHdhcyBtYWRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IFJlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQXNzZXRzO1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVUNDRVNTRlVMXFxcImAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaCB3YXMgc3VjY2Vzc2Z1bC4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9OT1RfRk9VTkRcXFwiYCBObyBuZXcgZGF0YSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXMge1xuICAgIFN0YXR1c1VzZXJQcmVzZW5jZVJlcXVpcmVkID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NUQVRVU19VU0VSX1BSRVNFTkNFX1JFUVVJUkVEJyxcbiAgICBTdWNjZXNzZnVsID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUwnLFxuICAgIE5vdEZvdW5kID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUVEXFxcImA6IFRoZSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgYFxcXCJVTlZFUklGSUVEXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBwZXJmb3JtZWQuICBgXFxcIk5FRURTX0lORk9cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiB3YXMgYXR0ZW1wdGVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBtaXNzaW5nIGluZm9ybWF0aW9uLiAgXFxcImBVTkFCTEVfVE9fVkVSSUZZYFxcXCI6IFRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBcXFwiVU5LTk9XTlxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBWZXJpZmllZCA9ICdWRVJJRklFRCcsXG4gICAgVW52ZXJpZmllZCA9ICdVTlZFUklGSUVEJyxcbiAgICBOZWVkc0luZm8gPSAnTkVFRFNfSU5GTycsXG4gICAgVW5hYmxlVG9WZXJpZnkgPSAnVU5BQkxFX1RPX1ZFUklGWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgdmVyaWZ5X3Ntc2Agc3RlcC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZ5U01TRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVNNU0RldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZnlTTVNEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBWZXJpZnlTTVNEZXRhaWxzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhIHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciB0aGUgYHZlcmlmeV9zbXNgIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlci1zdWJtaXR0ZWQgcGhvbmUgbnVtYmVyLiBQaG9uZSBudW1iZXIgZWRpdHMsIGFuZCBpbiBzb21lIGNhc2VzIGVycm9yIGhhbmRsaW5nIGR1ZSB0byBlZGdlIGNhc2VzIGxpa2UgcmF0ZSBsaW1pdGluZywgbWF5IGdlbmVyYXRlIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U01TVmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZ5U01TRGV0YWlsc1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbnM6IEFycmF5PFNNU1ZlcmlmaWNhdGlvbj47XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGB2ZXJpZnlfc21zYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnZlcmlmeV9zbXNgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZ5U01TRGV0YWlsc1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGF4X3llYXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVyIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBTb2NpYWwgU2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBTZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBTb2NpYWwgU2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfOT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgb3RoZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzPzogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyQm94MTIge1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMkJveDEyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJPdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIFNvY2lhbCBTZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgU2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gU29jaWFsIFNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94Xzk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG90aGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlPjtcbn1cbi8qKlxuICogVzIgc3RhdGUgYW5kIGxvY2FsIHdhZ2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxpdHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXRlX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xufVxuLyoqXG4gKiBXYWxsZXRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUsIHVzZWQgd2l0aCBlLXdhbGxldHMgYW5kIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldElTT0N1cnJlbmN5Q29kZSB7XG4gICAgR2JwID0gJ0dCUCcsXG4gICAgRXVyID0gJ0VVUidcbn1cblxuLyoqXG4gKiBXYWxsZXRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IFdhbGxldElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCBlLXdhbGxldCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gZS13YWxsZXRzIGNyZWF0ZWQgYmVmb3JlIHRoYXQgZS13YWxsZXQuIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gZS13YWxsZXRzIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGUtd2FsbGV0cyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdhbGxldExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZS13YWxsZXRzXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldD59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldHM6IEFycmF5PFdhbGxldD47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGUgbGF0ZXN0IGUtd2FsbGV0IHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbElCQU59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgc2NoZW1lIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBBWU9VVGAgYW5kIGBSRUZVTkRgLiAgYEZBU1RFUl9QQVlNRU5UU2A6IFRoZSBzdGFuZGFyZCBwYXltZW50IHNjaGVtZSB3aXRoaW4gdGhlIFVLLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSYDogVGhlIHN0YW5kYXJkIHBheW1lbnQgdG8gYSBiZW5lZmljaWFyeSB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UYDogSW5zdGFudCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRQYXltZW50U2NoZW1lIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIEZhc3RlclBheW1lbnRzID0gJ0ZBU1RFUl9QQVlNRU5UUycsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVyID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXJJbnN0YW50ID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlQnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgd2FsbGV0LiAgYFVOS05PV05gOiBUaGUgd2FsbGV0IHN0YXR1cyBpcyB1bmtub3duLiAgYEFDVElWRWA6IFRoZSB3YWxsZXQgaXMgYWN0aXZlIGFuZCByZWFkeSB0byBzZW5kIG1vbmV5IHRvIGFuZCByZWNlaXZlIG1vbmV5IGZyb20uICBgQ0xPU0VEYDogVGhlIHdhbGxldCBpcyBjbG9zZWQuIEFueSB0cmFuc2FjdGlvbnMgbWFkZSB0byBvciBmcm9tIHRoaXMgd2FsbGV0IHdpbGwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRTdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgQ2xvc2VkID0gJ0NMT1NFRCdcbn1cblxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldCB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGUgc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGVzIHRoYXQgYXJlIHJldHVybmVkIGFyZTogYEJBTktfVFJBTlNGRVI6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBhbiBleHRlcm5hbCBiYW5rIHRyYW5zZmVyLiAgYFBBWU9VVDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IGRpc2J1cnNpbmcgZnVuZHMgdG8gYSBjb3VudGVycGFydHkuICBgUElTX1BBWV9JTjpgIGEgcGF5bWVudCB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggUGxhaWRcXCdzIFBheW1lbnQgSW5pdGlhdGlvbiBTZXJ2aWNlcyAoUElTKSBBUElzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIFtQYXltZW50IEluaXRpYXRpb24gZW5kcG9pbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vKS4gIGBSRUZVTkQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSByZWZ1bmRpbmcgYSBwcmV2aW91c2x5IGluaXRpYXRlZCBwYXltZW50IG1hZGUgdGhyb3VnaCBQbGFpZFxcJ3MgW1BJUyBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vKS4gIGBGVU5EU19TV0VFUGA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgZnVuZHMgZnJvbSBhbiBlLXdhbGxldCB0byBhIGRlc2lnbmF0ZWQgY2xpZW50LW93bmVkIGFjY291bnQuICBgUkVUVVJOYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoZXJlIGEgZGViaXQgdHJhbnNhY3Rpb24gd2FzIHJldmVyc2VkIGFuZCBtb25leSBtb3ZlZCBiYWNrIHRvIG9yaWdpbmF0aW5nIGFjY291bnQuICBgUkVDQUxMYDogYSB0cmFuc2FjdGlvbiB3aGVyZSB0aGUgc2VuZGluZyBiYW5rIGhhcyByZXF1ZXN0ZWQgdGhlIHJldHVybiBvZiBmdW5kcyBkdWUgdG8gYSBmcmF1ZCBjbGFpbSwgdGVjaG5pY2FsIGVycm9yLCBvciBvdGhlciBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBheW1lbnQuICBgQUNDT1VOVF9GVU5ESU5HYDogYW4gaW5jb21pbmcgdHJhbnNmZXIgZnJvbSBhbiBhbGxvd2xpc3RlZCBhY2NvdW50LiBOb3QgYXV0b21hdGljYWxseSByZWZ1bmRlZC4gIGBBVVRPX1JFRlVORGA6IGFuIG91dGdvaW5nIHJlZnVuZCBhdXRvbWF0aWNhbGx5IGluaXRpYXRlZCBieSBQbGFpZCBpbiByZXNwb25zZSB0byBhbiB1bmV4cGVjdGVkIGBCQU5LX1RSQU5TRkVSYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2NoZW1lPzogV2FsbGV0UGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTTyA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uUGF5ZWVWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5ZWVfdmVyaWZpY2F0aW9uX3N0YXR1cz86IFdhbGxldFRyYW5zYWN0aW9uUGF5ZWVWZXJpZmljYXRpb25TdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IGlkIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgZm9yIHRyYW5zYWN0aW9uIHR5cGVzIGBQSVNfUEFZX0lOYCBhbmQgYFJFRlVORGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB3YWxsZXQgdHJhbnNhY3Rpb25zIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcmVsYXRlZF90cmFuc2FjdGlvbnM/OiBBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBCYW5rVHJhbnNmZXIgPSAnQkFOS19UUkFOU0ZFUicsXG4gICAgUGF5b3V0ID0gJ1BBWU9VVCcsXG4gICAgUGlzUGF5SW4gPSAnUElTX1BBWV9JTicsXG4gICAgUmVmdW5kID0gJ1JFRlVORCcsXG4gICAgRnVuZHNTd2VlcCA9ICdGVU5EU19TV0VFUCcsXG4gICAgUmV0dXJuID0gJ1JFVFVSTicsXG4gICAgUmVjYWxsID0gJ1JFQ0FMTCcsXG4gICAgQWNjb3VudEZ1bmRpbmcgPSAnQUNDT1VOVF9GVU5ESU5HJyxcbiAgICBBdXRvUmVmdW5kID0gJ0FVVE9fUkVGVU5EJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgZm9yIGEgV2FsbGV0IFRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbCB7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCYWNzIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDUztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsIHwgbnVsbDtcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB3YWxsZXQgdHJhbnNhY3Rpb24uIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgdGhlbiBhZnRlciBhIG1pbmltdW0gZGVsYXkgb2Ygb25lIG1pbnV0ZSwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdhbGxldCB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSB0cmFuc2FjdGlvbiB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCA2IHRvIDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyBvciBzcGFjZXMuIEVuc3VyZSB0aGF0IHRoZSBgcmVmZXJlbmNlYCBmaWVsZCBpcyB1bmlxdWUgZm9yIGVhY2ggdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdGluZ0Z1bmRTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGluZ19mdW5kX3NvdXJjZT86IE9yaWdpbmF0aW5nRnVuZFNvdXJjZSB8IG51bGw7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVycm9yIGNvZGUgb2YgYSBmYWlsZWQgdHJhbnNhY3Rpb24uIEVycm9yIGNvZGVzIGluY2x1ZGU6IGBFWFRFUk5BTF9TWVNURU1gOiBUaGUgdHJhbnNhY3Rpb24gd2FzIGRlY2xpbmVkIGJ5IGFuIGV4dGVybmFsIHN5c3RlbS4gYEVYUElSRURgOiBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBoYXMgZXhwaXJlZC4gYENBTkNFTExFRGA6IFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IHdhcyByZXNjaW5kZWQuIGBJTlZBTElEYDogVGhlIHRyYW5zYWN0aW9uIGRpZCBub3QgbWVldCBjZXJ0YWluIGNyaXRlcmlhLCBzdWNoIGFzIGFuIGluYWN0aXZlIGFjY291bnQgb3Igbm8gdmFsaWQgY291bnRlcnBhcnR5LCBldGMuIGBBQ0NPVU5UX0lOVkFMSURgOiBUaGUgdHJhbnNhY3Rpb24gY291bGQgbm90IGJlIHByb2Nlc3NlZCBiZWNhdXNlIHRoZSB3YWxsZXQgYWNjb3VudCBpcyBpbnZhbGlkIG9yIGluYWN0aXZlLiBgQVVUSEVOVElDQVRJT05fRkFJTEVEYDogVGhlIHRyYW5zYWN0aW9uIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSB3YWxsZXQgcHJvdmlkZXIgZmFpbGVkLiBgVU5LTk9XTmA6IFRoZSB0cmFuc2FjdGlvbiB3YXMgdW5zdWNjZXNzZnVsLCBidXQgdGhlIGV4YWN0IGNhdXNlIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24ge1xuICAgIEV4dGVybmFsU3lzdGVtID0gJ0VYVEVSTkFMX1NZU1RFTScsXG4gICAgRXhwaXJlZCA9ICdFWFBJUkVEJyxcbiAgICBDYW5jZWxsZWQgPSAnQ0FOQ0VMTEVEJyxcbiAgICBJbnZhbGlkID0gJ0lOVkFMSUQnLFxuICAgIEFjY291bnRJbnZhbGlkID0gJ0FDQ09VTlRfSU5WQUxJRCcsXG4gICAgQXV0aGVudGljYXRpb25GYWlsZWQgPSAnQVVUSEVOVElDQVRJT05fRkFJTEVEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uIHRvIGZldGNoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdCBhcmUgcmV0dXJuZWQgYXJlOiBgQkFOS19UUkFOU0ZFUjpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIGFuIGV4dGVybmFsIGJhbmsgdHJhbnNmZXIuICBgUEFZT1VUOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgZGlzYnVyc2luZyBmdW5kcyB0byBhIGNvdW50ZXJwYXJ0eS4gIGBQSVNfUEFZX0lOOmAgYSBwYXltZW50IHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBQbGFpZFxcJ3MgUGF5bWVudCBJbml0aWF0aW9uIFNlcnZpY2VzIChQSVMpIEFQSXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgW1BheW1lbnQgSW5pdGlhdGlvbiBlbmRwb2ludHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYFJFRlVORDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IHJlZnVuZGluZyBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQgbWFkZSB0aHJvdWdoIFBsYWlkXFwncyBbUElTIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYEZVTkRTX1NXRUVQYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBmdW5kcyBmcm9tIGFuIGUtd2FsbGV0IHRvIGEgZGVzaWduYXRlZCBjbGllbnQtb3duZWQgYWNjb3VudC4gIGBSRVRVUk5gOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hlcmUgYSBkZWJpdCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgYW5kIG1vbmV5IG1vdmVkIGJhY2sgdG8gb3JpZ2luYXRpbmcgYWNjb3VudC4gIGBSRUNBTExgOiBhIHRyYW5zYWN0aW9uIHdoZXJlIHRoZSBzZW5kaW5nIGJhbmsgaGFzIHJlcXVlc3RlZCB0aGUgcmV0dXJuIG9mIGZ1bmRzIGR1ZSB0byBhIGZyYXVkIGNsYWltLCB0ZWNobmljYWwgZXJyb3IsIG9yIG90aGVyIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC4gIGBBQ0NPVU5UX0ZVTkRJTkdgOiBhbiBpbmNvbWluZyB0cmFuc2ZlciBmcm9tIGFuIGFsbG93bGlzdGVkIGFjY291bnQuIE5vdCBhdXRvbWF0aWNhbGx5IHJlZnVuZGVkLiAgYEFVVE9fUkVGVU5EYDogYW4gb3V0Z29pbmcgcmVmdW5kIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGVkIGJ5IFBsYWlkIGluIHJlc3BvbnNlIHRvIGFuIHVuZXhwZWN0ZWQgYEJBTktfVFJBTlNGRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJU08gODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uUGF5ZWVWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXllZV92ZXJpZmljYXRpb25fc3RhdHVzPzogV2FsbGV0VHJhbnNhY3Rpb25QYXllZVZlcmlmaWNhdGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHdhbGxldCB0cmFuc2FjdGlvbnMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LlxuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF0ZWRfdHJhbnNhY3Rpb25zPzogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVR5cGVFbnVtIHtcbiAgICBCYW5rVHJhbnNmZXIgPSAnQkFOS19UUkFOU0ZFUicsXG4gICAgUGF5b3V0ID0gJ1BBWU9VVCcsXG4gICAgUGlzUGF5SW4gPSAnUElTX1BBWV9JTicsXG4gICAgUmVmdW5kID0gJ1JFRlVORCcsXG4gICAgRnVuZHNTd2VlcCA9ICdGVU5EU19TV0VFUCcsXG4gICAgUmV0dXJuID0gJ1JFVFVSTicsXG4gICAgUmVjYWxsID0gJ1JFQ0FMTCcsXG4gICAgQWNjb3VudEZ1bmRpbmcgPSAnQUNDT1VOVF9GVU5ESU5HJyxcbiAgICBBdXRvUmVmdW5kID0gJ0FVVE9fUkVGVU5EJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldCB0byBmZXRjaCB0cmFuc2FjdGlvbnMgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZS4gU2V0IHRoaXMgZnJvbSBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGluIHRoZSBwcmV2aW91cyBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSBpdC4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgd2FsbGV0IHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRoaDptbTpzc1opIGZvciBmaWx0ZXJpbmcgdHJhbnNhY3Rpb25zLCBpbmNsdXNpdmUgb2YgdGhlIHByb3ZpZGVkIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBzdGFydF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUaGg6bW06c3NaKSBmb3IgZmlsdGVyaW5nIHRyYW5zYWN0aW9ucywgaW5jbHVzaXZlIG9mIHRoZSBwcm92aWRlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZW5kX3RpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIG9mIGFuIGUtd2FsbGV0LCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGB3YWxsZXRfaWRgXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PFdhbGxldFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhhdCwgd2hlbiB1c2VkIGFzIHRoZSBvcHRpb25hbCBgY3Vyc29yYCBwYXJhbWV0ZXIgdG8gYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGAsIHdpbGwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHRyYW5zYWN0aW9uIGFzIGl0cyBmaXJzdCBlbnRyeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzdWx0IG9mIHBheWVlIHZlcmlmaWNhdGlvbiBjaGVjayBmb3IgRVVSIHBheW91dHMuIFBheWVlIHZlcmlmaWNhdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgcGF5ZWUgbmFtZSBwcm92aWRlZCBtYXRjaGVzIHRoZSBhY2NvdW50IGhvbGRlciBuYW1lIGF0IHRoZSBkZXN0aW5hdGlvbiBpbnN0aXR1dGlvbi4gIGBGVUxMX01BVENIYDogVGhlIHBheWVlIG5hbWUgZnVsbHkgbWF0Y2hlcyB0aGUgYWNjb3VudCBob2xkZXIuICBgUEFSVElBTF9NQVRDSGA6IFRoZSBwYXllZSBuYW1lIHBhcnRpYWxseSBtYXRjaGVzIHRoZSBhY2NvdW50IGhvbGRlci4gIGBOT19NQVRDSGA6IFRoZSBwYXllZSBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NvdW50IGhvbGRlci4gIGBFUlJPUmA6IEFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBwYXllZSB2ZXJpZmljYXRpb24uICBgQ0hFQ0tfTk9UX1BPU1NJQkxFYDogUGF5ZWUgdmVyaWZpY2F0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuICBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBhcHBsaWNhYmxlIEVVUiBwYXlvdXQgdHJhbnNhY3Rpb25zIGFuZCB3aWxsIGJlIGBudWxsYCBmb3Igb3RoZXIgdHJhbnNhY3Rpb24gdHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblBheWVlVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBGdWxsTWF0Y2ggPSAnRlVMTF9NQVRDSCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ1BBUlRJQUxfTUFUQ0gnLFxuICAgIE5vTWF0Y2ggPSAnTk9fTUFUQ0gnLFxuICAgIEVycm9yID0gJ0VSUk9SJyxcbiAgICBDaGVja05vdFBvc3NpYmxlID0gJ0NIRUNLX05PVF9QT1NTSUJMRSdcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbnMgYXJlIHJlbGF0ZWQgd2hlbiB0aGV5IGhhdmUgYSBsb2dpY2FsIGNvbm5lY3Rpb24uICBGb3IgZXhhbXBsZSwgYSBgUEFZT1VUYCB0cmFuc2FjdGlvbiBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIHNlbmRlciwgY3JlYXRpbmcgYSBgUkVUVVJOYCB0cmFuc2FjdGlvbi4gRWFjaCBgUEFZT1VUYCB0cmFuc2FjdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBjb3JyZXNwb25kaW5nIGBSRVRVUk5gIHRyYW5zYWN0aW9uIGluIGNhc2Ugb2YgcmV2ZXJzYWwuICBUaGVzZSByZWxhdGlvbnNoaXBzIGFyZSBiaS1kaXJlY3Rpb25hbCwgbWVhbmluZyB0aGF0IGJvdGggZW50aXRpZXMgaGF2ZSByZWZlcmVuY2VzIHRvIGVhY2ggb3RoZXIuIEZvciBpbnN0YW5jZSwgd2hlbiBhIHRyYW5zYWN0aW9uIG9mIHR5cGUgUkVUVVJOIG9jY3VycywgaXQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBiZWluZyByZXR1cm5lZC4gTGlrZXdpc2UsIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBoYXMgYSByZWZlcmVuY2UgYmFjayB0byB0aGUgUkVUVVJOIHRyYW5zYWN0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgcmV0dXJuLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgdHJhbnNhY3Rpb25zIG9mIHR5cGUgYFJFVFVSTmAsIGBGVU5EU19TV0VFUGAsIGBSRUZVTkRgIGFuZCBgUEFZT1VUYC4gIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIGBQSVNfUEFZX0lOYCBwYXltZW50IGFuZCBpdHMgY29ycmVzcG9uZGluZyBgUkVGVU5EYCB0cmFuc2FjdGlvbnMgaXMgb25seSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgYHJlZnVuZF9pZHNgIHByb3BlcnR5IGluIHRoZSBwYXltZW50IG9iamVjdC4gU2VlIFtgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtZ2V0LXJlc3BvbnNlLXJlZnVuZC1pZHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWxhdGVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb25cbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblxuICAgICAqL1xuICAgIHR5cGU/OiBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblR5cGVFbnVtIHtcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgdXBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZmV0Y2ggdHJhbnNhY3Rpb25zIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYmFzZTY0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuIFNldCB0aGlzIHRvIGBuZXh0X2N1cnNvcmAgcmVjZWl2ZWQgZnJvbSB0aGUgcHJldmlvdXMgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIHRoZSByZXNwb25zZSB3aWxsIG9ubHkgY29udGFpbiB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhhdCB0cmFuc2FjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhbiBBc3NldCBSZXBvcnQgdG8gYmUgcmV0dXJuZWQgd2l0aCBtaXNzaW5nIGFjY291bnQgb3duZXIgaW5mb3JtYXRpb24uIEluIHN1Y2ggY2FzZXMsIHRoZSBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgdHlwZSwgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEFTU0VUX1JFUE9SVF9XQVJOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBPV05FUlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IGFjY291bnQtb3duZXIgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gYElOVkVTVE1FTlRTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBJbnZlc3RtZW50cyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuIFRoZSBgQkFOS19JTkNPTUVfSU5TSUdIVFNfKmAgY29kZXMgYXBwbHkgdG8gdGhlIEJhbmsgSW5jb21lIGFkZC1vbjogYEJBTktfSU5DT01FX0lOU0lHSFRTX0lOU1VGRklDSUVOVF9EQVRBYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggZGF0YSB0byBjb21wdXRlIEJhbmsgSW5jb21lIEluc2lnaHRzOyBgQkFOS19JTkNPTUVfSU5TSUdIVFNfSU5DT01QTEVURWAgaW5kaWNhdGVzIHRoZSBCYW5rIEluY29tZSBJbnNpZ2h0cyBmbG93IHdhcyBub3QgY29tcGxldGVkOyBgQkFOS19JTkNPTUVfSU5TSUdIVFNfU1RBVFVTX0lOX1BST0dSRVNTYCBpbmRpY2F0ZXMgQmFuayBJbmNvbWUgSW5zaWdodHMgYXJlIHN0aWxsIGJlaW5nIGNvbXB1dGVkOyBgQkFOS19JTkNPTUVfSU5TSUdIVFNfSU5URVJOQUxfRVJST1JgIGluZGljYXRlcyBhbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb21wdXRpbmcgQmFuayBJbmNvbWUgSW5zaWdodHM7IGBCQU5LX0lOQ09NRV9JTlNJR0hUU19NSVNNQVRDSEVEX0RBWVNfUkVRVUVTVEVEYCBpbmRpY2F0ZXMgdGhlIGRheXMgcmVxdWVzdGVkIGZvciBCYW5rIEluY29tZSBJbnNpZ2h0cyBkaWQgbm90IG1hdGNoIHRoYXQgb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBXYXJuaW5nV2FybmluZ0NvZGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FybmluZ1dhcm5pbmdDb2RlRW51bSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBJbnZlc3RtZW50c1VuYXZhaWxhYmxlID0gJ0lOVkVTVE1FTlRTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIEJhbmtJbmNvbWVJbnNpZ2h0c0luc3VmZmljaWVudERhdGEgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfSU5TVUZGSUNJRU5UX0RBVEEnLFxuICAgIEJhbmtJbmNvbWVJbnNpZ2h0c0luY29tcGxldGUgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfSU5DT01QTEVURScsXG4gICAgQmFua0luY29tZUluc2lnaHRzU3RhdHVzSW5Qcm9ncmVzcyA9ICdCQU5LX0lOQ09NRV9JTlNJR0hUU19TVEFUVVNfSU5fUFJPR1JFU1MnLFxuICAgIEJhbmtJbmNvbWVJbnNpZ2h0c0ludGVybmFsRXJyb3IgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfSU5URVJOQUxfRVJST1InLFxuICAgIEJhbmtJbmNvbWVJbnNpZ2h0c01pc21hdGNoZWREYXlzUmVxdWVzdGVkID0gJ0JBTktfSU5DT01FX0lOU0lHSFRTX01JU01BVENIRURfREFZU19SRVFVRVNURUQnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlydGhfY2VydGlmaWNhdGVgIC0gQSBjZXJ0aWZpY2F0ZSBvZiBiaXJ0aCAgYGRyaXZlcnNfbGljZW5zZWAgLSBBIGxpY2Vuc2UgdG8gb3BlcmF0ZSBhIG1vdG9yIHZlaGljbGUgIGBpbW1pZ3JhdGlvbl9udW1iZXJgIC0gSW1taWdyYXRpb24gb3IgcmVzaWRlbmNlIGRvY3VtZW50cyAgYG1pbGl0YXJ5X2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBieSBhIG1pbGl0YXJ5IGdyb3VwICBgb3RoZXJgIC0gQW55IGRvY3VtZW50IG5vdCBjb3ZlcmVkIGJ5IG90aGVyIGNhdGVnb3JpZXMgIGBwYXNzcG9ydGAgLSBBbiBvZmZpY2lhbCBwYXNzcG9ydCBpc3N1ZWQgYnkgYSBnb3Zlcm5tZW50ICBgcGVyc29uYWxfaWRlbnRpZmljYXRpb25gIC0gQW55IGdlbmVyaWMgcGVyc29uYWwgaWRlbnRpZmljYXRpb24gdGhhdCBpcyBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcmF0aW9uX2NhcmRgIC0gSWRlbnRpZmljYXRpb24gdGhhdCBlbnRpdGxlcyB0aGUgaG9sZGVyIHRvIHJhdGlvbnMgIGBzc25gIC0gVW5pdGVkIFN0YXRlcyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyICBgc3R1ZGVudF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYW4gZWR1Y2F0aW9uYWwgaW5zdGl0dXRpb24gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzICBgdHJhdmVsX2RvY3VtZW50YCAtIFZpc2FzLCBlbnRyeSBwZXJtaXRzLCByZWZ1Z2VlIGRvY3VtZW50cywgZXRjLiAgYHZvdGVyX2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2Ygdm90aW5nXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGUge1xuICAgIEJpcnRoQ2VydGlmaWNhdGUgPSAnYmlydGhfY2VydGlmaWNhdGUnLFxuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSW1taWdyYXRpb25OdW1iZXIgPSAnaW1taWdyYXRpb25fbnVtYmVyJyxcbiAgICBNaWxpdGFyeUlkID0gJ21pbGl0YXJ5X2lkJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFBlcnNvbmFsSWRlbnRpZmljYXRpb24gPSAncGVyc29uYWxfaWRlbnRpZmljYXRpb24nLFxuICAgIFJhdGlvbkNhcmQgPSAncmF0aW9uX2NhcmQnLFxuICAgIFNzbiA9ICdzc24nLFxuICAgIFN0dWRlbnRJZCA9ICdzdHVkZW50X2lkJyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnLFxuICAgIFRyYXZlbERvY3VtZW50ID0gJ3RyYXZlbF9kb2N1bWVudCcsXG4gICAgVm90ZXJJZCA9ICd2b3Rlcl9pZCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBjaGFuZ2VzIHRvIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0Pn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaGl0czogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSByZXZpZXcgZm9yIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBjb25maXJtZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgY29uZmlybWVkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM/OiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmllbGRzIHRvIHJlc2V0IGJhY2sgdG8gbnVsbFxuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmaWVsZCB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIG51bGxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQge1xuICAgIEFzc2lnbmVlID0gJ2Fzc2lnbmVlJ1xufVxuXG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIGZyb20gYSBnb3Zlcm5tZW50IHdhdGNobGlzdCBvciBQRVAgbGlzdCB0aGF0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBzY3JlZW5pbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nIGhpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHJldmlld19zdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZmlyc3RfYWN0aXZlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGluYWN0aXZlX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgbGlzdF9jb2RlOiBJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXZlcnNhbCBpZGVudGlmaWVyIGZvciBhIHdhdGNobGlzdCBpbmRpdmlkdWFsIHRoYXQgaXMgc3RhYmxlIGFjcm9zcyBzZWFyY2hlcyBhbmQgdXBkYXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBwbGFpZF91aWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc291cmNlIHNhbmN0aW9uIG9yIHdhdGNobGlzdC4gV2hlbiBvbmUgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHNvdXJjZV91aWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3ViLXByb2dyYW0gZGVzaWduYXRpb25zIHRoYXQgbWF5IGJlIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3QgZW50cnkgYnkgdGhlIGlzc3VpbmcgYXV0aG9yaXR5LiBGb3IgT0ZBQyBTRE4gZW50cmllcyB0aGVzZSBhcmUgdGhlIHByb2dyYW0gY29kZXMgcHVibGlzaGVkIGluIHRoZSBTRE4gbGlzdCAoZm9yIGV4YW1wbGUgYFNER1RgIGZvciBTcGVjaWFsbHkgRGVzaWduYXRlZCBHbG9iYWwgVGVycm9yaXN0cywgYFNETlRLYCBmb3IgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmFyY290aWNzIFRyYWZmaWNraW5nIEtpbmdwaW5zLCBgSVJBTmAsIGBSVVNTSUEtRU8xNDAyNGApLiBOZXcgY29kZXMgYXJlIGFkZGVkIGJ5IHNhbmN0aW9uaW5nIGF1dGhvcml0aWVzIHdpdGhvdXQgcHJpb3Igbm90aWNlLCBzbyBjYWxsZXJzIHNob3VsZCB0cmVhdCB1bmtub3duIHZhbHVlcyBhcyBvcGFxdWUgc3RyaW5ncyByYXRoZXIgdGhhbiBlbnVtIG1lbWJlcnMuIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzdWJfcHJvZ3JhbXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NjcmVlbmluZ0hpdEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IFNjcmVlbmluZ0hpdEFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY3JlZW5pbmdIaXREYXRhfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBkYXRhPzogU2NyZWVuaW5nSGl0RGF0YTtcbn1cbi8qKlxuICogTG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBsb2NhdGlvbiBzdHJpbmcsIHBvdGVudGlhbGx5IGluY2x1ZGluZyBlbGVtZW50cyBsaWtlIHN0cmVldCwgY2l0eSwgcG9zdGFsIGNvZGVzIGFuZCBjb3VudHJ5IGNvZGVzLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYSBjb21wbGV0ZSBvciB3ZWxsLWZvcm1hdHRlZCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgcmV2aWV3LiBBbGwgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzIGJlZ2luIGluIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0ZSBidXQgY2FuIGJlIGNoYW5nZWQgYnkgY3JlYXRpbmcgYSByZXZpZXcuIFdoZW4gYSBoaXQgaXMgaW4gdGhlIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUsIGl0IHdpbGwgYWx3YXlzIHNob3cgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSB3YXRjaGxpc3QgZGF0YSBQbGFpZCBoYXMgYXZhaWxhYmxlIGFuZCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBsYXRlc3QgY3VzdG9tZXIgaW5mb3JtYXRpb24gc2F2ZWQgaW4gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcuIE9uY2UgYSBoaXQgaGFzIGJlZW4gbWFya2VkIGFzIGBjb25maXJtZWRgIG9yIGBkaXNtaXNzZWRgIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIHVwZGF0ZWQgc28gdGhhdCB0aGUgc3RhdGUgaXMgYXMgaXQgd2FzIHdoZW4gdGhlIHJldmlldyB3YXMgZmlyc3QgY29uZHVjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzIHtcbiAgICBDb25maXJtZWQgPSAnY29uZmlybWVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBEaXNtaXNzZWQgPSAnZGlzbWlzc2VkJ1xufVxuXG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBFaXRoZXIgYSBgdXNlcl9pZGAgb3IgdGhlIGBjbGllbnRfdXNlcl9pZGAgbXVzdCBiZSBwcm92aWRlZC4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSGl0Pn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaGl0czogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSGl0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIElELCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHByb2dyYW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBpbmRpdmlkdWFscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIEluZGl2aWR1YWxzXFxcIiwgXFxcIlVTIENhcmRob2xkZXJzXFxcIiwgb3IgXFxcIkFwcGxpY2FudHNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQXJjaGl2ZWQgcHJvZ3JhbXMgYXJlIHJlYWQtb25seSBhbmQgY2Fubm90IHNjcmVlbiBuZXcgY3VzdG9tZXJzIG5vciBwYXJ0aWNpcGF0ZSBpbiBvbmdvaW5nIG1vbml0b3JpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zIGZvciBpbmRpdmlkdWFsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHR5cGUge0FycmF5PEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbXM6IEFycmF5PEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgc2NyZWVuaW5nIHJldmlld1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgY29uZmlybWVkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyB0byBtYXJrIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBjb25maXJtZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHJldmlld3MgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2Ygc2NyZWVuaW5nIHJldmlld3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2Ygc2NyZWVuaW5nIHJldmlld3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3Pn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfcmV2aWV3czogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBlZGl0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zPzogVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJRCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIEVpdGhlciBhIGB1c2VyX2lkYCBvciB0aGUgYGNsaWVudF91c2VyX2lkYCBtdXN0IGJlIHByb3ZpZGVkLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0byByZXNldCBiYWNrIHRvIG51bGxcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmllbGQgdGhhdCBjYW4gYmUgcmVzZXQgYmFjayB0byBudWxsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gRWl0aGVyIGEgYHVzZXJfaWRgIG9yIHRoZSBgY2xpZW50X3VzZXJfaWRgIG11c3QgYmUgcHJvdmlkZWQuIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJldmlldyBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGNvbmZpcm1lZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc2VhcmNoIHRlcm1zLiBTdGFydHMgYXQgYDFgIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBlZGl0IHRvIGBzZWFyY2hfdGVybXNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHNjcmVlbmluZyBpcyBzdGlsbCBwZW5kaW5nIHJldmlldywgaGFzIGJlZW4gcmVqZWN0ZWQsIG9yIGhhcyBiZWVuIGNsZWFyZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXMge1xuICAgIFJlamVjdGVkID0gJ3JlamVjdGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBDbGVhcmVkID0gJ2NsZWFyZWQnXG59XG5cbi8qKlxuICogTmFtZXMgdGhhdCBhcmUgZXhwbGljaXRseSBtYXJrZWQgYXMgbG93IHF1YWxpdHkgZWl0aGVyIGJ5IHRoZWlyIGBzb3VyY2VgIGxpc3QsIG9yIGJ5IGBwbGFpZGAgYnkgYSBzZXJpZXMgb2YgYWRkaXRpb25hbCBjaGVja3MgZG9uZSBieSBQbGFpZC4gUGxhaWQgZG9lcyBub3QgZXZlciBzdXJmYWNlIGEgaGl0IGFzIGEgcmVzdWx0IG9mIGEgd2VhayBuYW1lIGFsb25lLiBJZiBhIG5hbWUgaGFzIG5vIHF1YWxpdHkgaXNzdWVzLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG5vbmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbiB7XG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBTb3VyY2UgPSAnc291cmNlJyxcbiAgICBQbGFpZCA9ICdwbGFpZCdcbn1cblxuLyoqXG4gKiBUaGUgUGxhaWQgZW52aXJvbm1lbnQgdGhlIHdlYmhvb2sgd2FzIHNlbnQgZnJvbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va0Vudmlyb25tZW50VmFsdWVzIHtcbiAgICBTYW5kYm94ID0gJ3NhbmRib3gnLFxuICAgIFByb2R1Y3Rpb24gPSAncHJvZHVjdGlvbidcbn1cblxuLyoqXG4gKiBUaGUgd2ViaG9vayB0eXBlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWJob29rVHlwZSB7XG4gICAgQXV0aCA9ICdBVVRIJyxcbiAgICBIb2xkaW5ncyA9ICdIT0xESU5HUycsXG4gICAgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnMgPSAnSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TJyxcbiAgICBJdGVtID0gJ0lURU0nLFxuICAgIExpYWJpbGl0aWVzID0gJ0xJQUJJTElUSUVTJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAnVFJBTlNBQ1RJT05TJyxcbiAgICBBc3NldHMgPSAnQVNTRVRTJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3Mgd2ViaG9vayBpcyB1cGRhdGVkLiBUaGlzIHdpbGwgYmUgc2VudCB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfd2ViaG9va191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBJRCAoIGBraWRgICkgZnJvbSB0aGUgSldUIGhlYWRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGtleV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0pXS1B1YmxpY0tleX1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAga2V5OiBKV0tQdWJsaWNLZXk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogWWVhci10by1kYXRlIHByZS10YXggZWFybmluZ3MsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogWWVhci10by1kYXRlIGVhcm5pbmdzIGFmdGVyIGFueSB0YXggd2l0aGhvbGRpbmdzLCBiZW5lZml0IHBheW1lbnRzIG9yIGRlZHVjdGlvbnMsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBmaXhlZCBpbmNvbWUgc2VjdXJpdHlcXCdzIGV4cGVjdGVkIHJhdGUgb2YgcmV0dXJuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZaWVsZFJhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZaWVsZFJhdGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXhlZCBpbmNvbWUgc2VjdXJpdHlcXCdzIGV4cGVjdGVkIHJhdGUgb2YgcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlpZWxkUmF0ZVxuICAgICAqL1xuICAgIHBlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7WWllbGRSYXRlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgWWllbGRSYXRlXG4gICAgICovXG4gICAgdHlwZTogWWllbGRSYXRlVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIHJhdGUgd2hpY2ggaW5kaWNhdGVzIGhvdyB0aGUgcHJlZGljdGVkIHlpZWxkIHdhcyBjYWxjdWxhdGVkLiBJdCBpcyBvbmUgb2Y6ICBgY291cG9uYDogdGhlIGFubnVhbGl6ZWQgaW50ZXJlc3QgcmF0ZSBmb3Igc2VjdXJpdGllcyB3aXRoIGEgb25lLXllYXIgdGVybSBvciBsb25nZXIsIHN1Y2ggYXMgdHJlYXN1cnkgbm90ZXMgYW5kIGJvbmRzLiAgYGNvdXBvbl9lcXVpdmFsZW50YDogdGhlIGNhbGN1bGF0ZWQgZXF1aXZhbGVudCBmb3IgdGhlIGFubnVhbGl6ZWQgaW50ZXJlc3QgcmF0ZSBmYWN0b3JpbmcgaW4gdGhlIGRpc2NvdW50IHJhdGUgYW5kIHRpbWUgdG8gbWF0dXJpdHksIGZvciBzaG9ydGVyIHRlcm0sIG5vbi1pbnRlcmVzdC1iZWFyaW5nIHNlY3VyaXRpZXMgc3VjaCBhcyB0cmVhc3VyeSBiaWxscy4gIGBkaXNjb3VudGA6IHRoZSByYXRlIGF0IHdoaWNoIHRoZSBwcmVzZW50IHZhbHVlIG9yIGNvc3QgaXMgZGlzY291bnRlZCBmcm9tIHRoZSBmdXR1cmUgdmFsdWUgdXBvbiBtYXR1cml0eSwgYWxzbyBrbm93biBhcyB0aGUgZmFjZSB2YWx1ZS4gIGB5aWVsZGA6IHRoZSB0b3RhbCBwcmVkaWN0ZWQgcmF0ZSBvZiByZXR1cm4gZmFjdG9yaW5nIGluIGJvdGggdGhlIGRpc2NvdW50IHJhdGUgYW5kIHRoZSBjb3Vwb24gcmF0ZSwgYXBwbGljYWJsZSB0byBzZWN1cml0aWVzIHN1Y2ggYXMgZXhjaGFuZ2UtdHJhZGVkIGJvbmRzIHdoaWNoIGNhbiBib3RoIGJlIGludGVyZXN0LWJlYXJpbmcgYXMgd2VsbCBhcyBzb2xkIGF0IGEgZGlzY291bnQgb2ZmIHRoZWlyIGZhY2UgdmFsdWUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBZaWVsZFJhdGVUeXBlIHtcbiAgICBDb3Vwb24gPSAnY291cG9uJyxcbiAgICBDb3Vwb25FcXVpdmFsZW50ID0gJ2NvdXBvbl9lcXVpdmFsZW50JyxcbiAgICBEaXNjb3VudCA9ICdkaXNjb3VudCcsXG4gICAgWWllbGQgPSAneWllbGQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlkXFwncyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdDsgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgTm90ZTogSWYgeW91IGFyZSBnZXR0aW5nIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgcHVycG9zZSBvZiBhc3Nlc3NpbmcgdGhlIHJldHVybiByaXNrIG9mIGEgcHJvcG9zZWQgQUNIIHRyYW5zYWN0aW9uLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYC9zaWduYWwvZXZhbHVhdGVgIGluc3RlYWQgb2YgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuIGAvc2lnbmFsL2V2YWx1YXRlYCByZXR1cm5zIHRoZSBzYW1lIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uIGFuZCBhbHNvIHByb3ZpZGVzIGFjY2VzcyB0byBTaWduYWwgUnVsZXMsIHdoaWNoIHByb3ZpZGVzIG5vLWNvZGUgdHJhbnNhY3Rpb24gYnVzaW5lc3MgbG9naWMgY29uZmlndXJhdGlvbiwgYmFja3Rlc3RpbmcgYW5kIHJlY29tbWVuZGF0aW9ucyBmb3IgdHVuaW5nIHlvdXIgdHJhbnNhY3Rpb24gYWNjZXB0YW5jZSBsb2dpYywgYW5kIHRoZSBhYmlsaXR5IHRvIGVhc2lseSBzd2l0Y2ggYmV0d2VlbiBCYWxhbmNlIGFuZCBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzIGFzIG5lZWRlZCBmb3IgdWx0cmEtbG93LWxhdGVuY3ksIE1MLXBvd2VyZWQgcmlzayBhc3Nlc3NtZW50cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbQmFsYW5jZSBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvI2JhbGFuY2UtaW50ZWdyYXRpb24tb3B0aW9ucykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNCYWxhbmNlR2V0OiBhc3luYyAoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0JhbGFuY2VHZXQnLCAnYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCcsIGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyAtLSB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50cyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0OiBhc3luYyAoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYWNjb3VudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0dldCcsICdhY2NvdW50c0dldFJlcXVlc3QnLCBhY2NvdW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhY2NvdW50c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldDogYXN5bmMgKGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FwcGxpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXBwbGljYXRpb25HZXQnLCAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JywgYXBwbGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hcHBsaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gdGhlIEdTRXMgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0JywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHkgaW4gUERGIGZvcm1hdC4gVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0aGF0IHdhcyBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0OiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldCcsICdhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydENyZWF0ZScsICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0RmlsdGVyOiBhc3luYyAoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEZpbHRlcicsICdhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QnLCBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0R2V0JywgJ2Fzc2V0UmVwb3J0R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFBkZkdldDogYXN5bmMgKGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRQZGZHZXQnLCAnYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaDogYXN5bmMgKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZWZyZXNoJywgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnLCBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZW1vdmU6IGFzeW5jIChhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UmVtb3ZlJywgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcsIGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcsIHNhdmluZ3MsIGFuZCBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoR2V0OiBhc3luYyAoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2F1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhdXRoR2V0JywgJ2F1dGhHZXRSZXF1ZXN0JywgYXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2F1dGgvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGF1dGhHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvdmVyaWZ5YCBlbmRwb2ludCB2ZXJpZmllcyBiYW5rIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyBhbmQgKG9wdGlvbmFsbHkpIGFjY291bnQgb3duZXIgbmFtZXMgYWdhaW5zdCBQbGFpZFxcJ3MgZGF0YWJhc2UgdmlhIFtEYXRhYmFzZSBBdXRoXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvZGF0YWJhc2UtYXV0aC8pLiBJdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYWNjb3VudCBudW1iZXJzIHRoYXQgd2VyZSBub3QgY29sbGVjdGVkIHZpYSB0aGUgUGxhaWQgTGluayBmbG93LiAgVGhpcyBlbmRwb2ludCBpcyBjdXJyZW50bHkgaW4gRWFybHkgQXZhaWxhYmlsaXR5OyBjb250YWN0IHNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBWZXJpZnkgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aFZlcmlmeVJlcXVlc3R9IGF1dGhWZXJpZnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aFZlcmlmeTogYXN5bmMgKGF1dGhWZXJpZnlSZXF1ZXN0OiBBdXRoVmVyaWZ5UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhdXRoVmVyaWZ5UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aFZlcmlmeScsICdhdXRoVmVyaWZ5UmVxdWVzdCcsIGF1dGhWZXJpZnlSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL3ZlcmlmeWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhdXRoVmVyaWZ5UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQmFsYW5jZUdldCcsICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsOiBhc3luYyAoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDYW5jZWwnLCAnYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGU6IGFzeW5jIChiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNyZWF0ZScsICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0OiBhc3luYyAoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJFdmVudExpc3QnLCAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmM6IGFzeW5jIChiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckV2ZW50U3luYycsICdiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JywgYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyR2V0JywgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdDogYXN5bmMgKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTGlzdCcsICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudDogYXN5bmMgKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQnLCAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldDogYXN5bmMgKGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyU3dlZXBHZXQnLCAnYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdCcsICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgdG8gZ2V0IHJpc2sgaW5zaWdodHMgZm9yIGEgbGlua2VkIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBFdmFsdWF0ZSByaXNrIG9mIGEgYmFuayBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3R9IGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZTogYXN5bmMgKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZScsICdiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCcsIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25EdXBsaWNhdGVHZXQ6IGFzeW5jIChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0OiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvbkR1cGxpY2F0ZUdldCcsICdiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0JywgYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL2R1cGxpY2F0ZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydENyZWF0ZTogYXN5bmMgKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Q6IEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0Q3JlYXRlJywgJ2JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QnLCBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgSUQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldDogYXN5bmMgKGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0R2V0JywgJ2JlYWNvblJlcG9ydEdldFJlcXVlc3QnLCBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0TGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0TGlzdCcsICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcsIGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0OiBhc3luYyAoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldCcsICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QnLCBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0JywgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QnLCBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYWxsIEFjY291bnRzIGxpbmtlZCB0byB0aGlzIEJlYWNvbiBVc2VyLiBUaGUgaW5zaWdodHMgZm9yIGVhY2ggYWNjb3VudCBhcmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3R9IGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldDogYXN5bmMgKGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldCcsICdiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCcsIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9hY2NvdW50X2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckNyZWF0ZTogYXN5bmMgKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlckNyZWF0ZScsICdiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCcsIGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBCZWFjb24gVXNlci4gIFRoZSBCZWFjb24gVXNlciBpcyByZXR1cm5lZCB3aXRoIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBhIGBzdGF0dXNgIGJhc2VkIG9uIHRoZSBCZWFjb24gTmV0d29yayBkdXBsaWNhdGUgcmVjb3JkIGFuZCBmcmF1ZCBjaGVja3MuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0OiBhc3luYyAoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyR2V0JywgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JywgYmVhY29uVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBCZWFjb24gVXNlciBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IGEgQmVhY29uIFVzZXJcXCdzIGhpc3RvcnlcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0fSBiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckhpc3RvcnlMaXN0OiBhc3luYyAoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VySGlzdG9yeUxpc3QnLCAnYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCcsIGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYHJlamVjdGVkYCwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBjbGVhcmVkYCwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgY2xlYXJlZGAuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBwZW5kaW5nX3Jldmlld2AuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJSZXZpZXc6IGFzeW5jIChiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJSZXZpZXcnLCAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnLCBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvcmV2aWV3YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtIG9yIGFkZCBuZXcgYWNjb3VudHMgdG8gdGhlIEJlYWNvbiBVc2VyLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGFuIGlkZW50aXR5IGRhdGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdH0gYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyVXBkYXRlOiBhc3luYyAoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyVXBkYXRlJywgJ2JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0JywgYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL2V3YV9yZXBvcnQvdjEvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhbiBFYXJuZWQgV2FnZSBBY2Nlc3MgKEVXQSkgc2NvcmUgdGhhdCBxdWFudGlmaWVzIHRoZSBkZWxpbnF1ZW5jeSByaXNrIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGl0ZW0uIFRoZSBzY29yZSBpcyBkZXJpdmVkIGZyb20gYSBjb21iaW5hdGlvbiBvZiBjYXNoZmxvdyBwYXR0ZXJucyBhbmQgbmV0d29yay1iYXNlZCBiZWhhdmlvcmFsIGZlYXR1cmVzLiAgVGhlIHJlc3BvbnNlIHJldHVybnMgYSBsaXN0IG9mIEVXQSBzY29yZXMsIHdoZXJlIGVhY2ggc2NvcmUgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWwgYWR2YW5jZSBhbW91bnQgcmFuZ2UuIFRoZXNlIHNjb3JlcyBlc3RpbWF0ZSB0aGUgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQgZm9yIGFkdmFuY2VzIHdpdGhpbiB0aGF0IHJhbmdlLiAgU2NvcmUgcmFuZ2U6IDEtOTkgIEludGVycHJldGF0aW9uOiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIGEgZ3JlYXRlciBsaWtlbGlob29kIG9mIHJlcGF5bWVudC4gIFRoaXMgZW5kcG9pbnQgZW5hYmxlcyBjbGllbnRzIHRvIGFzc2VzcyByZXBheW1lbnQgcmlzayBhbmQgbWFrZSBkYXRhLWRyaXZlbiBkZWNpc2lvbnMgd2hlbiBkZXRlcm1pbmluZyBlbGlnaWJpbGl0eSBvciBsaW1pdHMgZm9yIGVhcm5lZCB3YWdlIGFkdmFuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgRVdBIFNjb3JlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JldGFFd2FSZXBvcnRWMUdldFJlcXVlc3R9IGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZXRhRXdhUmVwb3J0VjFHZXQ6IGFzeW5jIChiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0OiBCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JldGFFd2FSZXBvcnRWMUdldCcsICdiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0JywgYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9ld2FfcmVwb3J0L3YxL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIHJlY29yZC4gWW91IGNhbiBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgeW91IGhhdmUgYXZhaWxhYmxlLiBJZiBhbnkgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgbWlzc2luZyBmb3IgdGhlIHByb2R1Y3RzIHlvdSBpbnRlbmQgdG8gdXNlLCBpdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgYHJlcXVpcmVtZW50c19kdWVgIGZpZWxkIG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZTogYXN5bmMgKGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3Q6IEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlJywgJ2JldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QnLCBiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZXRhaWxzIG9mIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0fSBiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0OiBhc3luYyAoYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdDogQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZXRhUGFydG5lckN1c3RvbWVyVjFHZXQnLCAnYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCcsIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIGVuZCBjdXN0b21lciByZWNvcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYW4gZXhpc3RpbmcgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1c2luZXNzIHZlcmlmaWNhdGlvbiB0byBjaGVjayBhIGJ1c2luZXNzXFwncyBpZGVudGl0eSBhbmQgcmlzayBwcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdidXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZScsICdidXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBidXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2J1c2luZXNzX3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgc3BlY2lmaWMgYnVzaW5lc3MgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0OiBhc3luYyAoYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdidXNpbmVzc1ZlcmlmaWNhdGlvbkdldCcsICdidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QnLCBidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2J1c2luZXNzX3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9jYXNoZmxvd19yZXBvcnQvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYGNhc2hmbG93X3JlcG9ydGAsIG9yIGlmIGl0IHdhc25cXCd0LCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXRzIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0R2V0OiBhc3luYyAoY2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0OiBDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXNoZmxvd1JlcG9ydEdldCcsICdjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QnLCBjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9pbnNpZ2h0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyBpbnNpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBJbnNpZ2h0cyBhcmUgb25seSBjYWxjdWxhdGVkIG9uIGNyZWRpdCBhbmQgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyBpbnNpZ2h0cyBkYXRhIGluIENhc2hmbG93IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQ6IGFzeW5jIChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQnLCAnY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3QnLCBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY2FzaGZsb3dfcmVwb3J0L2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCBpcyBhbiBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbSAoZ2l2ZW4gYW4gYGl0ZW1faWRgKS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgQ2FzaGZsb3cgUmVwb3J0IGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiAgQWZ0ZXIgY2FsbGluZyBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCBhbGVydGluZyBjbGllbnRzIHRoYXQgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGNhbiB0aGVuIGJlIGluZ2VzdGVkIHZpYSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIG9yIHRoZSB3ZWJob29rIHdpbGwgY29udGFpbiBhbiBlcnJvciBjb2RlIGluZm9ybWluZyB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmVmcmVzaGluZyB0cmFuc2FjdGlvbnMgZGF0YS4gIE5vdGUgdGhhdCB0aGUgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKS4gSWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2QgZm9yIHJlcXVlc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2FzaGZsb3dSZXBvcnRSZWZyZXNoOiBhc3luYyAoY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXNoZmxvd1JlcG9ydFJlZnJlc2gnLCAnY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCcsIGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYGhhc19tb3JlYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBOb3RlIHRoYXQgZGF0YSBpc25cXCd0IGxpa2VseSB0byBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgY2FzaGZsb3dfcmVwb3J0YCwgb3IgaWYgaXQgd2FzblxcJ3QsIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBDQVNIRkxPV19SRVBPUlRfUkVBRFlgIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldHMgdHJhbnNhY3Rpb24gZGF0YSBpbiBgY2FzaGZsb3dfcmVwb3J0YFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXQ6IGFzeW5jIChjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0JywgJ2Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIGNhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gbGVnYWN5IGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIFt1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pIGluc3RlYWQgb2YgdGhlIGxlZ2FjeSBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGxlZ2FjeSBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldDogYXN5bmMgKGJvZHk6IG9iamVjdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdib2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXRlZ29yaWVzR2V0JywgJ2JvZHknLCBib2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jYXRlZ29yaWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChib2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBJdGVtIGNvbnNlbnQgZXZlbnRzLiBDb25zZW50IGxvZ3MgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBldmVudHMgb2NjdXJyaW5nIG9uIG9yIGFmdGVyIE5vdmVtYmVyIDcsIDIwMjQuIEV4dHJlbWVseSByZWNlbnQgZXZlbnRzIChvY2N1cnJpbmcgd2l0aGluIHRoZSBwYXN0IDEyIGhvdXJzKSBtYXkgbm90IGJlIGF2YWlsYWJsZSB2aWEgdGhpcyBlbmRwb2ludC4gVXAgdG8gdGhyZWUgeWVhcnMgb2YgY29uc2VudCBsb2dzIHdpbGwgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc2VudEV2ZW50c0dldFJlcXVlc3R9IGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc2VudEV2ZW50c0dldDogYXN5bmMgKGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0OiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjb25zZW50RXZlbnRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY29uc2VudEV2ZW50c0dldCcsICdjb25zZW50RXZlbnRzR2V0UmVxdWVzdCcsIGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jb25zZW50L2V2ZW50cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIGFsbCBleGlzdGluZyBDUkIgQmFuayBJbmNvbWUgYW5kIEJhc2UgcmVwb3J0cyBmb3IgdGhlIGNvbnN1bWVyIGluIFBERiBmb3JtYXQuICBSZXNwb25zZSBpcyBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBERiBSZXBvcnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdW1lclJlcG9ydFBkZkdldDogYXN5bmMgKGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdDogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY29uc3VtZXJSZXBvcnRQZGZHZXQnLCAnY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0JywgY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jb25zdW1lcl9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldCcsICdjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9iYXNlX3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBvYXV0aDIgcmVxdWlyZWRcbiAgICAgICAgICAgIC8vIG9hdXRoIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRPQXV0aFRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIm9hdXRoMlwiLCBbXCJjcmE6cmVwb3J0OnJlYWRcIl0sIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0JywgJ2NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2Nhc2hmbG93X2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIG9hdXRoMiByZXF1aXJlZFxuICAgICAgICAgICAgLy8gb2F1dGggcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldE9BdXRoVG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwib2F1dGgyXCIsIFtcImNyYTpyZXBvcnQ6cmVhZFwiXSwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIHRvIHJlZnJlc2ggZGF0YSBpbiBhbiBleGlzdGluZyByZXBvcnQuIEEgQ29uc3VtZXIgUmVwb3J0IHdpbGwgbGFzdCBmb3IgMjQgaG91cnMgYmVmb3JlIGV4cGlyaW5nOyB5b3Ugc2hvdWxkIGNhbGwgYW55IGAvZ2V0YCBlbmRwb2ludHMgb24gdGhlIHJlcG9ydCBiZWZvcmUgaXQgZXhwaXJlcy4gSWYgYSByZXBvcnQgZXhwaXJlcywgeW91IGNhbiBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGFnYWluIHRvIHJlLWdlbmVyYXRlIGl0IGFuZCByZWZyZXNoIHRoZSBkYXRhIGluIHRoZSByZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggb3IgY3JlYXRlIGEgQ29uc3VtZXIgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydENyZWF0ZTogYXN5bmMgKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRDcmVhdGUnLCAnY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBOT1RFOiBUaGUgZm9sbG93aW5nIHNjaGVtYSB3YXMgdXBkYXRlZCBpbiBBcHJpbCAyMDI2IHRvIHJlZmxlY3QgdGhlIHJlc3BvbnNlIHdoZW4gdGhlIHByb3ZpZGVkIHZlcnNpb24gaXMgXFxcIklJMlxcXCIuIFBsZWFzZSBzZWUgW3RoaXMgZG9jdW1lbnRdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWtRa1E3Rk9nRmFDNG4tc1VHVWs3NGhvWFpOWV9MX25KZUN1TWU3S2VpcDQvZWRpdD90YWI9dC4wI2hlYWRpbmc9aC5ydWRhbXppbnVzMmkpIGZvciBndWlkYW5jZSBvbiBtaWdyYXRpbmcgdG8gSUkyIGlmIHlvdSBhcmUgY3VycmVudGx5IHVzaW5nIHRoZSBJSTEgdmVyc2lvbiwgYW5kIFt0aGlzIHNlY3Rpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWtRa1E3Rk9nRmFDNG4tc1VHVWs3NGhvWFpOWV9MX25KZUN1TWU3S2VpcDQvZWRpdD90YWI9dC4wI2Jvb2ttYXJrPWlkLnRkY2Myd3BrMGg2MCkgZm9yIGFuIGV4YW1wbGUgSUkxIHJlc3BvbnNlIGFsb25nIHdpdGggaXRzIFtkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMzZjODVuMmlyY3FrI2hlYWRpbmc9aC43OWR3cjVjMWlzemwpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmNvbWUgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBvYXV0aDIgcmVxdWlyZWRcbiAgICAgICAgICAgIC8vIG9hdXRoIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRPQXV0aFRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIm9hdXRoMlwiLCBbXCJjcmE6cmVwb3J0OnJlYWRcIl0sIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIExlbmRTY29yZSByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIExlbmRTY29yZSBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXQnLCAnY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2xlbmRfc2NvcmUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gb2F1dGgyIHJlcXVpcmVkXG4gICAgICAgICAgICAvLyBvYXV0aCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0T0F1dGhUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJvYXV0aDJcIiwgW1wiY3JhOnJlcG9ydDpyZWFkXCJdLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbmV0d29yayBhdHRyaWJ1dGVzIGZvciB0aGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0JywgJ2NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9uZXR3b3JrX2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIG9hdXRoMiByZXF1aXJlZFxuICAgICAgICAgICAgLy8gb2F1dGggcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldE9BdXRoVG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwib2F1dGgyXCIsIFtcImNyYTpyZXBvcnQ6cmVhZFwiXSwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQnLCAnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L3BhcnRuZXJfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQnkgZGVmYXVsdCwgdGhlIG1vc3QgcmVjZW50IEJhc2UgUmVwb3J0IChpZiBpdCBleGlzdHMpIGZvciB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkLiBUbyByZXF1ZXN0IHRoYXQgdGhlIG1vc3QgcmVjZW50IFBhcnRuZXIgSW5zaWdodHMgb3IgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFBERlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRQZGZHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0UGRmR2V0JywgJ2NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgaG9tZSBsZW5kaW5nIHJlcG9ydHMgZm9yIGEgdXNlci4gVG8gb2J0YWluIGEgVm9BIG9yIEVtcGxveW1lbnQgUmVmcmVzaCByZXBvcnQsIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGBjcmFfYmFzZV9yZXBvcnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdmFyaW91cyBob21lIGxlbmRpbmcgcmVwb3J0cyBmb3IgYSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXQnLCAnY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnQgQ29uc3VtZXIgUmVwb3J0IGluIFBERiBmb3JtYXQsIHNwZWNpZmljYWxseSBmb3JtYXR0ZWQgZm9yIEhvbWUgTGVuZGluZyB2ZXJpZmljYXRpb24gdXNlIGNhc2VzLiBCZWZvcmUgY2FsbGluZyB0aGlzIGVuZHBvaW50LCBlbnN1cmUgdGhhdCB5b3VcXCd2ZSBjcmVhdGVkIGEgVk9BIHJlcG9ydCB0aHJvdWdoIExpbmsgb3IgdGhlIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50LCBhbmQgaGF2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQ29uc3VtZXIgUmVwb3J0IGFzIGEgVmVyaWZpY2F0aW9uIFBERlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0JywgJ2NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY3JlZGl0X3Byb2ZpbGUvcmVwb3J0L2dldGAgcmV0cmlldmVzIGEgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IGZvciBhIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBjcmVkaXQgcHJvZmlsZSByZXBvcnQgZm9yIGEgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0fSBjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXQ6IGFzeW5jIChjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdDogQ3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXQnLCAnY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QnLCBjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NyZWRpdF9wcm9maWxlL3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYCByZWdpc3RlcnMgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXI6IGFzeW5jIChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXInLCAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnLCBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0fSBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zUmVnaXN0ZXI6IGFzeW5jIChjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdDogQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUxvYW5zUmVnaXN0ZXInLCAnY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QnLCBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2xvYW5zL3JlZ2lzdGVyYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VucmVnaXN0ZXJgIGluZGljYXRlcyB0aGUgbG9hbnMgaGF2ZSByZWFjaGVkIGEgZmluYWwgc3RhdHVzIGFuZCBubyBmdXJ0aGVyIHVwZGF0ZXMgYXJlIGV4cGVjdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVyIGEgbGlzdCBvZiBsb2Fuc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1VucmVnaXN0ZXI6IGFzeW5jIChjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0OiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUxvYW5zVW5yZWdpc3RlcicsICdjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0JywgY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2xvYW5zL3VucmVnaXN0ZXJgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91cGRhdGVgIHVwZGF0ZXMgbG9hbiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzdGF0dXMgYW5kIHBheW1lbnQgaGlzdG9yeS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGxvYW4gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVXBkYXRlUmVxdWVzdH0gY3JhTG9hbnNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNVcGRhdGU6IGFzeW5jIChjcmFMb2Fuc1VwZGF0ZVJlcXVlc3Q6IENyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUxvYW5zVXBkYXRlJywgJ2NyYUxvYW5zVXBkYXRlUmVxdWVzdCcsIGNyYUxvYW5zVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2xvYW5zL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGEgQ2FzaCBGbG93IFVwZGF0ZXMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX2lkYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0OiBhc3luYyAoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCcsIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbGlua2VkIENSQSBJdGVtLCB3aGljaCBhcmUgdXBkYXRlZCBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5IChiZXN0LWVmZm9ydCkuIEluIHRoZSBjdXJyZW50IENhc2ggRmxvdyBVcGRhdGVzIGJldGEgZXhwZXJpZW5jZSwgb25seSBvbmUgSXRlbSBwZXIgdXNlciBtYXkgYmUgc3Vic2NyaWJlZCBmb3IgbW9uaXRvcmluZyB1cGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmU6IGFzeW5jIChjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZScsICdjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0JywgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvc3Vic2NyaWJlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVuc3Vic2NyaWJlIGZyb20gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmU6IGFzeW5jIChjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlJywgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCcsIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL21vbml0b3JpbmdfaW5zaWdodHMvdW5zdWJzY3JpYmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YCByZXR1cm5zIGNhc2ggZmxvdyBpbnNpZ2h0cyBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFQYXJ0bmVySW5zaWdodHNHZXQ6IGFzeW5jIChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYVBhcnRuZXJJbnNpZ2h0c0dldCcsICdjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcmVwb3J0L2dldGAgcmV0cmlldmVzIGEgQ1JBIFJlcG9ydCBmb3IgYSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENSQSBSZXBvcnQgZm9yIHByb3ZpZGVkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFSZXBvcnRHZXRSZXF1ZXN0fSBjcmFSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhUmVwb3J0R2V0OiBhc3luYyAoY3JhUmVwb3J0R2V0UmVxdWVzdDogQ3JhUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFSZXBvcnRHZXQnLCAnY3JhUmVwb3J0R2V0UmVxdWVzdCcsIGNyYVJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYVJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlUGF5bWVudFRva2VuOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVhdGVQYXltZW50VG9rZW4nLCAncGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0OiBhc3luYyAocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlcXVlc3RCb2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIGNyZWF0ZSBhbiBBdWRpdCBDb3B5IHRva2VuIG9mIGFuIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCB0byBzaGFyZSB3aXRoIGEgcGFydGljaXBhdGluZyBHb3Zlcm5tZW50LVNwb25zb3JlZCBFbnRlcnByaXNlIChHU0UpIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiBGYW5uaWUgTWFlXFwncyBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSBvciB1dGlsaXplIEZyZWRkaWUgTWFjXFwncyBMb2FuIFByb2R1Y3QgQWR2aXNvcsKuIChMUEHCrikgQXNzZXQgYW5kIEluY29tZSBNb2RlbGVyIChBSU0pLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIEF1ZGl0IENvcHkgVG9rZW4gYnkgYWRkaW5nIHRoZSByZXBvcnQgdG9rZW5zIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQgdG8gdGhlIGBhdWRpdF9jb3B5X3Rva2VuYC4gSWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gYWxyZWFkeSBjb250YWlucyBhIHJlcG9ydCBvZiBhIGNlcnRhaW4gdHlwZSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b2tlbiBwcm92aWRlZCBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGU6IGFzeW5jIChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlJywgJ2NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCcsIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0OiBhc3luYyAoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rRW1wbG95bWVudEdldCcsICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnLCBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLiBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS4gVG8gcmV0dXJuIG9sZGVyIHJlcG9ydHMsIHVzZSB0aGUgYG9wdGlvbnMuY291bnRgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lR2V0OiBhc3luYyAoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lR2V0JywgJ2NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0OiBhc3luYyAoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lUGRmR2V0JywgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIGlzIGRlcHJlY2F0ZWQuIFRoZSBiYWNrZW5kIGltcGxlbWVudGF0aW9uIHdhcyByZW1vdmVkIChyZXR1cm5zIGFuIGBVbmltcGxlbWVudGVkYCBlcnJvciBhdCBydW50aW1lKSwgYW5kIHRoZSBlbmRwb2ludCBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgZG9jdW1lbnRlZCBBUEkgc3VyZmFjZS4gVG8gcmVmcmVzaCBCYW5rIEluY29tZSBkYXRhIGZvciBhbiBleGlzdGluZyB1c2VyLCBzZW5kIHRoZSB1c2VyIHRocm91Z2ggTGlua1xcJ3MgdXBkYXRlIG1vZGUgc28gdGhleSBjYW4gY29uZmlybSB0aGVpciBpbmNvbWUgc291cmNlcy4gRm9yIGEgZnVsbHkgYmFja2VuZCByZWZyZXNoLCBtaWdyYXRlIHRvIENSQSBJbmNvbWUgSW5zaWdodHMgYW5kIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlOiBhc3luYyAoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZScsICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0JywgJ2NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0OiBhc3luYyAoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JywgY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvZnJlZGRpZV9tYWMvcmVwb3J0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0IChha2EgVk9BIC0gVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyksIGFuZCBhIFZlcmlmaWNhdGlvbiBPZiBFbXBsb3ltZW50IChWT0UpIHJlcG9ydCBpZiB0aGlzIG9uZSBpcyBhdmFpbGFibGUuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQ6IGFzeW5jIChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0JywgJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCcsIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZUdldDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZUdldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChyZXF1ZXN0Qm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjazogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2gnLCAnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGByaXNrX3NpZ25hbHNgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0JywgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlDcmVhdGU6IGFzeW5jIChjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5Q3JlYXRlJywgJ2NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCcsIGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlHZXQ6IGFzeW5jIChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5R2V0JywgJ2NyZWRpdFJlbGF5R2V0UmVxdWVzdCcsIGNyZWRpdFJlbGF5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIFBERiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIFBERiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UGRmR2V0OiBhc3luYyAoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVBkZkdldCcsICdjcmVkaXRSZWxheVBERkdldFJlcXVlc3QnLCBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZWZyZXNoOiBhc3luYyAoY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVJlZnJlc2gnLCAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZW1vdmU6IGFzeW5jIChjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5UmVtb3ZlJywgJ2NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCcsIGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUnLCAnY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0JywgY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFNlc3Npb25zR2V0OiBhc3luYyAoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRTZXNzaW9uc0dldCcsICdjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QnLCBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9zZXNzaW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhYm91dCBhIHNwZWNpZmljIERhc2hib2FyZCB1c2VyIGJhc2VkIG9uIHRoZSBgZGFzaGJvYXJkX3VzZXJfaWRgIGZpZWxkLCB3aGljaCBpcyByZXR1cm5lZCBpbiB0aGUgYGF1ZGl0X3RyYWlsYCBvYmplY3Qgb2YgY2VydGFpbiBNb25pdG9yIGFuZCBCZWFjb24gZW5kcG9pbnRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyByZXZpZXdlciB3aG8gcGVyZm9ybWVkIGEgRGFzaGJvYXJkIGFjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBEYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJHZXQ6IGFzeW5jIChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJHZXQnLCAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnLCBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF1ZGl0IG9yIHRyYWNrIHRoZSBsaXN0IG9mIHJldmlld2VycyBmb3IgTW9uaXRvciwgQmVhY29uLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IERhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckxpc3Q6IGFzeW5jIChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJMaXN0JywgJ2Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCcsIGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZFxcJ3MgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95ZXJzU2VhcmNoOiBhc3luYyAoZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3llcnNTZWFyY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdlbXBsb3llcnNTZWFyY2gnLCAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcsIGVtcGxveWVyc1NlYXJjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2VtcGxveWVycy9zZWFyY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgZW1wbG95bWVudHMgdGhyb3VnaCBhIHVzZXIgcGF5cm9sbCB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0OiBhc3luYyAoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0JywgJ2VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgY29uc2VudCBncmFudCBieSBpdHMgaWRlbnRpZmllclxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgRkRYIENvbnNlbnQgR3JhbnRcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnNlbnRJZCBDb25zZW50IEdyYW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeENvbnNlbnRzR2V0OiBhc3luYyAoY29uc2VudElkOiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY29uc2VudElkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhDb25zZW50c0dldCcsICdjb25zZW50SWQnLCBjb25zZW50SWQpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9jb25zZW50cy97Y29uc2VudElkfWBcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgeyR7XCJjb25zZW50SWRcIn19YCwgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjb25zZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHplcm8gb3IgbW9yZSBjb25zZW50IGdyYW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGRhdGEgcHJvdmlkZXIgY3VzdG9tZXIsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgc3RhdHVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEZEWCBDb25zZW50IEdyYW50cyBmb3IgYSBjdXN0b21lclxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tZXJJZCBEYXRhIHByb3ZpZGVyIGN1c3RvbWVyIGlkZW50aWZpZXIgd2hvc2UgY29uc2VudCBncmFudHMgdG8gcmV0dXJuLlxuICAgICAgICAgKiBAcGFyYW0ge0ZEWENvbnNlbnRHcmFudFN0YXR1c30gW3N0YXR1c10gT3B0aW9uYWwgZmlsdGVyIHJlc3RyaWN0aW5nIHJlc3VsdHMgdG8gYSBzaW5nbGUgY29uc2VudCBncmFudCBzdGF0dXMuIE9uZSBvZiAmI3g2MDtBQ1RJVkUmI3g2MDssICYjeDYwO1JFVk9LRUQmI3g2MDssICYjeDYwO0VYUElSRUQmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhDb25zZW50c0xpc3Q6IGFzeW5jIChjdXN0b21lcklkOiBzdHJpbmcsIHN0YXR1cz86IEZEWENvbnNlbnRHcmFudFN0YXR1cywgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjdXN0b21lcklkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhDb25zZW50c0xpc3QnLCAnY3VzdG9tZXJJZCcsIGN1c3RvbWVySWQpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9jb25zZW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChjdXN0b21lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyWydjdXN0b21lcklkJ10gPSBjdXN0b21lcklkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyWydzdGF0dXMnXSA9IHN0YXR1cztcbiAgICAgICAgICAgIH1cblxuXG4gICAgXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHJldm9jYXRpb24gaGlzdG9yeSBvZiBhIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgRkRYIENvbnNlbnQgR3JhbnQgcmV2b2NhdGlvbiByZWNvcmRzXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhDb25zZW50c1Jldm9jYXRpb25HZXQ6IGFzeW5jIChjb25zZW50SWQ6IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjb25zZW50SWQnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZkeENvbnNlbnRzUmV2b2NhdGlvbkdldCcsICdjb25zZW50SWQnLCBjb25zZW50SWQpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9jb25zZW50cy97Y29uc2VudElkfS9yZXZvY2F0aW9uYFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcImNvbnNlbnRJZFwifX1gLCBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGNvbnNlbnRJZCkpKTtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGVuZHMgYSBSRVZPS0VEIHN0YXR1cyByZWNvcmQgdG8gdGhlIG5hbWVkIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIEZEWCBDb25zZW50IEdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Q29uc2VudHNSZXZva2U6IGFzeW5jIChjb25zZW50SWQ6IHN0cmluZywgcmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnNlbnRJZCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZmR4Q29uc2VudHNSZXZva2UnLCAnY29uc2VudElkJywgY29uc2VudElkKVxuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ZkeENvbnNlbnRzUmV2b2tlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9jb25zZW50cy97Y29uc2VudElkfS9yZXZvY2F0aW9uYFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcImNvbnNlbnRJZFwifX1gLCBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGNvbnNlbnRJZCkpKTtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BVVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zOiBhc3luYyAoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZkRYTm90aWZpY2F0aW9uJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhOb3RpZmljYXRpb25zJywgJ2ZEWE5vdGlmaWNhdGlvbicsIGZEWE5vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L25vdGlmaWNhdGlvbnNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZkRYTm90aWZpY2F0aW9uLCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnRJZCBSZWNpcGllbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50OiBhc3luYyAocmVjaXBpZW50SWQ6IHN0cmluZywgb0FVVEhTVEFURUlEPzogc3RyaW5nLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlY2lwaWVudElkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdnZXRSZWNpcGllbnQnLCAncmVjaXBpZW50SWQnLCByZWNpcGllbnRJZClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L3JlY2lwaWVudC97cmVjaXBpZW50SWR9YFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcInJlY2lwaWVudElkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcocmVjaXBpZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChvQVVUSFNUQVRFSUQgIT09IHVuZGVmaW5lZCAmJiBvQVVUSFNUQVRFSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnT0FVVEgtU1RBVEUtSUQnXSA9IFN0cmluZyhvQVVUSFNUQVRFSUQpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50czogYXN5bmMgKG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZHgvcmVjaXBpZW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHRvIHJldHJpZXZlIGlkZW50aXR5IGRldGFpbHMgd2hlbiB1c2luZyBbSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5L2lkZW50aXR5LWRvY3VtZW50LXVwbG9hZC8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0JywgJ2lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldDogYXN5bmMgKGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlHZXQnLCAnaWRlbnRpdHlHZXRSZXF1ZXN0JywgaWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2g6IGFzeW5jIChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5TWF0Y2gnLCAnaWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBpZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvbWF0Y2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlNYXRjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGZvciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2g6IGFzeW5jIChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5UmVmcmVzaCcsICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JywgaWRlbnRpdHlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vYXV0b2ZpbGwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgIGZpZWxkLiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgdHdvIGZpZWxkcyBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiBgdXNlcl9pZGAgaXMgcHJvdmlkZWQsIHRoZXJlIG11c3QgYmUgYW4gYXNzb2NpYXRlZCB1c2VyOyBvdGhlcndpc2UsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuICAgSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZXhpc3RzIGZvciBhIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgYW5kL29yIGB1c2VyX2lkYCwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGEgYDIwMCBPS2AgSFRUUCBzdGF0dXMgY29kZS4gICBJZiBgdXNlcl9pZGAgaXMgbm90IHByb3ZpZGVkLCB5b3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gSWYgYHVzZXJfaWRgIGlzIHByb3ZpZGVkLCB1c2VyIGluZm9ybWF0aW9uIGNhbiBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QgYm9keS4gUGxlYXNlIHVzZSB0aGUgYC91c2VyL3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHVzZXIgZGF0YSBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGU6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlJywgJ2lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkdldCcsICdpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3Q6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdCcsICdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5JywgJ2lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9yZXRyeWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGU6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZCcsICdpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldCcsICdpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2s6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrJywgJ2luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQ6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0JywgJ2luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvblxcJ3MgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnRcXCdzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luc3RpdHV0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldCcsICdpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JywgaW5zdGl0dXRpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0QnlJZDogYXN5bmMgKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zR2V0QnlJZCcsICdpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCcsIGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBwYXJhbWV0ZXJzIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBoYXMgc2luY2UgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zU2VhcmNoOiBhc3luYyAoaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNTZWFyY2gnLCAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcsIGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9zZWFyY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzQXV0aEdldDogYXN5bmMgKGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNBdXRoR2V0JywgJ2ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnLCBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgc3RvY2sgcG9zaXRpb24gZGF0YSBmb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNIb2xkaW5nc0dldDogYXN5bmMgKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNIb2xkaW5nc0dldCcsICdpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcsIGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnQgaG9sZGluZ3MgYW5kIHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFuZCBob2xkaW5ncyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGludmVzdG1lbnQgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1JlZnJlc2g6IGFzeW5jIChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0OiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzUmVmcmVzaCcsICdpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0JywgaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldDogYXN5bmMgKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQnLCAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGBJc3N1ZWAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIHNpbmdsZSBgSXNzdWVgIG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzR2V0UmVxdWVzdH0gaXNzdWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc0dldDogYXN5bmMgKGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXNzdWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXNzdWVzR2V0JywgJ2lzc3Vlc0dldFJlcXVlc3QnLCBpc3N1ZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pc3N1ZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlzc3Vlc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1NlYXJjaDogYXN5bmMgKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXNzdWVzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXNzdWVzU2VhcmNoJywgJ2lzc3Vlc1NlYXJjaFJlcXVlc3QnLCBpc3N1ZXNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pc3N1ZXMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlzc3Vlc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1N1YnNjcmliZVJlcXVlc3R9IGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpc3N1ZXNTdWJzY3JpYmU6IGFzeW5jIChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0OiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lzc3Vlc1N1YnNjcmliZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lzc3Vlc1N1YnNjcmliZScsICdpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0JywgaXNzdWVzU3Vic2NyaWJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXNzdWVzL3N1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZTogYXN5bmMgKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZScsICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcsIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdDogYXN5bmMgKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjdGl2aXR5TGlzdCcsICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcsIGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjdGl2aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0OiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25MaXN0JywgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZTogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlJywgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb25cXCdzIGFjY2VzcyB0byB0aGUgVXNlclxcJ3MgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25VbmxpbmsnLCAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbjogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUNyZWF0ZVB1YmxpY1Rva2VuJywgJ2l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1HZXQ6IGFzeW5jIChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1HZXQnLCAnaXRlbUdldFJlcXVlc3QnLCBpdGVtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQ6IGFzeW5jIChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUltcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1JbXBvcnQnLCAnaXRlbUltcG9ydFJlcXVlc3QnLCBpdGVtSW1wb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9pbXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUltcG9ydFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9wcm9kdWN0cy90ZXJtaW5hdGVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdGVybWluYXRlIGFuIEl0ZW0uIE9uY2UgdGVybWluYXRlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpcyBubyBsb25nZXIgdmFsaWQsIGJpbGxpbmcgZm9yIHRoZSBJdGVtXFwncyBwcm9kdWN0cyBpcyBlbmRlZCwgYW5kIHJlbGV2YW50IHdlYmhvb2tzIGFyZSBmaXJlZC4gIGAvaXRlbS9wcm9kdWN0cy90ZXJtaW5hdGVgIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gb2ZmYm9hcmQgdXNlcnMgb3IgZGlzY29ubmVjdCBhY2NvdW50cyBsaW5rZWQgdmlhIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUZXJtaW5hdGUgcHJvZHVjdHMgZm9yIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0fSBpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVByb2R1Y3RzVGVybWluYXRlOiBhc3luYyAoaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdDogSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtUHJvZHVjdHNUZXJtaW5hdGUnLCAnaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCcsIGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2U6IGFzeW5jIChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlJywgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgQ2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyBhIHJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2Ugd2hlbiBvZmZib2FyZGluZyB1c2VycyBvciBpZiBhIHVzZXIgY2hvb3NlcyB0byBkaXNjb25uZWN0IGFuIGFjY291bnQgbGlua2VkIHZpYSBQbGFpZC4gRm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cywgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIExpYWJpbGl0aWVzLCBhbmQgSW52ZXN0bWVudHMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgcmVxdWlyZWQgdG8gZW5kIHN1YnNjcmlwdGlvbiBiaWxsaW5nIGZvciB0aGUgSXRlbSwgdW5sZXNzIHRoZSBlbmQgdXNlciByZXZva2VkIHBlcm1pc3Npb24gKGUuZy4gdmlhIFtodHRwczovL215LnBsYWlkLmNvbS9dKGh0dHBzOi8vbXkucGxhaWQuY29tLykpLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1N1YnNjcmlwdGlvbiBmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNzdWJzY3JpcHRpb24tZmVlKS4gIE9uIGEgVHJpYWwgcGxhbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgVHJpYWwgSXRlbXMgKGJhbmsgY29ubmVjdGlvbnMpIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlOiBhc3luYyAoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtUmVtb3ZlJywgJ2l0ZW1SZW1vdmVSZXF1ZXN0JywgaXRlbVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyN3ZWJob29rX3VwZGF0ZV9hY2tub3dsZWRnZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtV2ViaG9va1VwZGF0ZTogYXN5bmMgKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVdlYmhvb2tVcGRhdGUnLCAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JywgaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaWFiaWxpdGllc0dldDogYXN5bmMgKGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlhYmlsaXRpZXNHZXQnLCAnbGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgbGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saWFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5Q3JlYXRlOiBhc3luYyAobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rRGVsaXZlcnlDcmVhdGUnLCAnbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCcsIGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5R2V0UmVxdWVzdH0gbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUdldDogYXN5bmMgKGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua0RlbGl2ZXJ5R2V0JywgJ2xpbmtEZWxpdmVyeUdldFJlcXVlc3QnLCBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rX2RlbGl2ZXJ5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBgcGF5bWVudF9pbml0aWF0aW9uYCBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBgbGlua190b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElEIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlOiBhc3luYyAobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UnLCAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcsIGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvb2F1dGgvY29ycmVsYXRpb25faWQvZXhjaGFuZ2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAuIEZvciBtb3N0IFBsYWlkIHByb2R1Y3RzLCB0aGUgYHB1YmxpY190b2tlbmAgaXMgc2F2ZWQgYW5kIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5DcmVhdGU6IGFzeW5jIChsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtUb2tlbkNyZWF0ZScsICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JywgbGlua1Rva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGluay90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIExpbmsgc2Vzc2lvbiwgaW5jbHVkaW5nIGFsbCBjYWxsYmFja3MgZmlyZWQgZHVyaW5nIHRoZSBzZXNzaW9uIGFsb25nIHdpdGggdGhlaXIgbWV0YWRhdGEsIGluY2x1ZGluZyB0aGUgcHVibGljIHRva2VuLiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgd2l0aCBMaW5rIGZsb3dzIHRoYXQgZG9uXFwndCBwcm92aWRlIGEgcHVibGljIHRva2VuIHZpYSBmcm9udGVuZCBjYWxsYmFja3MsIHN1Y2ggYXMgdGhlIFtIb3N0ZWQgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaG9zdGVkLWxpbmsvKSBhbmQgdGhlIFtNdWx0aS1JdGVtIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluay8pLiBJdCBhbHNvIGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gIEJ5IGRlZmF1bHQsIHRoaXMgZW5kcG9pbnQgd2lsbCBvbmx5IHJldHVybiBjb21wbGV0ZSBldmVudCBkYXRhIGZvciBIb3N0ZWQgTGluayBzZXNzaW9ucy4gVG8gdXNlIGAvbGluay90b2tlbi9nZXRgIHRvIHJldHJpZXZlIGV2ZW50IGRhdGEgZm9yIG5vbi1Ib3N0ZWQtTGluayBzZXNzaW9ucywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IHRoYXQgeW91ciBhY2NvdW50IGJlIGVuYWJsZWQgZm9yIExpbmsgZXZlbnRzLiBJZiB5b3UgZG8gbm90IGhhdmUgYW4gYWNjb3VudCBtYW5hZ2VyLCB5b3UgY2FuIHN1Ym1pdCB0aGlzIHJlcXVlc3QgdmlhIGEgc3VwcG9ydCB0aWNrZXQuIEVuYWJsZW1lbnQgZm9yIExpbmsgZXZlbnRzIHdpbGwgYWxzbyBjYXVzZSB5b3UgdG8gcmVjZWl2ZSBhZGRpdGlvbmFsIHdlYmhvb2tzIHJlbGF0ZWQgdG8gTGluayBldmVudHMsIHN1Y2ggYXMgdGhlIGBTRVNTSU9OX0ZJTklTSEVEYCBhbmQgYEVWRU5UU2Agd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuR2V0OiBhc3luYyAobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5HZXQnLCAnbGlua1Rva2VuR2V0UmVxdWVzdCcsIGxpbmtUb2tlbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSB1c2VyIGlzIGVsaWdpYmxlIGZvciBhIHN0cmVhbWxpbmVkIGV4cGVyaWVuY2UsIHN1Y2ggYXMgTGF5ZXIuIFRvIGFjY2VzcyB0aGlzIGVuZHBvaW50LCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldDogYXN5bmMgKG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbmV0d29ya1N0YXR1c0dldCcsICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcsIG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9uZXR3b3JrL3N0YXR1cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9vYXV0aC9pbnRyb3NwZWN0YCByZXR1cm5zIG1ldGFkYXRhIGFib3V0IGFuIGFjY2VzcyB0b2tlbiBvciByZWZyZXNoIHRva2VuLiAgTm90ZTogVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGFzIHdlbGwgYXMgSlNPTi4gVGhlIGZpZWxkcyBmb3IgdGhlIGZvcm0gYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZpZWxkcyBmb3IgSlNPTiBhbmQgY29uZm9ybSB0byB0aGUgT0F1dGggMi4wIHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBtZXRhZGF0YSBhYm91dCBhbiBPQXV0aCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge09BdXRoSW50cm9zcGVjdFJlcXVlc3R9IG9BdXRoSW50cm9zcGVjdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBvYXV0aEludHJvc3BlY3Q6IGFzeW5jIChvQXV0aEludHJvc3BlY3RSZXF1ZXN0OiBPQXV0aEludHJvc3BlY3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ29BdXRoSW50cm9zcGVjdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ29hdXRoSW50cm9zcGVjdCcsICdvQXV0aEludHJvc3BlY3RSZXF1ZXN0Jywgb0F1dGhJbnRyb3NwZWN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvb2F1dGgvaW50cm9zcGVjdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChvQXV0aEludHJvc3BlY3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvb2F1dGgvcmV2b2tlYCByZXZva2VzIGFuIGFjY2VzcyBvciByZWZyZXNoIHRva2VuLCBwcmV2ZW50aW5nIGFueSBmdXJ0aGVyIHVzZS4gSWYgYSByZWZyZXNoIHRva2VuIGlzIHJldm9rZWQsIGFsbCBhY2Nlc3MgYW5kIHJlZnJlc2ggdG9rZW5zIGRlcml2ZWQgZnJvbSBpdCBhcmUgYWxzbyByZXZva2VkLCBpbmNsdWRpbmcgZXhjaGFuZ2VkIHRva2Vucy4gIE5vdGU6IFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgYW4gT0F1dGggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtPQXV0aFJldm9rZVJlcXVlc3R9IG9BdXRoUmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG9hdXRoUmV2b2tlOiBhc3luYyAob0F1dGhSZXZva2VSZXF1ZXN0OiBPQXV0aFJldm9rZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnb0F1dGhSZXZva2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdvYXV0aFJldm9rZScsICdvQXV0aFJldm9rZVJlcXVlc3QnLCBvQXV0aFJldm9rZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL29hdXRoL3Jldm9rZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChvQXV0aFJldm9rZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9vYXV0aC90b2tlbmAgaXNzdWVzIGFuIGFjY2VzcyB0b2tlbiBhbmQgcmVmcmVzaCB0b2tlbiBkZXBlbmRpbmcgb24gdGhlIGBncmFudF90eXBlYCBwcm92aWRlZC4gVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGFzIHdlbGwgYXMgSlNPTi4gVGhlIGZpZWxkcyBmb3IgdGhlIGZvcm0gYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZpZWxkcyBmb3IgSlNPTiBhbmQgY29uZm9ybSB0byB0aGUgT0F1dGggMi4wIHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBvciByZWZyZXNoIGFuIE9BdXRoIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge09BdXRoVG9rZW5SZXF1ZXN0fSBvQXV0aFRva2VuUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG9hdXRoVG9rZW46IGFzeW5jIChvQXV0aFRva2VuUmVxdWVzdDogT0F1dGhUb2tlblJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnb0F1dGhUb2tlblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ29hdXRoVG9rZW4nLCAnb0F1dGhUb2tlblJlcXVlc3QnLCBvQXV0aFRva2VuUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvb2F1dGgvdG9rZW5gO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQob0F1dGhUb2tlblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckNyZWF0ZScsICdwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckVuYWJsZScsICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyR2V0JywgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0OiBhc3luYyAocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldCcsICdwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyUmVtb3ZlOiBhc3luYyAocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUnLCAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcsIHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlJywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2U6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gRVVSLCBHQlAsIG9yIGFub3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJhY3MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnRcXCdzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuICBQb2xsaW5nIGZvciBzdGF0dXMgdXBkYXRlcyBpbiBQcm9kdWN0aW9uIGlzIGhpZ2hseSBkaXNjb3VyYWdlZC4gUmVwZWF0ZWRseSBjYWxsaW5nIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCB0byBjaGVjayBhIHBheW1lbnRcXCdzIHN0YXR1cyBpcyB1bnJlbGlhYmxlIGFuZCBtYXkgdHJpZ2dlciBBUEkgcmF0ZSBsaW1pdHMuIE9ubHkgdGhlIGBwYXltZW50X3N0YXR1c191cGRhdGVgIHdlYmhvb2sgc2hvdWxkIGJlIHVzZWQgdG8gcmVjZWl2ZSByZWFsLXRpbWUgc3RhdHVzIHVwZGF0ZXMgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudHMgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3N1cHBvcnQucGxhaWQuY29tL2hjL2VuLXVzL2FydGljbGVzLzI3ODk1ODI2OTQ3NzM1LVdoYXQtUGxhaWQtcHJvZHVjdHMtYXJlLXN1cHBvcnRlZC1pbi1lYWNoLWNvdW50cnktYW5kLXJlZ2lvbikgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3RzIHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVDcmVhdGU6IGFzeW5jIChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlQ3JlYXRlJywgJ3BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCcsIHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlR2V0OiBhc3luYyAocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZUdldCcsICdwYXltZW50UHJvZmlsZUdldFJlcXVlc3QnLCBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXRcXCdzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZVJlbW92ZTogYXN5bmMgKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVSZW1vdmUnLCAncGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQ6IGFzeW5jIChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFjY291bnRHZXQnLCAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnLCBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldDogYXN5bmMgKHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXV0aEdldCcsICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcsIHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldDogYXN5bmMgKHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFsYW5jZUdldCcsICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcsIHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZScsICdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlHZXQ6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5R2V0JywgJ3Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCcsIHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBiYWxhbmNlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaDogYXN5bmMgKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySWRlbnRpdHlNYXRjaCcsICdwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCcsIHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IGF1dGhvcml6ZWQgYnkgYSBwcm9jZXNzb3IgdG9rZW4sIGluY2x1ZGluZyBhY2NvdW50IG51bWJlcnMsIGFjY291bnQgb3duZXJzLCBob2xkaW5ncywgYW5kIGRhdGEgcHJvdmVuYW5jZSBpbmZvcm1hdGlvbi4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgQXV0aCB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCBhY2NvdW50IGF1dGhlbnRpY2F0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0OiBhc3luYyAocHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXQnLCAncHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCcsIHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldDogYXN5bmMgKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcsIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JMaWFiaWxpdGllc0dldDogYXN5bmMgKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQnLCAncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciB5b3UgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YC4gVGhpcyBoZWxwcyBpbXByb3ZlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZSBhY2N1cmFjeSBmb3IgeW91ciBhY2NvdW50IGFuZCBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGUgcnVsZSBwZXJmb3JtYW5jZSBhbmQgcnVsZSB0dW5pbmcgY2FwYWJpbGl0aWVzIGluIHRoZSBEYXNoYm9hcmQuIElmIHlvdXIgZWZmZWN0aXZlIGRlY2lzaW9uIGNoYW5nZXMgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCAoZm9yIGV4YW1wbGUsIHlvdSBpbmRpY2F0ZWQgdGhhdCB5b3UgYWNjZXB0ZWQgYSB0cmFuc2FjdGlvbiwgYnV0IGxhdGVyIG9uLCB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIHJlamVjdGVkIGl0LCBzbyBpdCB3YXMgbmV2ZXIgaW5pdGlhdGVkKSwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAsIGFzIFBsYWlkIGNhbiBpbmZlciBvdXRjb21lcyBmcm9tIHlvdXIgVHJhbnNmZXIgYWN0aXZpdHkuICBJZiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGVuZHBvaW50IHdpbGwgbm90IGltcGFjdCBzY29yZXMgKEJhbGFuY2UgZG9lcyBub3QgdXNlIHNjb3JlcyksIGJ1dCBpcyBuZWNlc3NhcnkgdG8gdmlldyBhY2N1cmF0ZSB0cmFuc2FjdGlvbiBvdXRjb21lcyBhbmQgdHVuZSBydWxlIGxvZ2ljIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydDogYXN5bmMgKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQnLCAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JywgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdXNlcyBSdWxlc2V0cyB0aGF0IGFyZSBjb25maWd1cmVkIG9uIHRoZSBlbmQgY3VzdG9tZXJcXCdzIERhc2hib2FyZCBhbmQgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgcHJvZHVjdCBvciB0aGUgQmFsYW5jZSBwcm9kdWN0LiBXaGljaCBwcm9kdWN0IGlzIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBgcnVsZXNldF9rZXlgIHRoYXQgeW91IHByb3ZpZGUuIE5vdGUgdGhhdCBvbmx5IGN1c3RvbWVyLWNvbmZpZ3VyZWQgcnVsZXNldHMgd29yayB3aXRoIHRoaXMgZW5kcG9pbnQ7IGFzIGEgcHJvY2Vzc29yIHBhcnRuZXIsIHlvdSBjYW5ub3QgY3JlYXRlIG9yIGNvbmZpZ3VyZSB5b3VyIG93biBydWxlc2V0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtTaWduYWwgUnVsZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSBoYXZlIGhpZ2hlciBsYXRlbmN5IGlmIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbSBmb3IgdGhlIGZpcnN0IHRpbWUsIG9yIHdoZW4gdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldC4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmVxdWVzdCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUnLCAncHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxQcmVwYXJlOiBhc3luYyAocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxQcmVwYXJlJywgJ3Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0JywgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQ6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydCcsICdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0JywgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS4gIE5vdGUgdGhhdCB0aGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlbiBpcyBhIG9uZS10aW1lIHVzZSB0b2tlbi4gVG8gc3RvcmUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UsIHlvdSBjYW4gdXNlIGEgU3RyaXBlIGN1c3RvbWVyIG9iamVjdCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLCBvciB5b3UgY2FuIHVzZSBhIFN0cmlwZSBDdXN0b20gYWNjb3VudCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLiBUaGlzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBzaG91bGQgd29yayBpbmRlZmluaXRlbHksIHVubGVzcyB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNoYW5nZXMgb3IgdGhleSByZXZva2UgUGxhaWRcXCdzIHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGVpciBhY2NvdW50LiBTdHJpcGUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZSBiYW5rIGFjY291bnQgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZC4gSWYgeW91IGV2ZXIgbmVlZCB0byBjaGFuZ2UgdGhlIGJhbmsgYWNjb3VudCBkZXRhaWxzIHVzZWQgYnkgU3RyaXBlIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyLCBoYXZlIHRoZSB1c2VyIGdvIHRocm91Z2ggTGluayBhZ2FpbiBhbmQgY3JlYXRlIGEgbmV3IGJhbmsgYWNjb3VudCB0b2tlbiBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuICBUbyByZXZva2UgYSBiYW5rIGFjY291bnQgdG9rZW4sIHRoZSBlbnRpcmUgdW5kZXJseWluZyBhY2Nlc3MgdG9rZW4gbXVzdCBiZSByZXZva2VkIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUnLCAncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIElmIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMsIG11bHRpcGxlIGRpZmZlcmVudCBwcm9jZXNzb3IgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIGZvciBhIHNpbmdsZSBhY2Nlc3MgdG9rZW4uIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW4gYmUgbW9kaWZpZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9zZXRgLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldDogYXN5bmMgKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldCcsICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcsIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZScsICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldDogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0JywgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlclxcJ3MgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoOiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoJywgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JywgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZy4gZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9maWxlTmV0d29ya1N0YXR1c0dldDogYXN5bmMgKHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQnLCAncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0JywgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcHV0ZSBhIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmUgZm9yIGEgdXNlci4gVGhlIG1vZGVsIHNlbGVjdGVkIGRldGVybWluZXMgd2hhdCBpcyBzY29yZWQgYW5kIHdoYXQgYWRkaXRpb25hbCBmaWVsZHMgdGhlIHJlc3BvbnNlIGNvbnRhaW5zLiBGb3IgZXhhbXBsZSwgYHRpLWxpbmstc2Vzc2lvbi0yLjBgIHNjb3JlcyBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24gZm9yIGZyYXVkIHJpc2s7IGBjYXNoLWFkdmFuY2Utb25ib2FyZGluZy0xLjBgIHNjb3JlcyByZXBheW1lbnQgcmlzayBmb3IgYSBmaXJzdC10aW1lIGNhc2ggYWR2YW5jZSBhbmQgYWRkaXRpb25hbGx5IHBvcHVsYXRlcyBwZXItYW1vdW50LWJ1Y2tldCBzdWJzY29yZXMuIENhc2gtYWR2YW5jZSBtb2RlbHMgcmVxdWlyZSB0aGF0IHRoZSB1c2VyIGhhdmUgYSBQbGFpZCBJdGVtIHdpdGggVHJhbnNhY3Rpb25zIGVuYWJsZWQsIG9yIGFuIEFzc2V0cyBSZXBvcnQsIGJlZm9yZSBzY29yaW5nLiAgVGhlIGVuZHBvaW50IHJldHVybnMgSFRUUCA0MDAgd2l0aCBgZXJyb3JfdHlwZWAgPSBgSU5WQUxJRF9SRVFVRVNUYCBhbmQgYGVycm9yX2NvZGVgID0gYEZBSUxFRF9QUkVDT05ESVRJT05gIHdoZW4gYSByZXF1aXJlZCBwcmVjb25kaXRpb24gaXMgbm90IG1ldDogZm9yIGxpbmstc2Vzc2lvbiBtb2RlbHMsIHdoZW4gdGhlIExpbmsgc2Vzc2lvbiBoYXMgbm90IGNvbXBsZXRlZDsgZm9yIGNhc2gtYWR2YW5jZSBtb2RlbHMsIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCBzdWNjZXNzZnVsbHkgbGlua2VkIGFueSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBDb21wdXRlIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmVzIGFuZCBzdWJzY29yZXNcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0Q29tcHV0ZVJlcXVlc3R9IHByb3RlY3RDb21wdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RDb21wdXRlOiBhc3luYyAocHJvdGVjdENvbXB1dGVSZXF1ZXN0OiBQcm90ZWN0Q29tcHV0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdENvbXB1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm90ZWN0Q29tcHV0ZScsICdwcm90ZWN0Q29tcHV0ZVJlcXVlc3QnLCBwcm90ZWN0Q29tcHV0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb3RlY3QvY29tcHV0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm90ZWN0Q29tcHV0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBldmVudCBpbmNsdWRpbmcgVHJ1c3QgSW5kZXggc2NvcmUgYW5kIGZyYXVkIGF0dHJpYnV0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvdGVjdEV2ZW50R2V0OiBhc3luYyAocHJvdGVjdEV2ZW50R2V0UmVxdWVzdDogUHJvdGVjdEV2ZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm90ZWN0RXZlbnRHZXQnLCAncHJvdGVjdEV2ZW50R2V0UmVxdWVzdCcsIHByb3RlY3RFdmVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb3RlY3QvZXZlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb3RlY3RFdmVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIG5ldyBldmVudCB0byBlbnJpY2ggdXNlciBkYXRhIGFuZCBvcHRpb25hbGx5IGdldCBhIFRydXN0IEluZGV4IHNjb3JlIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RFdmVudFNlbmRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RFdmVudFNlbmQ6IGFzeW5jIChwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdDogUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb3RlY3RFdmVudFNlbmQnLCAncHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QnLCBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvdGVjdC9ldmVudC9zZW5kYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIFByb3RlY3QgcmVwb3J0IHRvIGRvY3VtZW50IGZyYXVkIGluY2lkZW50cywgaW52ZXN0aWdhdGlvbiBvdXRjb21lcywgb3Igb3RoZXIgcmlzayBldmVudHMuIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXBvcnQgdmFyaW91cyB0eXBlcyBvZiBpbmNpZGVudHMgaW5jbHVkaW5nIGFjY291bnQgdGFrZW92ZXJzLCBpZGVudGl0eSBmcmF1ZCwgdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucywgYW5kIG90aGVyIHNlY3VyaXR5IGV2ZW50cy4gVGhlIHJlcG9ydGVkIGRhdGEgaGVscHMgaW1wcm92ZSBmcmF1ZCBkZXRlY3Rpb24gbW9kZWxzIGFuZCBwcm92aWRlcyB2YWx1YWJsZSBmZWVkYmFjayB0byBlbmhhbmNlIHRoZSBvdmVyYWxsIHNlY3VyaXR5IG9mIHRoZSBQbGFpZCBuZXR3b3JrLiBSZXBvcnRzIGNhbiBiZSBjcmVhdGVkIGZvciBjb25maXJtZWQgaW5jaWRlbnRzIHRoYXQgaGF2ZSBiZWVuIGZ1bGx5IGludmVzdGlnYXRlZCwgb3IgZm9yIHN1c3BlY3RlZCBpbmNpZGVudHMgdGhhdCByZXF1aXJlIGZ1cnRoZXIgcmV2aWV3LiBZb3UgY2FuIGFzc29jaWF0ZSByZXBvcnRzIHdpdGggc3BlY2lmaWMgdXNlcnMsIHNlc3Npb25zLCBvciB0cmFuc2FjdGlvbnMgdG8gcHJvdmlkZSBjb21wcmVoZW5zaXZlIGNvbnRleHQgYWJvdXQgdGhlIGluY2lkZW50LiBFYWNoIHJlcG9ydCBtdXN0IGluY2x1ZGUgYHVzZXJfaWRgLCBvciBhbiBgaW5jaWRlbnRfZXZlbnRgIHdpdGggYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBpZGVudGlmaWVyOiBgbGlua19zZXNzaW9uX2lkYCwgYGlkdl9zZXNzaW9uX2lkYCwgYHByb3RlY3RfZXZlbnRfaWRgLCBgc2lnbmFsX2NsaWVudF90cmFuc2FjdGlvbl9pZGAsIG9yIGBhY2Nlc3NfdG9rZW5gLiBDb250ZXh0IGZpZWxkcyBzdWNoIGFzIGBpbnRlcm5hbF9yZWZlcmVuY2VgLCBgdGltZWAsIGBhbW91bnRgLCBhbmQgYGJhbmtfYWNjb3VudGAgZG8gbm90IHNhdGlzZnkgdGhpcyBpZGVudGlmaWVyIHJlcXVpcmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBQcm90ZWN0IHJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0fSBwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RSZXBvcnRDcmVhdGU6IGFzeW5jIChwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdDogUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb3RlY3RSZXBvcnRDcmVhdGUnLCAncHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QnLCBwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvdGVjdC9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGdldCBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgYXMgaXQgcmVsYXRlcyB0byB0aGVpciBmcmF1ZCBwcm9maWxlIHdpdGggUHJvdGVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFByb3RlY3QgdXNlciBpbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSBwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RVc2VySW5zaWdodHNHZXQ6IGFzeW5jIChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdDogUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb3RlY3RVc2VySW5zaWdodHNHZXQnLCAncHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCBwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvdGVjdC91c2VyL2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgTWFudWFsbHkgZmlyZSBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlOiBhc3luYyAoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZTogYXN5bmMgKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0OiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZScsICdzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCcsIHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvZmR4L2NvbnNlbnQvc2VlZGAgY3JlYXRlcyBhIHRlc3QgRkRYIGNvbnNlbnQgZ3JhbnQgKGFuZCBhIGJhY2tpbmcgSXRlbSkgZm9yIGEgZGF0YSBwcm92aWRlclxcJ3MgY3VzdG9tZXIgaW4gU2FuZGJveCwgc28gdGhlIEZEWCBDb25zZW50IEFQSSBlbmRwb2ludHMgY2FuIGJlIGV4ZXJjaXNlZCBlbmQtdG8tZW5kIHdpdGhvdXQgYSBsaXZlIGRhdGEgcHJvdmlkZXIgY29ubmVjdGlvbi4gIGBjdXN0b21lcl9pZGAgaXMgdGhlIGRhdGEgcHJvdmlkZXJcXCdzIGlkZW50aWZpZXIgZm9yIHRoZSBlbmQgdXNlciBhbmQgYGFwcGxpY2F0aW9uX2lkYCBpZGVudGlmaWVzIHRoZSBkYXRhIHJlY2lwaWVudCBhcHBsaWNhdGlvbiB0aGUgY29uc2VudCBpcyBncmFudGVkIHRvOyBib3RoIGFyZSByZXF1aXJlZC4gT3B0aW9uYWxseSBwcm92aWRlIGBjb25zZW50X2lkYCAoYSBVVUlEdjQpIHRvIGNvbnRyb2wgdGhlIHNlZWRlZCBncmFudFxcJ3MgaWRlbnRpZmllcjsgb25lIGlzIGdlbmVyYXRlZCB3aGVuIG9taXR0ZWQuIFRoZSBzZWVkZWQgZ3JhbnQgaXMgcmV0dXJuZWQgYnkgYC9mZHgvY29uc2VudHNgIGFuZCBgL2ZkeC9jb25zZW50cy97Y29uc2VudElkfWAsIGFuZCBjYW4gYmUgcmV2b2tlZCB2aWEgYC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH0vcmV2b2NhdGlvbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlZWQgYW4gRkRYIGNvbnNlbnQgZ3JhbnQgZm9yIGEgc2FuZGJveCBkYXRhIHBhcnRuZXJcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0fSBzYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEZkeENvbnNlbnRTZWVkOiBhc3luYyAoc2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdDogU2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94RmR4Q29uc2VudFNlZWQnLCAnc2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdCcsIHNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvZmR4L2NvbnNlbnQvc2VlZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEluY29tZUZpcmVXZWJob29rJywgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9hcHBsaWNhdGlvbi9zZWVkYCBjcmVhdGVzIGEgdGVzdCBjb25uZWN0ZWQgYXBwbGljYXRpb24gb24gYW4gZXhpc3RpbmcgUGVybWlzc2lvbnMgTWFuYWdlciBJdGVtXFwncyBsb2dpbi4gVGhlIHNlZWRlZCBhcHBsaWNhdGlvbiB3aWxsIGFwcGVhciBpbiBzdWJzZXF1ZW50IGNhbGxzIHRvIGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YC4gIFRoZSBgYWNjZXNzX3Rva2VuYCBtdXN0IGJlbG9uZyB0byBhIFBlcm1pc3Npb25zIE1hbmFnZXIgSXRlbSBjcmVhdGVkIHZpYSBgL2l0ZW0vaW1wb3J0YCBpbiBTYW5kYm94LiBUaGUgYGFwcGxpY2F0aW9uX2lkYCBpZGVudGlmaWVzIHRoZSBhcHBsaWNhdGlvbiB0byBzZWVkIGFzIGEgY29ubmVjdGVkIGFwcC4gVG8gZGlzY29ubmVjdCBhIHNlZWRlZCBhcHBsaWNhdGlvbiwgdXNlIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWVkIGEgY29ubmVjdGVkIGFwcGxpY2F0aW9uIGZvciBhIFBlcm1pc3Npb25zIE1hbmFnZXIgc2FuZGJveCBpdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0fSBzYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZDogYXN5bmMgKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdDogU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWQnLCAnc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0Jywgc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vYXBwbGljYXRpb24vc2VlZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXQgSXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnNcXCcgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBQTkMgSXRlbXMsIGJ1dCBtYXkgYmUgc2VudCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgb3IgSXRlbS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbUZpcmVXZWJob29rJywgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCB5b3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtUmVzZXRMb2dpbicsICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzOiBhc3luYyAoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cycsICdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QnLCBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPQXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9BdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50czogYXN5bmMgKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMnLCAnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0Jywgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbjogYXN5bmMgKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbicsICdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQYXltZW50U2ltdWxhdGUnLCAnc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHVibGljVG9rZW5DcmVhdGU6IGFzeW5jIChzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZScsICdzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0Jywgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNhY3Rpb25zL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIG5ldyB0cmFuc2FjdGlvbnMgZm9yIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIHVwIHRvIDEwIHRyYW5zYWN0aW9ucyB0byBhbnkgSXRlbSBhdCBhIHRpbWUuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBJdGVtcyB0aGF0IHdlcmUgY3JlYXRlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCB1c2luZyB0aGUgYHVzZXJfdHJhbnNhY3Rpb25zX2R5bmFtaWNgIHRlc3QgdXNlci4gWW91IGNhbiB1c2UgdGhpcyB0byBhZGQgdHJhbnNhY3Rpb25zIHRvIHRlc3QgdGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50cy4gIEN1c3RvbSB0cmFuc2FjdGlvbnMgYXJlIG9ubHkgYXBwbGllZCB0byB0aGUgZGVwb3NpdG9yeSBhY2NvdW50LiBTdXBwb3J0IGZvciBwZXItYWNjb3VudCB0YXJnZXRpbmcgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBzYW5kYm94IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGUnLCAnc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2FjdGlvbnMvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZScsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIFRlc3QgY2xvY2tzIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnMgaW4gU2FuZGJveC4gIEEgdGVzdCBjbG9jayBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHVwIHRvIDUgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZScsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0OiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0OiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0JywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCBmdW5jdGlvbnMgdGhlIHNhbWUgYXMgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBidXQgd2lsbCBtb2RpZnkgSXRlbXMgcmVsYXRlZCB0byBhIFVzZXIuIFRoaXMgZW5kcG9pbnQgZm9yY2VzIGVhY2ggSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCwgeW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBpdGVtKHMpIGZvciBhIFNhbmRib3ggVXNlciBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hVc2VyUmVzZXRMb2dpbjogYXN5bmMgKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFVzZXJSZXNldExvZ2luJywgJ3NhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QnLCBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Nlc3Npb24vdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIExheWVyLiBUaGUgcmV0dXJuZWQgTGluayB0b2tlbiBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBMaW5rIFNESy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIExheWVyXG4gICAgICAgICAqIEBwYXJhbSB7U2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdH0gc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNlc3Npb25Ub2tlbkNyZWF0ZTogYXN5bmMgKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3Q6IFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2Vzc2lvblRva2VuQ3JlYXRlJywgJ3Nlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QnLCBzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zZXNzaW9uL3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIHlvdSBjYWxsIGAvc2lnbmFsL2V2YWx1YXRlYCwgUGxhaWQgd2lsbCBub3JtYWxseSBpbmZlciB0aGUgb3V0Y29tZSBmcm9tIHlvdXIgU2lnbmFsIFJ1bGVzLiBIb3dldmVyLCBpZiB5b3UgYXJlIG5vdCB1c2luZyBTaWduYWwgUnVsZXMsIGlmIHRoZSBTaWduYWwgUnVsZXMgb3V0Y29tZSB3YXMgYFJFVklFV2AsIG9yIGlmIHlvdSB0YWtlIGEgZGlmZmVyZW50IGFjdGlvbiB0aGFuIHRoZSBvbmUgZGV0ZXJtaW5lZCBieSB0aGUgU2lnbmFsIFJ1bGVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YC4gVGhpcyBoZWxwcyBpbXByb3ZlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZSBhY2N1cmFjeSBmb3IgeW91ciBhY2NvdW50IGFuZCBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGUgcnVsZSBwZXJmb3JtYW5jZSBhbmQgcnVsZSB0dW5pbmcgY2FwYWJpbGl0aWVzIGluIHRoZSBEYXNoYm9hcmQuIElmIHlvdXIgZWZmZWN0aXZlIGRlY2lzaW9uIGNoYW5nZXMgYWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIChmb3IgZXhhbXBsZSwgeW91IGluZGljYXRlZCB0aGF0IHlvdSBhY2NlcHRlZCBhIHRyYW5zYWN0aW9uLCBidXQgbGF0ZXIgb24sIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IgcmVqZWN0ZWQgaXQsIHNvIGl0IHdhcyBuZXZlciBpbml0aWF0ZWQpLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgYWdhaW4gZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBjb3JyZWN0IFBsYWlkXFwncyByZWNvcmRzLiAgSWYgeW91IGFyZSB1c2luZyBQbGFpZCBUcmFuc2ZlciBhcyB5b3VyIHBheW1lbnQgcHJvY2Vzc29yLCB5b3UgYWxzbyBkbyBub3QgbmVlZCB0byBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAsIGFzIFBsYWlkIGNhbiBpbmZlciBvdXRjb21lcyBmcm9tIHlvdXIgVHJhbnNmZXIgYWN0aXZpdHkuICBJZiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGVuZHBvaW50IHdpbGwgbm90IGltcGFjdCBzY29yZXMgKEJhbGFuY2UgZG9lcyBub3QgdXNlIHNjb3JlcyksIGJ1dCBpcyBuZWNlc3NhcnkgdG8gdmlldyBhY2N1cmF0ZSB0cmFuc2FjdGlvbiBvdXRjb21lcyBhbmQgdHVuZSBydWxlIGxvZ2ljIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydDogYXN5bmMgKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRGVjaXNpb25SZXBvcnQnLCAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBCZWZvcmUgdXNpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgcnVsZXNldF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykgaW4gdGhlIERhc2hib2FyZCB1bmRlciBbKipTaWduYWwtPlJ1bGVzKipdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zaWduYWwvcmlzay1wcm9maWxlcykuICBgL3NpZ25hbC9ldmFsdWF0ZWAgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBvciB0aGUgQmFsYW5jZSBwcm9kdWN0LiBXaGljaCBwcm9kdWN0IGlzIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBgcnVsZXNldF9rZXlgIHRoYXQgeW91IHByb3ZpZGUuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2lnbmFsIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgaGF2ZSBoaWdoZXIgbGF0ZW5jeSB3aGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQuIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJlcXVlc3QgZGF0YS4gQmFsYW5jZS1vbmx5IHJ1bGVzZXRzIG1heSBoYXZlIGxhdGVuY3kgb2YgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRXZhbHVhdGU6IGFzeW5jIChzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbEV2YWx1YXRlJywgJ3NpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL2V2YWx1YXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGFuIEl0ZW0gaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgdXNlZCB0byBkZXZlbG9wIGEgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIGBzaWduYWxgIHdhcyBhZGRlZCBpbiB0aGUgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheSBidXQgbm90IGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheS4gSWYgYC9zaWduYWwvcHJlcGFyZWAgaXMgc2tpcHBlZCBvbiBhbiBJdGVtIHRoYXQgaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIHRoZSBpbml0aWFsIGNhbGwgdG8gYC9zaWduYWwvZXZhbHVhdGVgIG9uIHRoYXQgSXRlbSB3aWxsIGJlIGxlc3MgYWNjdXJhdGUsIGJlY2F1c2UgUGxhaWQgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgeW91ciBpbnRlZ3JhdGlvbiBpcyBwdXJlbHkgQmFsYW5jZS1vbmx5LCB0aGlzIGVuZHBvaW50IHdpbGwgaGF2ZSBubyBlZmZlY3QsIGFzIEJhbGFuY2Utb25seSBydWxlc2V0cyBkbyBub3QgY2FsY3VsYXRlIGEgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3Jlc1xuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmU6IGFzeW5jIChzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFByZXBhcmUnLCAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBzaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmRzIGludG8geW91ciBzY29yZXMgYW5kIHR1bmUgcnVsZSBsb2dpYy4gSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChhcyBCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxSZXR1cm5SZXBvcnQ6IGFzeW5jIChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFJldHVyblJlcG9ydCcsICdzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3JldHVybi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvc2NoZWR1bGVgIHRvIHNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxTY2hlZHVsZVJlcXVlc3R9IHNpZ25hbFNjaGVkdWxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFNjaGVkdWxlOiBhc3luYyAoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0OiBTaWduYWxTY2hlZHVsZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsU2NoZWR1bGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxTY2hlZHVsZScsICdzaWduYWxTY2hlZHVsZVJlcXVlc3QnLCBzaWduYWxTY2hlZHVsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9zY2hlZHVsZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxTY2hlZHVsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzRG93bmxvYWQ6IGFzeW5jIChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNEb3dubG9hZCcsICdzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0Jywgc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0xpc3Q6IGFzeW5jIChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNMaXN0JywgJ3N0YXRlbWVudHNMaXN0UmVxdWVzdCcsIHN0YXRlbWVudHNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c1JlZnJlc2g6IGFzeW5jIChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNSZWZyZXNoJywgJ3N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCcsIHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbmhhbmNlOiBhc3luYyAodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNFbmhhbmNlJywgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2g6IGFzeW5jICh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0VucmljaCcsICd0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL2VucmljaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudCBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRoZSBJdGVtIHdhcyBsYXN0IHVwZGF0ZWQsIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQ6IGFzeW5jICh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0dldCcsICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2VyXFwncyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuICBXaGVuIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGZvciBiZXN0IHJlc3VsdHMsIG1ha2Ugc3VyZSB0byB1c2UgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgcGFyYW1ldGVyIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBJdGVtcyB3aXRoIFRyYW5zYWN0aW9ucy4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoZSBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBUcmFuc2FjdGlvbnMgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAuICBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIG9wdGlvbmFsIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVmcmVzaCcsICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZTogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUnLCAndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3Q6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdCcsICd0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlJywgJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcuIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jICh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1N5bmMnLCAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0JywgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbDogYXN5bmMgKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsJywgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuIFRoZSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIHdpbGwgZXhwaXJlIGlmIG5vdCB1c2VkIGFmdGVyIG9uZSBob3VyLiAoWW91IGNhbiBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhdXRob3JpemF0aW9uIGxpZmV0aW1lLikgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgYWRkaXRpb25hbCB1c2VyIGlucHV0IGlzIG5lZWRlZCwgdXN1YWxseSB0byBmaXggYSBicm9rZW4gYmFuayBjb25uZWN0aW9uLCBiZWZvcmUgUGxhaWQgY2FuIHByb3Blcmx5IGFzc2VzcyB0aGUgcmlzay4gWW91IG5lZWQgdG8gbGF1bmNoIExpbmsgaW4gdXBkYXRlIG1vZGUgdG8gY29tcGxldGUgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uLiBXaGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgdG8gZ2V0IGEgbmV3IExpbmsgdG9rZW4sIGluc3RlYWQgb2YgcHJvdmlkaW5nIGBhY2Nlc3NfdG9rZW5gIGluIHRoZSByZXF1ZXN0LCB5b3Ugc2hvdWxkIHNldCBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGFzIHRoZSBgYXV0aG9yaXphdGlvbi5pZGAuIEFmdGVyIHRoZSBMaW5rIGZsb3cgaXMgY29tcGxldGVkLCB5b3UgbWF5IHJlLWF0dGVtcHQgdGhlIGF1dGhvcml6YXRpb24uICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lLURheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gZ2V0IGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gb2YgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGU6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZScsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0OiBhc3luYyAodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckJhbGFuY2VHZXQnLCAndHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNhbmNlbCcsICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQ6IGFzeW5jICh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0JywgJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCcsIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQ6IGFzeW5jICh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldCcsICd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0JywgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNyZWF0ZScsICd0cmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGVpciBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdVxcJ2xsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBgbXVsdGlwYXJ0L2Zvcm0tZGF0YWAuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZDogYXN5bmMgKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCcsICd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCcsIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvciAoaS5lLiwgdGhlIGVuZCBjdXN0b21lcikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdDogYXN5bmMgKHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQnLCAndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0JywgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRMaXN0OiBhc3luYyAodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckV2ZW50TGlzdCcsICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDUwMCB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmM6IGFzeW5jICh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRTeW5jJywgJ3RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvc3luY2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYC4gT25lIG9mIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgIG11c3QgYmUgcG9wdWxhdGVkIGJ1dCBub3QgYm90aC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyR2V0JywgJ3RyYW5zZmVyR2V0UmVxdWVzdCcsIHRyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlOiBhc3luYyAodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudENyZWF0ZScsICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0fSB0cmFuc2ZlckludGVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudEdldDogYXN5bmMgKHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdDogVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVySW50ZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJJbnRlbnRHZXQnLCAndHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0JywgdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9pbnRlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgIGVuZHBvaW50IHRvIGRlcG9zaXQgZnVuZHMgaW50byBQbGFpZCBMZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlcG9zaXQgZnVuZHMgaW50byBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdDogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJEZXBvc2l0JywgJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGxlZGdlcnMsIGlmIHlvdSBoYXZlIG11bHRpcGxlLiBJZiB5b3VcXCdyZSBhIHBsYXRmb3JtLCB5b3UgY2FuIG1vdmUgZnVuZHMgYmV0d2VlbiBvbmUgb2YgeW91ciBsZWRnZXJzIGFuZCBvbmUgb2YgeW91ciBjdXN0b21lclxcJ3MgbGVkZ2Vycy5cbiAgICAgICAgICogQHN1bW1hcnkgTW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGxlZGdlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlOiBhc3luYyAodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUnLCAndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIGxlZGdlciBldmVudHMgZm9yIGEgc3BlY2lmaWMgbGVkZ2VyIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgbGVkZ2VyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJFdmVudExpc3Q6IGFzeW5jICh0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0JywgJ3RyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0OiBhc3luYyAodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckdldCcsICd0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdzogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJXaXRoZHJhdycsICd0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0OiBhc3luYyAodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlckxpc3QnLCAndHJhbnNmZXJMaXN0UmVxdWVzdCcsIHRyYW5zZmVyTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuICBJbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBlbmRwb2ludCByZXR1cm5zIHN0YXRpYyBwbGFjZWhvbGRlciB2YWx1ZXMgcmF0aGVyIHRoYW4gbWV0cmljcyBjb21wdXRlZCBmcm9tIHlvdXIgU2FuZGJveCB0cmFuc2ZlciBhY3Rpdml0eS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1ldHJpY3NHZXQ6IGFzeW5jICh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTWV0cmljc0dldCcsICd0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0JywgdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIHByZXZpb3VzbHktdmVyaWZpZWQgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyIG9yIFtzdXBwb3J0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWlncmF0ZUFjY291bnQ6IGFzeW5jICh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTWlncmF0ZUFjY291bnQnLCAndHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGU6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgZnVuZGluZyBhY2NvdW50IGZvciB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IGZ1bmRpbmcgYWNjb3VudCBmb3IgYW4gb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGU6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlJywgJ3RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGU6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlJywgJ3RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yR2V0OiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JHZXQnLCAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yTGlzdCcsICd0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBzdWJtaXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3IgeW91IGFyZSBvbmJvYXJkaW5nLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmF0b3JcXCdzIGFncmVlbWVudCB0byB0aGUgcmVxdWlyZWQgbGVnYWwgdGVybXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlJywgJ3RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3IgKGUuZy4gYmVuZWZpY2lhbCBvd25lciBvciBjb250cm9sIHBlcnNvbikgYW5kIG9wdGlvbmFsbHkgc3VibWl0IHBlcnNvbmFsIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlJywgJ3RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IGFkZGl0aW9uYWwgb25ib2FyZGluZyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5lZWRlZCBieSBQbGFpZCB0byBhcHByb3ZlIG9yIGRlY2xpbmUgdGhlIG9yaWdpbmF0b3IuIFNlZSBbUmVxdWlyZW1lbnQgdHlwZSBzY2hlbWEgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xTkVRa1REMHNWSzUwaUFRaTZ4SGlncmV4RFV4WjRReFhxU0VmVl9GRlRpVS8pIGZvciBhIGxpc3Qgb2YgcmVxdWlyZW1lbnQgdHlwZXMgYW5kIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IGFkZGl0aW9uYWwgb25ib2FyZGluZyBpbmZvcm1hdGlvbiBvbiBiZWhhbGYgb2YgYW4gb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQ6IGFzeW5jICh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCcsICd0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0JywgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZFxcJ3MgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlJywgJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBBIHNjaGVkdWxlZCB0cmFuc2ZlciB0aGF0IGhhc25cXCd0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwnLCAndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFRyYW5zZmVyIGZvciBQbGF0Zm9ybXMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUnLCAndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0dldDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdHZXQnLCAndHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdMaXN0OiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0xpc3QnLCAndHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENhbmNlbDogYXN5bmMgKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWZ1bmRDYW5jZWwnLCAndHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuICBBIHJlZnVuZCBjYW4gc3RpbGwgYmUgaXNzdWVkIGV2ZW4gaWYgdGhlIEl0ZW1cXCdzIGBhY2Nlc3NfdG9rZW5gIGlzIG5vIGxvbmdlciB2YWxpZCAoZS5nLiBpZiB0aGUgdXNlciByZXZva2VkIE9BdXRoIGNvbnNlbnQgb3IgdGhlIEl0ZW0gd2FzIGRlbGV0ZWQgdmlhIGAvaXRlbS9yZW1vdmVgKSwgYXMgbG9uZyBhcyB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgcGFpciB1c2VkIHRvIG1ha2UgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGlzIHN0aWxsIHZhbGlkLiBBIHJlZnVuZCBjYW5ub3QgYmUgaXNzdWVkIGlmIHRoZSBJdGVtIGhhcyBhbiBbaW52YWxpZGF0ZWQgVEFOXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLCB3aGljaCBjYW4gb2NjdXIgYXQgQ2hhc2Ugb3IgUE5DLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZENyZWF0ZScsICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0OiBhc3luYyAodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZEdldCcsICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3Q6IGFzeW5jICh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVwYXltZW50TGlzdCcsICd0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmV0dXJuL3JlY292ZXJgIGVuZHBvaW50IHRvIG5vdGlmeSBQbGFpZCB0aGF0IHlvdSBoYXZlIHJlY292ZXJlZCBzb21lIG9yIGFsbCBvZiB0aGUgbG9zcyBvbiBhIHJldHVybmVkIGd1YXJhbnRlZWQgdHJhbnNmZXIuICBSZWNvdmVyeSBjYW4gYmUgcmVwb3J0ZWQgaW4gZnVsbCBvciBpbiBwYXJ0czsgdGhlIHN1bSBvZiByZWNvdmVyZWQgYW1vdW50cyBhY3Jvc3MgY2FsbHMgY2Fubm90IGV4Y2VlZCB0aGUgb3JpZ2luYWwgdHJhbnNmZXJcXCdzIGFtb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIHJlY292ZXJ5XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdH0gdHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmV0dXJuUmVjb3ZlcjogYXN5bmMgKHRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3Q6IFRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXR1cm5SZWNvdmVyJywgJ3RyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3QnLCB0cmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXR1cm4vcmVjb3ZlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0OiBhc3luYyAodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwR2V0JywgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0OiBhc3luYyAodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwTGlzdCcsICd0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHNlbmRpbmcgY2xpZW50LXNwZWNpZmljIGV2ZW50cyByZWxhdGVkIHRvIExheWVyIHNlc3Npb25zIGZvciBhbmFseXRpY3MgYW5kIHRyYWNraW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZW5kIFVzZXIgQWNjb3VudCBTZXNzaW9uIEV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZDogYXN5bmMgKHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kJywgJ3VzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QnLCB1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyX2FjY291bnQvc2Vzc2lvbi9ldmVudC9zZW5kYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHVzZXIgcGVybWlzc2lvbmVkIGFjY291bnQgZGF0YSwgaW5jbHVkaW5nIGlkZW50aXR5IGFuZCBJdGVtIGFjY2VzcyB0b2tlbnMsIGZvciB1c2Ugd2l0aCBbUGxhaWQgTGF5ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGF5ZXIpLiBOb3RlIHRoYXQgZW5kIHVzZXJzIGFyZSBwZXJtaXR0ZWQgdG8gZWRpdCB0aGUgcHJlZmlsbGVkIGlkZW50aXR5IGRhdGEgaW4gdGhlIExpbmsgZmxvdyBiZWZvcmUgc2hhcmluZyBpdCB3aXRoIHlvdTsgeW91IHNob3VsZCB0cmVhdCBhbnkgaWRlbnRpdHkgZGF0YSByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFzIHVzZXItc3VibWl0dGVkLCB1bnZlcmlmaWVkIGRhdGEuIEZvciBhIHZlcmlmaWNhdGlvbiBsYXllciwgeW91IGNhbiBhZGQgW0lkZW50aXR5IFZlcmlmaWNhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vKSB0byB5b3VyIGZsb3csIG9yIGNoZWNrIHRoZSBzdWJtaXR0ZWQgaWRlbnRpdHkgZGF0YSBhZ2FpbnN0IGJhbmsgYWNjb3VudCBkYXRhIGZyb20gbGlua2VkIGFjY291bnRzIHVzaW5nIFtJZGVudGl0eSBNYXRjaF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS8jaWRlbnRpdHktbWF0Y2gpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFjY291bnRTZXNzaW9uR2V0OiBhc3luYyAodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyQWNjb3VudFNlc3Npb25HZXQnLCAndXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCcsIHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvciBQbGFpZCBwcm9kdWN0cyBhbmQgZmxvd3MgdGhhdCB1c2UgdGhlIHVzZXIgb2JqZWN0LCBgL3VzZXIvY3JlYXRlYCBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IG11c3QgY2FsbCB0aGlzIGVuZHBvaW50IGJlZm9yZSBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIGlmIHlvdSBhcmUgdXNpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmc6IFBsYWlkIENoZWNrLCBJbmNvbWUgVmVyaWZpY2F0aW9uLCBNdWx0aS1JdGVtIExpbmssIG9yIFBsYWlkIFByb3RlY3QgKElkZW50aXR5KS4gSWYgeW91IGFyZSB1c2luZyBQbGFpZCBQcm90ZWN0IExpbmsgc2Vzc2lvbiBzY29yaW5nLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCBgL3VzZXIvY3JlYXRlYCBmaXJzdDsgUGxhaWQgd2lsbCByZXNvbHZlIG9yIGNyZWF0ZSB0aGUgdXNlciB3aGVuIGB1c2VyLmNsaWVudF91c2VyX2lkYCBpcyBwcm92aWRlZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gRm9yIGN1c3RvbWVycyB3aG8gYmVnYW4gdXNpbmcgdGhpcyBlbmRwb2ludCBvbiBvciBhZnRlciBEZWNlbWJlciAxMCwgMjAyNSwgdGhpcyBlbmRwb2ludCB0YWtlcyBhIGBjbGllbnRfdXNlcl9pZGAgYW5kIGFuIGBpZGVudGl0eWAgb2JqZWN0IGFuZCB3aWxsIHJldHVybiBhIGB1c2VyX2lkYC4gRm9yIGN1c3RvbWVycyB3aG8gYmVnYW4gdXNpbmcgaXQgYmVmb3JlIHRoYXQgZGF0ZSwgdGhlIGVuZHBvaW50IHRha2VzIGEgYGNsaWVudF91c2VyX2lkYCBhbmQgYSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCBhbmQgd2lsbCByZXR1cm4gYSBgdXNlcl90b2tlbmAgYW5kIGB1c2VyX2lkYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLiBJbiBvcmRlciB0byBjcmVhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQgZm9yIGEgdXNlciwgdGhlIGBpZGVudGl0eWAgKG5ldykgb3IgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCAobGVnYWN5KSBvYmplY3QgbXVzdCBiZSBwcmVzZW50LiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHRoZSBgL3VzZXIvY3JlYXRlYCBjYWxsLCBpdCBjYW4gYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gICBJbiBvcmRlciB0byBnZW5lcmF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCwgdGhlIGZvbGxvd2luZyBgaWRlbnRpdHlgIGZpZWxkcywgYXQgbWluaW11bSwgYXJlIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG5vbi1lbXB0eTogYG5hbWVgLCBgZGF0ZV9vZl9iaXJ0aGAsIGBlbWFpbHNgLCBgcGhvbmVfbnVtYmVyc2AsIGFuZCBgYWRkcmVzc2VzYCAod2l0aCBhdCBsZWFzdCBvbmUgZW1haWwsIHBob25lIG51bWJlciwgYW5kIGFkZHJlc3MgZGVzaWduYXRlZCBhcyBgcHJpbWFyeWApLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC4gSWYgY3JlYXRpbmcgYSByZXBvcnQgZm9yIHNoYXJpbmcgd2l0aCBhIEdTRSBzdWNoIGFzIEZhbm5pZSBvciBGcmVkZGllLCB0aGUgdXNlclxcJ3MgZnVsbCBTU04gbXVzdCBiZSBwcm92aWRlZCB2aWEgdGhlIGBpZF9udW1iZXJzYCBmaWVsZC4gUHJvdmlkaW5nIGF0IGxlYXN0IGEgcGFydGlhbCBTU04gaXMgYWxzbyBzdHJvbmdseSByZWNvbW1lbmRlZCBmb3IgYWxsIHVzZSBjYXNlcywgc2luY2UgaXQgaW1wcm92ZXMgdGhlIGFjY3VyYWN5IG9mIG1hdGNoaW5nIHVzZXIgcmVjb3JkcyBkdXJpbmcgY29tcGxpYW5jZSBwcm9jZXNzZXMgc3VjaCBhcyBmaWxlIGRpc2Nsb3N1cmUsIGRpc3B1dGUsIG9yIHNlY3VyaXR5IGZyZWV6ZSByZXF1ZXN0cy4gICBXaGVuIHVzaW5nIFBsYWlkIFByb3RlY3QsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBwcm92aWRlIGFuIGBpZGVudGl0eWAgb2JqZWN0IHRvIGJldHRlciBpZGVudGlmeSBhbmQgYmxvY2sgZnJhdWQgYWNyb3NzIHlvdXIgTGluayBzZXNzaW9ucy4gICBQbGFpZCB3aWxsIG5vcm1hbGl6ZSBpZGVudGl0eSBmaWVsZHMgYmVmb3JlIHN0b3JpbmcgdGhlbSBhbmQgdXRpbGl6ZSB0aGUgc2FtZSBpZGVudGl0eSBhY3Jvc3MgZGlmZmVyZW50IHVzZXItYmFzZWQgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDcmVhdGU6IGFzeW5jICh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyQ3JlYXRlJywgJ3VzZXJDcmVhdGVSZXF1ZXN0JywgdXNlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gb2F1dGgyIHJlcXVpcmVkXG4gICAgICAgICAgICAvLyBvYXV0aCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0T0F1dGhUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJvYXV0aDJcIiwgW1widXNlcjp3cml0ZVwiXSwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChwbGFpZE5ld1VzZXJBUElFbmFibGVkICE9PSB1bmRlZmluZWQgJiYgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydQbGFpZC1OZXctVXNlci1BUEktRW5hYmxlZCddID0gU3RyaW5nKEpTT04uc3RyaW5naWZ5KHBsYWlkTmV3VXNlckFQSUVuYWJsZWQpKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIEZpbmFuY2lhbCBJbnNpZ2h0cyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyB0aGUgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgYW5kIExpYWJpbGl0aWVzIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBGaW5hbmNpYWwgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdXNlciBpdGVtcyBmb3IgRmluYW5jaWFsLUluc2lnaHRzIGJ1bmRsZVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3R9IHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2g6IGFzeW5jICh1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0OiBVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaCcsICd1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0JywgdXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9maW5hbmNpYWxfZGF0YS9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IHVzZXIgZGV0YWlscyB1c2luZyBhIGB1c2VyX2lkYC4gVGhpcyBlbmRwb2ludCBvbmx5IHN1cHBvcnRzIHVzZXJzIHRoYXQgd2VyZSBjcmVhdGVkIG9uIHRoZSBuZXcgdXNlciBBUEkgZmxvdywgd2l0aG91dCBhIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB1c2VyIGlkZW50aXR5IGFuZCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJHZXRSZXF1ZXN0fSB1c2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyR2V0OiBhc3luYyAodXNlckdldFJlcXVlc3Q6IFVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckdldCcsICd1c2VyR2V0UmVxdWVzdCcsIHVzZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICBpZiAocGxhaWROZXdVc2VyQVBJRW5hYmxlZCAhPT0gdW5kZWZpbmVkICYmIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnUGxhaWQtTmV3LVVzZXItQVBJLUVuYWJsZWQnXSA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShwbGFpZE5ld1VzZXJBUElFbmFibGVkKSk7XG4gICAgICAgICAgICB9XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIGN1c3RvbWVycyB0byBleHBsaWNpdGx5IHB1cmdlIGlkZW50aXR5L1BJSSBkYXRhIHByb3ZpZGVkIHRvIFBsYWlkIGZvciBhIGdpdmVuIHVzZXIuIFRoaXMgaXMgbm90IGV4cG9zZWQgdG8gY3VzdG9tZXJzIGJ5IGRlZmF1bHQsIGFzIGl0IGlzIG1lYW50IGZvciBzcGVjaWFsIHNjZW5hcmlvcyBvciByZXF1ZXN0cywgYnV0IFBsYWlkIGlzIG9ibGlnYXRlZCB0byBlbmFibGUgY3VzdG9tZXJzIHRvIGRlbGV0ZSBQSUkgcHJvdmlkZWQgdG8gdXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtVc2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0fSB1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJZGVudGl0eVJlbW92ZTogYXN5bmMgKHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3Q6IFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJJZGVudGl0eVJlbW92ZScsICd1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0JywgdXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9pZGVudGl0eS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgaWYgKHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiBwbGFpZE5ld1VzZXJBUElFbmFibGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ1BsYWlkLU5ldy1Vc2VyLUFQSS1FbmFibGVkJ10gPSBTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGxhaWROZXdVc2VyQVBJRW5hYmxlZCkpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzc29jaWF0ZXMgSXRlbXMgdG8gdGhlIHRhcmdldCB1c2VyLiBJZiBhbiBJdGVtIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB0byBhbm90aGVyIHVzZXIsIHRoZSBJdGVtIHdpbGwgYmUgZGlzYXNzb2NpYXRlZCB3aXRoIHRoZSBleGlzdGluZyB1c2VyIGFuZCBhc3NvY2lhdGVkIHRvIHRoZSB0YXJnZXQgdXNlci4gVGhpcyBvcGVyYXRpb24gc3VwcG9ydHMgYSBtYXggb2YgMTAwIEl0ZW1zLlxuICAgICAgICAgKiBAc3VtbWFyeSBBc3NvY2lhdGUgSXRlbXMgdG8gYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdH0gdXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0Fzc29jaWF0ZTogYXN5bmMgKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3Q6IFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckl0ZW1zQXNzb2NpYXRlJywgJ3VzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QnLCB1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2l0ZW1zL2Fzc29jaWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLCBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuIFBsYWlkIGFzc29jaWF0ZXMgYW4gSXRlbSB3aXRoIGEgVXNlciB3aGVuIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgd2l0aGluIGEgTGluayBzZXNzaW9uIGluaXRpYWxpemVkIHdpdGggdGhhdCBgdXNlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0dldDogYXN5bmMgKHVzZXJJdGVtc0dldFJlcXVlc3Q6IFVzZXJJdGVtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckl0ZW1zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckl0ZW1zR2V0JywgJ3VzZXJJdGVtc0dldFJlcXVlc3QnLCB1c2VySXRlbXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2l0ZW1zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgc3BlY2lmaWMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci4gSXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIG9uIGVhY2ggSXRlbSBpbmRpdmlkdWFsbHksIGJ1dCBzdXBwb3J0cyB1c2UgY2FzZXMgKHN1Y2ggYXMgUGxhaWQgQ2hlY2spIHdoZXJlIGFjY2VzcyB0b2tlbnMgYXJlIG5vdCBhdmFpbGFibGUuIEFsbCBzcGVjaWZpZWQgSXRlbXMgbXVzdCBiZWxvbmcgdG8gdGhlIHVzZXIgb3IgdGhlIGVudGlyZSBvcGVyYXRpb24gZmFpbHMuIFNpbWlsYXIgdG8gYC9pdGVtL3JlbW92ZWAsIHRoaXMgZGVsZXRlcyBJdGVtIHByb2R1Y3QgZGF0YSBhbmQgdGVybWluYXRlcyBiaWxsaW5nIG9uIHRoZSBJdGVtXFwncyBwcm9kdWN0cy4gT25jZSByZW1vdmVkLCBJdGVtcyBjYW5ub3QgYmUgcmVjb25uZWN0ZWQgd2l0aG91dCBnb2luZyB0aHJvdWdoIExpbmsgYWdhaW4uIFRoaXMgZW5kcG9pbnQgaXMgbm90IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgZGF0YSBmb3IgYSB1c2VyLCBhcyBpdCB3aWxsIG9ubHkgcmVtb3ZlIEl0ZW1zIGFuZCBubyBvdGhlciBkYXRhIGZvciB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIGFueSB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gcHJvZHVjdHMgKEZpbmFuY2lhbCBNYW5hZ2VtZW50LCBQbGFpZCBQcm90ZWN0LCBvciBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFuZCBpcyBkZWxldGluZyB0aGVpciBhY2NvdW50IHdpdGggeW91ciBwcm9kdWN0LCBhbHNvIGNhbGwgYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWAgdG8gZW5kIHRob3NlIHN1YnNjcmlwdGlvbnM7IHBlci1JdGVtIGJpbGxpbmcgaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBhIHVzZXIgaW5pdGlhdGVkIGRhdGEgZGVsZXRpb24gcmVxdWVzdCwgc2VlIHRoZSBbQ29uc3VtZXIgU2VydmljZSBDZW50ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2NoZWNrL2NvbnN1bWVyLXNlcnZpY2UtY2VudGVyLykgdG8gcmV2b2tlIGFjY2VzcyB0byBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgSXRlbXMgZnJvbSBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNSZW1vdmVSZXF1ZXN0fSB1c2VySXRlbXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckl0ZW1zUmVtb3ZlOiBhc3luYyAodXNlckl0ZW1zUmVtb3ZlUmVxdWVzdDogVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VySXRlbXNSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VySXRlbXNSZW1vdmUnLCAndXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCcsIHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvaXRlbXMvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGVybWluYXRlcyB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gYnVuZGxlcyBvciBwcm9kdWN0cyAoRmluYW5jaWFsIE1hbmFnZW1lbnQsIFBsYWlkIFByb3RlY3QsIGFuZCBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFzc29jaWF0ZWQgd2l0aCBhIGB1c2VyX2lkYC4gQWZ0ZXIgeW91IGNhbGwgdGhpcyBlbmRwb2ludCwgdGhlIHVzZXIgd2lsbCBubyBsb25nZXIgYmUgYmlsbGVkIGZvciB0aGVzZSBwcm9kdWN0cy4gRm9yIENSQSBNb25pdG9yaW5nLCB0aGUgc3Vic2NyaXB0aW9uIGlzIGNhbmNlbGVkIGJ1dCBoaXN0b3JpY2FsIGRhdGEgcmVtYWlucyBhdmFpbGFibGUgZm9yIGZ1dHVyZSByZXBvcnQgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRlcm1pbmF0ZSB1c2VyLWJhc2VkIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gdXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZTogYXN5bmMgKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Q6IFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclByb2R1Y3RzVGVybWluYXRlJywgJ3VzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QnLCB1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUmVtb3ZlUmVxdWVzdH0gdXNlclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclJlbW92ZTogYXN5bmMgKHVzZXJSZW1vdmVSZXF1ZXN0OiBVc2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJSZW1vdmUnLCAndXNlclJlbW92ZVJlcXVlc3QnLCB1c2VyUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgaWYgKHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiBwbGFpZE5ld1VzZXJBUElFbmFibGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ1BsYWlkLU5ldy1Vc2VyLUFQSS1FbmFibGVkJ10gPSBTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGxhaWROZXdVc2VyQVBJRW5hYmxlZCkpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gVGhpcyB0b2tlbiBjYW4gYmUgc2hhcmVkIHdpdGggYW5kIHVzZWQgYnkgYSBzcGVjaWZpZWQgdGhpcmQtcGFydHkgY2xpZW50IHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aHJvdWdoIHN1cHBvcnRlZCBlbmRwb2ludHMuICBFbnN1cmUgeW91IHN0b3JlIHRoZSBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIGFuZCBgdGhpcmRfcGFydHlfY2xpZW50X2lkYCwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGU6IGFzeW5jICh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUnLCAndXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGRlbGV0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIE9uY2UgcmVtb3ZlZCwgdGhlIHRva2VuIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlOiBhc3luYyAodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlJywgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JywgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgVXNlciB1c2luZyB0aGUgVHJhbnNhY3Rpb25zIGJ1bmRsZS4gVGhpcyBidW5kbGUgcmVmcmVzaGVzIG9ubHkgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGRhdGEuIFRoaXMgZW5kcG9pbnQgaXMgZm9yIGNsaWVudHMgd2hvIHVzZSB0aGUgVHJhbnNhY3Rpb25zIEluc2lnaHRzIGJ1bmRsZSBhbmQgd2FudCB0byBwcm9hY3RpdmVseSB1cGRhdGUgYWxsIGxpbmtlZCBJdGVtcyB1bmRlciBhIHVzZXIuIFRoZSByZWZyZXNoIG1heSBzdWNjZWVkIG9yIGZhaWwgb24gYSBwZXItSXRlbSBiYXNpcy4gVXNlIHRoZSBgcmVzdWx0c2AgYXJyYXkgaW4gdGhlIHJlc3BvbnNlIHRvIHVuZGVyc3RhbmQgdGhlIG91dGNvbWUgZm9yIGVhY2ggSXRlbS4gIFRoaXMgZW5kcG9pbnQgaXMgZGlzdGluY3QgZnJvbSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgd2hpY2ggdHJpZ2dlcnMgYSByZWZyZXNoIGZvciBhIHNpbmdsZSBJdGVtLiBVc2UgYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCB0byB0YXJnZXQgYWxsIEl0ZW1zIGZvciBhIHVzZXIgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB1c2VyIGl0ZW1zIGZvciBUcmFuc2FjdGlvbnMgYnVuZGxlXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclRyYW5zYWN0aW9uc1JlZnJlc2gnLCAndXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JywgdXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHVwZGF0ZXMgdXNlciBpbmZvcm1hdGlvbiBmb3IgYW4gZXhpc3RpbmcgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYC4gSWYgYW4gZXhpc3RpbmcgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYCBpcyBtaXNzaW5nIGZpZWxkcyByZXF1aXJlZCBmb3IgYSBnaXZlbiB1c2UgY2FzZSAoZS5nLiBjcmVhdGluZyBhIENvbnN1bWVyIFJlcG9ydCkgdXNlIGAvdXNlci91cGRhdGVgIHRvIGFkZCB2YWx1ZXMgZm9yIHRob3NlIGZpZWxkcy4gIElkZW50aXR5IHVwZGF0ZXMgdXNlIG1lcmdlIHNlbWFudGljczogcHJvdmlkZWQgZmllbGRzIG92ZXJ3cml0ZSBleGlzdGluZyBvbmVzOyBvbWl0dGVkIGZpZWxkcyByZW1haW4gdW5jaGFuZ2VkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVXBkYXRlOiBhc3luYyAodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclVwZGF0ZScsICd1c2VyVXBkYXRlUmVxdWVzdCcsIHVzZXJVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICBpZiAocGxhaWROZXdVc2VyQVBJRW5hYmxlZCAhPT0gdW5kZWZpbmVkICYmIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnUGxhaWQtTmV3LVVzZXItQVBJLUVuYWJsZWQnXSA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShwbGFpZE5ld1VzZXJBUElFbmFibGVkKSk7XG4gICAgICAgICAgICB9XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZTogYXN5bmMgKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0Q3JlYXRlJywgJ3dhbGxldENyZWF0ZVJlcXVlc3QnLCB3YWxsZXRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQ6IGFzeW5jICh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldEdldCcsICd3YWxsZXRHZXRSZXF1ZXN0Jywgd2FsbGV0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0TGlzdDogYXN5bmMgKHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0TGlzdCcsICd3YWxsZXRMaXN0UmVxdWVzdCcsIHdhbGxldExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlOiBhc3luYyAod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUnLCAnd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQ6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uR2V0JywgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Q6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uTGlzdCcsICd3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGl0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcHJvZ3JhbS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQ6IGFzeW5jICh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQnLCAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnLCB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUZwID0gZnVuY3Rpb24oY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yID0gUGxhaWRBcGlBeGlvc1BhcmFtQ3JlYXRvcihjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCAgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWRcXCdzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0OyBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBOb3RlOiBJZiB5b3UgYXJlIGdldHRpbmcgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2Vzc2luZyB0aGUgcmV0dXJuIHJpc2sgb2YgYSBwcm9wb3NlZCBBQ0ggdHJhbnNhY3Rpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZCBvZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gYC9zaWduYWwvZXZhbHVhdGVgIHJldHVybnMgdGhlIHNhbWUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24gYW5kIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIFNpZ25hbCBSdWxlcywgd2hpY2ggcHJvdmlkZXMgbm8tY29kZSB0cmFuc2FjdGlvbiBidXNpbmVzcyBsb2dpYyBjb25maWd1cmF0aW9uLCBiYWNrdGVzdGluZyBhbmQgcmVjb21tZW5kYXRpb25zIGZvciB0dW5pbmcgeW91ciB0cmFuc2FjdGlvbiBhY2NlcHRhbmNlIGxvZ2ljLCBhbmQgdGhlIGFiaWxpdHkgdG8gZWFzaWx5IHN3aXRjaCBiZXR3ZWVuIEJhbGFuY2UgYW5kIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgYXMgbmVlZGVkIGZvciB1bHRyYS1sb3ctbGF0ZW5jeSwgTUwtcG93ZXJlZCByaXNrIGFzc2Vzc21lbnRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtCYWxhbmNlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYmFsYW5jZS8jYmFsYW5jZS1pbnRlZ3JhdGlvbi1vcHRpb25zKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyAtLSB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50cyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gdGhlIEdTRXMgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHkgaW4gUERGIGZvcm1hdC4gVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0aGF0IHdhcyBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldChhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC92ZXJpZnlgIGVuZHBvaW50IHZlcmlmaWVzIGJhbmsgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIGFuZCAob3B0aW9uYWxseSkgYWNjb3VudCBvd25lciBuYW1lcyBhZ2FpbnN0IFBsYWlkXFwncyBkYXRhYmFzZSB2aWEgW0RhdGFiYXNlIEF1dGhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9kYXRhYmFzZS1hdXRoLykuIEl0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhY2NvdW50IG51bWJlcnMgdGhhdCB3ZXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoZSBQbGFpZCBMaW5rIGZsb3cuICBUaGlzIGVuZHBvaW50IGlzIGN1cnJlbnRseSBpbiBFYXJseSBBdmFpbGFiaWxpdHk7IGNvbnRhY3Qgc2FsZXMgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFZlcmlmeSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoVmVyaWZ5UmVxdWVzdH0gYXV0aFZlcmlmeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhdXRoVmVyaWZ5KGF1dGhWZXJpZnlSZXF1ZXN0OiBBdXRoVmVyaWZ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBdXRoVmVyaWZ5UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXV0aFZlcmlmeShhdXRoVmVyaWZ5UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgIHRvIGdldCByaXNrIGluc2lnaHRzIGZvciBhIGxpbmtlZCBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gRHVwbGljYXRlXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdH0gYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0OiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgSUQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYWxsIEFjY291bnRzIGxpbmtlZCB0byB0aGlzIEJlYWNvbiBVc2VyLiBUaGUgaW5zaWdodHMgZm9yIGVhY2ggYWNjb3VudCBhcmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3R9IGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdDogQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgTGlzdCBhIEJlYWNvbiBVc2VyXFwncyBoaXN0b3J5XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdH0gYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgcmVqZWN0ZWRgLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYGNsZWFyZWRgLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGBjbGVhcmVkYC4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYHBlbmRpbmdfcmV2aWV3YC4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL2V3YV9yZXBvcnQvdjEvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhbiBFYXJuZWQgV2FnZSBBY2Nlc3MgKEVXQSkgc2NvcmUgdGhhdCBxdWFudGlmaWVzIHRoZSBkZWxpbnF1ZW5jeSByaXNrIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGl0ZW0uIFRoZSBzY29yZSBpcyBkZXJpdmVkIGZyb20gYSBjb21iaW5hdGlvbiBvZiBjYXNoZmxvdyBwYXR0ZXJucyBhbmQgbmV0d29yay1iYXNlZCBiZWhhdmlvcmFsIGZlYXR1cmVzLiAgVGhlIHJlc3BvbnNlIHJldHVybnMgYSBsaXN0IG9mIEVXQSBzY29yZXMsIHdoZXJlIGVhY2ggc2NvcmUgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWwgYWR2YW5jZSBhbW91bnQgcmFuZ2UuIFRoZXNlIHNjb3JlcyBlc3RpbWF0ZSB0aGUgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQgZm9yIGFkdmFuY2VzIHdpdGhpbiB0aGF0IHJhbmdlLiAgU2NvcmUgcmFuZ2U6IDEtOTkgIEludGVycHJldGF0aW9uOiBIaWdoZXIgc2NvcmVzIGluZGljYXRlIGEgZ3JlYXRlciBsaWtlbGlob29kIG9mIHJlcGF5bWVudC4gIFRoaXMgZW5kcG9pbnQgZW5hYmxlcyBjbGllbnRzIHRvIGFzc2VzcyByZXBheW1lbnQgcmlzayBhbmQgbWFrZSBkYXRhLWRyaXZlbiBkZWNpc2lvbnMgd2hlbiBkZXRlcm1pbmluZyBlbGlnaWJpbGl0eSBvciBsaW1pdHMgZm9yIGVhcm5lZCB3YWdlIGFkdmFuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgRVdBIFNjb3JlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JldGFFd2FSZXBvcnRWMUdldFJlcXVlc3R9IGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZXRhRXdhUmVwb3J0VjFHZXQoYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdDogQmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZXRhRXdhUmVwb3J0VjFHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZXRhRXdhUmVwb3J0VjFHZXQoYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIHJlY29yZC4gWW91IGNhbiBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgeW91IGhhdmUgYXZhaWxhYmxlLiBJZiBhbnkgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgbWlzc2luZyBmb3IgdGhlIHByb2R1Y3RzIHlvdSBpbnRlbmQgdG8gdXNlLCBpdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgYHJlcXVpcmVtZW50c19kdWVgIGZpZWxkIG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0OiBCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZXRhaWxzIG9mIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0fSBiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0KGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3Q6IEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0KGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIGVuZCBjdXN0b21lciByZWNvcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYW4gZXhpc3RpbmcgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMVVwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1c2luZXNzIHZlcmlmaWNhdGlvbiB0byBjaGVjayBhIGJ1c2luZXNzXFwncyBpZGVudGl0eSBhbmQgcmlzayBwcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlKGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGUoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBzcGVjaWZpYyBidXNpbmVzcyB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJ1c2luZXNzIFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0J1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYnVzaW5lc3NWZXJpZmljYXRpb25HZXQoYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5idXNpbmVzc1ZlcmlmaWNhdGlvbkdldChidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jYXNoZmxvd19yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRyYW5zYWN0aW9ucyBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvY2FzaGZsb3dfcmVwb3J0L2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYGhhc19tb3JlYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBOb3RlIHRoYXQgZGF0YSBpc25cXCd0IGxpa2VseSB0byBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9jYXNoZmxvd19yZXBvcnQvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGBjYXNoZmxvd19yZXBvcnRgLCBvciBpZiBpdCB3YXNuXFwndCwgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXNoZmxvd1JlcG9ydEdldChjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXNoZmxvd1JlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9pbnNpZ2h0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyBpbnNpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBJbnNpZ2h0cyBhcmUgb25seSBjYWxjdWxhdGVkIG9uIGNyZWRpdCBhbmQgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyBpbnNpZ2h0cyBkYXRhIGluIENhc2hmbG93IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQoY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0KGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAgaXMgYW4gZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0gKGdpdmVuIGFuIGBpdGVtX2lkYCkuIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIENhc2hmbG93IFJlcG9ydCBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gIEFmdGVyIGNhbGxpbmcgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgYWxlcnRpbmcgY2xpZW50cyB0aGF0IG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBjYW4gdGhlbiBiZSBpbmdlc3RlZCB2aWEgYC9jYXNoZmxvd19yZXBvcnQvZ2V0YCBvciB0aGUgd2ViaG9vayB3aWxsIGNvbnRhaW4gYW4gZXJyb3IgY29kZSBpbmZvcm1pbmcgdGhlcmUgd2FzIGFuIGVycm9yIGluIHJlZnJlc2hpbmcgdHJhbnNhY3Rpb25zIGRhdGEuICBOb3RlIHRoYXQgdGhlIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSkuIElmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIGZvciByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdH0gY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNhc2hmbG93UmVwb3J0UmVmcmVzaChjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0OiBDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhc2hmbG93UmVwb3J0UmVmcmVzaChjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY2FzaGZsb3dfcmVwb3J0L3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYGhhc19tb3JlYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBOb3RlIHRoYXQgZGF0YSBpc25cXCd0IGxpa2VseSB0byBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgY2FzaGZsb3dfcmVwb3J0YCwgb3IgaWYgaXQgd2FzblxcJ3QsIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBDQVNIRkxPV19SRVBPUlRfUkVBRFlgIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldHMgdHJhbnNhY3Rpb24gZGF0YSBpbiBgY2FzaGZsb3dfcmVwb3J0YFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXQoY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldChjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGxlZ2FjeSBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byBbdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3BmYy1taWdyYXRpb24vKSBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBsZWdhY3kgY2F0ZWdvcmllc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNhdGVnb3JpZXNHZXQoYm9keTogb2JqZWN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENhdGVnb3JpZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgSXRlbSBjb25zZW50IGV2ZW50cy4gQ29uc2VudCBsb2dzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgZXZlbnRzIG9jY3VycmluZyBvbiBvciBhZnRlciBOb3ZlbWJlciA3LCAyMDI0LiBFeHRyZW1lbHkgcmVjZW50IGV2ZW50cyAob2NjdXJyaW5nIHdpdGhpbiB0aGUgcGFzdCAxMiBob3VycykgbWF5IG5vdCBiZSBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnQuIFVwIHRvIHRocmVlIHllYXJzIG9mIGNvbnNlbnQgbG9ncyB3aWxsIGJlIGF2YWlsYWJsZSB2aWEgdGhlIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0fSBjb25zZW50RXZlbnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3Q6IENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENvbnNlbnRFdmVudHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIGFsbCBleGlzdGluZyBDUkIgQmFuayBJbmNvbWUgYW5kIEJhc2UgcmVwb3J0cyBmb3IgdGhlIGNvbnN1bWVyIGluIFBERiBmb3JtYXQuICBSZXNwb25zZSBpcyBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBERiBSZXBvcnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Q6IENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIHRvIHJlZnJlc2ggZGF0YSBpbiBhbiBleGlzdGluZyByZXBvcnQuIEEgQ29uc3VtZXIgUmVwb3J0IHdpbGwgbGFzdCBmb3IgMjQgaG91cnMgYmVmb3JlIGV4cGlyaW5nOyB5b3Ugc2hvdWxkIGNhbGwgYW55IGAvZ2V0YCBlbmRwb2ludHMgb24gdGhlIHJlcG9ydCBiZWZvcmUgaXQgZXhwaXJlcy4gSWYgYSByZXBvcnQgZXhwaXJlcywgeW91IGNhbiBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGFnYWluIHRvIHJlLWdlbmVyYXRlIGl0IGFuZCByZWZyZXNoIHRoZSBkYXRhIGluIHRoZSByZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggb3IgY3JlYXRlIGEgQ29uc3VtZXIgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydENyZWF0ZShjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgTk9URTogVGhlIGZvbGxvd2luZyBzY2hlbWEgd2FzIHVwZGF0ZWQgaW4gQXByaWwgMjAyNiB0byByZWZsZWN0IHRoZSByZXNwb25zZSB3aGVuIHRoZSBwcm92aWRlZCB2ZXJzaW9uIGlzIFxcXCJJSTJcXFwiLiBQbGVhc2Ugc2VlIFt0aGlzIGRvY3VtZW50XShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNoZWFkaW5nPWgucnVkYW16aW51czJpKSBmb3IgZ3VpZGFuY2Ugb24gbWlncmF0aW5nIHRvIElJMiBpZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyB0aGUgSUkxIHZlcnNpb24sIGFuZCBbdGhpcyBzZWN0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNib29rbWFyaz1pZC50ZGNjMndwazBoNjApIGZvciBhbiBleGFtcGxlIElJMSByZXNwb25zZSBhbG9uZyB3aXRoIGl0cyBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjM2Yzg1bjJpcmNxayNoZWFkaW5nPWguNzlkd3I1YzFpc3psKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5jb21lIGluc2lnaHRzIGZyb20geW91ciB1c2VyXFwncyBiYW5rc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBMZW5kU2NvcmUgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBMZW5kU2NvcmUgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXQoY3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydExlbmRTY29yZUdldChjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSBwYXJ0bmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQnkgZGVmYXVsdCwgdGhlIG1vc3QgcmVjZW50IEJhc2UgUmVwb3J0IChpZiBpdCBleGlzdHMpIGZvciB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkLiBUbyByZXF1ZXN0IHRoYXQgdGhlIG1vc3QgcmVjZW50IFBhcnRuZXIgSW5zaWdodHMgb3IgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFBERlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBob21lIGxlbmRpbmcgcmVwb3J0cyBmb3IgYSB1c2VyLiBUbyBvYnRhaW4gYSBWb0Egb3IgRW1wbG95bWVudCBSZWZyZXNoIHJlcG9ydCwgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYGNyYV9iYXNlX3JlcG9ydGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB2YXJpb3VzIGhvbWUgbGVuZGluZyByZXBvcnRzIGZvciBhIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0KGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdCwgc3BlY2lmaWNhbGx5IGZvcm1hdHRlZCBmb3IgSG9tZSBMZW5kaW5nIHZlcmlmaWNhdGlvbiB1c2UgY2FzZXMuIEJlZm9yZSBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGVuc3VyZSB0aGF0IHlvdVxcJ3ZlIGNyZWF0ZWQgYSBWT0EgcmVwb3J0IHRocm91Z2ggTGluayBvciB0aGUgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQsIGFuZCBoYXZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2suICBUaGUgcmVzcG9uc2UgdG8gYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBDb25zdW1lciBSZXBvcnQgYXMgYSBWZXJpZmljYXRpb24gUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY3JlZGl0X3Byb2ZpbGUvcmVwb3J0L2dldGAgcmV0cmlldmVzIGEgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IGZvciBhIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBjcmVkaXQgcHJvZmlsZSByZXBvcnQgZm9yIGEgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0fSBjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXQoY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0KGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYCByZWdpc3RlcnMgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXIoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHNcbiAgICAgICAgICogQHBhcmFtIHtDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdH0gY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0OiBDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFMb2Fuc1JlZ2lzdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VucmVnaXN0ZXJgIGluZGljYXRlcyB0aGUgbG9hbnMgaGF2ZSByZWFjaGVkIGEgZmluYWwgc3RhdHVzIGFuZCBubyBmdXJ0aGVyIHVwZGF0ZXMgYXJlIGV4cGVjdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVyIGEgbGlzdCBvZiBsb2Fuc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUxvYW5zVW5yZWdpc3RlcihjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdXBkYXRlYCB1cGRhdGVzIGxvYW4gaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzIGFuZCBwYXltZW50IGhpc3RvcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBsb2FuIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdDogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5zVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGEgQ2FzaCBGbG93IFVwZGF0ZXMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX2lkYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIHRvIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIGxpbmtlZCBDUkEgSXRlbSwgd2hpY2ggYXJlIHVwZGF0ZWQgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSAoYmVzdC1lZmZvcnQpLiBJbiB0aGUgY3VycmVudCBDYXNoIEZsb3cgVXBkYXRlcyBiZXRhIGV4cGVyaWVuY2UsIG9ubHkgb25lIEl0ZW0gcGVyIHVzZXIgbWF5IGJlIHN1YnNjcmliZWQgZm9yIG1vbml0b3JpbmcgdXBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91c2x5IHN1YnNjcmliZWQgTW9uaXRvcmluZyBJbnNpZ2h0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YCByZXR1cm5zIGNhc2ggZmxvdyBpbnNpZ2h0cyBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL3JlcG9ydC9nZXRgIHJldHJpZXZlcyBhIENSQSBSZXBvcnQgZm9yIGEgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBDUkEgUmVwb3J0IGZvciBwcm92aWRlZCB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUmVwb3J0R2V0UmVxdWVzdH0gY3JhUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYVJlcG9ydEdldChjcmFSZXBvcnRHZXRSZXF1ZXN0OiBDcmFSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYVJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYVJlcG9ydEdldChjcmFSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggYSBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQtU3BvbnNvcmVkIEVudGVycHJpc2UgKEdTRSkgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgKS4gIFVzZSB0aGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSBHU0Ugd2hvIG5lZWRzIGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC4gIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgaXMgZGVwcmVjYXRlZC4gVGhlIGJhY2tlbmQgaW1wbGVtZW50YXRpb24gd2FzIHJlbW92ZWQgKHJldHVybnMgYW4gYFVuaW1wbGVtZW50ZWRgIGVycm9yIGF0IHJ1bnRpbWUpLCBhbmQgdGhlIGVuZHBvaW50IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudGVkIEFQSSBzdXJmYWNlLiBUbyByZWZyZXNoIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGV4aXN0aW5nIHVzZXIsIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZSBzbyB0aGV5IGNhbiBjb25maXJtIHRoZWlyIGluY29tZSBzb3VyY2VzLiBGb3IgYSBmdWxseSBiYWNrZW5kIHJlZnJlc2gsIG1pZ3JhdGUgdG8gQ1JBIEluY29tZSBJbnNpZ2h0cyBhbmQgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0fSBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRva2VuLCBhbmQgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgYGVtcGxveWVyYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgV2hlbiB0ZXN0aW5nIGluIFNhbmRib3gsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVzdWx0cyBieSBwcm92aWRpbmcgc3BlY2lhbCB0ZXN0IHZhbHVlcyBpbiB0aGUgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGZpZWxkcy4gYGVtcGxveWVyX2dvb2RgIGFuZCBgZW1wbG95ZXJfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIGBlbXBsb3llcl9tdWx0aWAgd2lsbCByZXN1bHQgaW4gYSBgSElHSGAgY29uZmlkZW5jZSB3aXRoIG11bHRpcGxlIHBheXJvbGwgb3B0aW9ucy4gTGlrZXdpc2UsIGBhY2Nlc3NfZ29vZGAgYW5kIGBhY2Nlc3NfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIEFueSBvdGhlciB2YWx1ZSBmb3IgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGluIFNhbmRib3ggd2lsbCByZXN1bHQgaW4gYFVOS05PV05gIGNvbmZpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBQREYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBQREYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgRGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF1ZGl0IG9yIHRyYWNrIHRoZSBsaXN0IG9mIHJldmlld2VycyBmb3IgTW9uaXRvciwgQmVhY29uLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IERhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlkXFwncyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGNvbnNlbnQgZ3JhbnQgYnkgaXRzIGlkZW50aWZpZXJcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEZEWCBDb25zZW50IEdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhDb25zZW50c0dldChjb25zZW50SWQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxGRFhDb25zZW50R3JhbnQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Q29uc2VudHNHZXQoY29uc2VudElkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB6ZXJvIG9yIG1vcmUgY29uc2VudCBncmFudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkYXRhIHByb3ZpZGVyIGN1c3RvbWVyLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IHN0YXR1cy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBGRFggQ29uc2VudCBHcmFudHMgZm9yIGEgY3VzdG9tZXJcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbWVySWQgRGF0YSBwcm92aWRlciBjdXN0b21lciBpZGVudGlmaWVyIHdob3NlIGNvbnNlbnQgZ3JhbnRzIHRvIHJldHVybi5cbiAgICAgICAgICogQHBhcmFtIHtGRFhDb25zZW50R3JhbnRTdGF0dXN9IFtzdGF0dXNdIE9wdGlvbmFsIGZpbHRlciByZXN0cmljdGluZyByZXN1bHRzIHRvIGEgc2luZ2xlIGNvbnNlbnQgZ3JhbnQgc3RhdHVzLiBPbmUgb2YgJiN4NjA7QUNUSVZFJiN4NjA7LCAmI3g2MDtSRVZPS0VEJiN4NjA7LCAmI3g2MDtFWFBJUkVEJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZmR4Q29uc2VudHNMaXN0KGN1c3RvbWVySWQ6IHN0cmluZywgc3RhdHVzPzogRkRYQ29uc2VudEdyYW50U3RhdHVzLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEdldENvbnNlbnRzUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Q29uc2VudHNMaXN0KGN1c3RvbWVySWQsIHN0YXR1cywgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHJldm9jYXRpb24gaGlzdG9yeSBvZiBhIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgRkRYIENvbnNlbnQgR3JhbnQgcmV2b2NhdGlvbiByZWNvcmRzXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhDb25zZW50c1Jldm9jYXRpb25HZXQoY29uc2VudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RkRYQ29uc2VudFJldm9jYXRpb25zPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmZkeENvbnNlbnRzUmV2b2NhdGlvbkdldChjb25zZW50SWQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcHBlbmRzIGEgUkVWT0tFRCBzdGF0dXMgcmVjb3JkIHRvIHRoZSBuYW1lZCBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBGRFggQ29uc2VudCBHcmFudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZkeENvbnNlbnRzUmV2b2tlKGNvbnNlbnRJZDogc3RyaW5nLCByZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZHhDb25zZW50c1Jldm9rZShjb25zZW50SWQsIHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkLCBvQVVUSFNUQVRFSUQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBSZWNpcGllbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRSZWNpcGllbnRzKG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmdldFJlY2lwaWVudHMob3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgdG8gcmV0cmlldmUgaWRlbnRpdHkgZGV0YWlscyB3aGVuIHVzaW5nIFtJZGVudGl0eSBEb2N1bWVudCBVcGxvYWRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvaWRlbnRpdHktZG9jdW1lbnQtdXBsb2FkLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdXBsb2FkZWQgZG9jdW1lbnQgaWRlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGZvciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgYW5kL29yIGB1c2VyX2lkYCBmaWVsZC4gQXQgbGVhc3Qgb25lIG9mIHRoZXNlIHR3byBmaWVsZHMgbXVzdCBiZSBwcm92aWRlZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgYHVzZXJfaWRgIGlzIHByb3ZpZGVkLCB0aGVyZSBtdXN0IGJlIGFuIGFzc29jaWF0ZWQgdXNlcjsgb3RoZXJ3aXNlLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgLCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICAgSWYgYHVzZXJfaWRgIGlzIG5vdCBwcm92aWRlZCwgeW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIElmIGB1c2VyX2lkYCBpcyBwcm92aWRlZCwgdXNlciBpbmZvcm1hdGlvbiBjYW4gbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuIFBsZWFzZSB1c2UgdGhlIGAvdXNlci91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB1c2VyIGRhdGEgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvblxcJ3MgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnRcXCdzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgc3RvY2sgcG9zaXRpb24gZGF0YSBmb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudCBob2xkaW5ncyBhbmQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW2BJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYW5kIGhvbGRpbmdzIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIE5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0OiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBgSXNzdWVgLiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBzaW5nbGUgYElzc3VlYCBvYmplY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc0dldFJlcXVlc3R9IGlzc3Vlc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc3N1ZXNHZXQoaXNzdWVzR2V0UmVxdWVzdDogSXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJc3N1ZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pc3N1ZXNHZXQoaXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlYXJjaCBmb3IgYW4gaXNzdWUgYXNzb2NpYXRlZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOiAgYGl0ZW1faWRgLCBgbGlua19zZXNzaW9uX2lkYCBvciBMaW5rIHNlc3Npb24gYHJlcXVlc3RfaWRgLiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGZvciBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1NlYXJjaFJlcXVlc3R9IGlzc3Vlc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJc3N1ZXNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBhIHVzZXIgdG8gc3Vic2NyaWJlIHRvIHVwZGF0ZXMgb24gYSBzcGVjaWZpYyBgSXNzdWVgIHVzaW5nIGEgUE9TVCBtZXRob2QuIFN1YnNjcmliZXJzIHdpbGwgcmVjZWl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgaXNzdWUgc3RhdHVzIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB3aGVuIHJlc29sdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXNzdWVzU3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlclxcJ3MgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9uXFwncyBhY2Nlc3MgdG8gdGhlIFVzZXJcXCdzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlclxcJ3MgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUdldChpdGVtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtSW1wb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHRlcm1pbmF0ZSBhbiBJdGVtLiBPbmNlIHRlcm1pbmF0ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaXMgbm8gbG9uZ2VyIHZhbGlkLCBiaWxsaW5nIGZvciB0aGUgSXRlbVxcJ3MgcHJvZHVjdHMgaXMgZW5kZWQsIGFuZCByZWxldmFudCB3ZWJob29rcyBhcmUgZmlyZWQuICBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIG9mZmJvYXJkIHVzZXJzIG9yIGRpc2Nvbm5lY3QgYWNjb3VudHMgbGlua2VkIHZpYSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgVGVybWluYXRlIHByb2R1Y3RzIGZvciBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZShpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0OiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZShpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIENhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgYSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIHdoZW4gb2ZmYm9hcmRpbmcgdXNlcnMgb3IgaWYgYSB1c2VyIGNob29zZXMgdG8gZGlzY29ubmVjdCBhbiBhY2NvdW50IGxpbmtlZCB2aWEgUGxhaWQuIEZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBMaWFiaWxpdGllcywgYW5kIEludmVzdG1lbnRzLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIHJlcXVpcmVkIHRvIGVuZCBzdWJzY3JpcHRpb24gYmlsbGluZyBmb3IgdGhlIEl0ZW0sIHVubGVzcyB0aGUgZW5kIHVzZXIgcmV2b2tlZCBwZXJtaXNzaW9uIChlLmcuIHZpYSBbaHR0cHM6Ly9teS5wbGFpZC5jb20vXShodHRwczovL215LnBsYWlkLmNvbS8pKS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtTdWJzY3JpcHRpb24gZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jc3Vic2NyaXB0aW9uLWZlZSkuICBPbiBhIFRyaWFsIHBsYW4sIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgZG9lcyBub3QgaW1wYWN0IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIFRyaWFsIEl0ZW1zIChiYW5rIGNvbm5lY3Rpb25zKSB5b3UgaGF2ZSBhdmFpbGFibGUuICBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgYWNjZXNzIHRvIHRoZW0gc3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgYHBheW1lbnRfaW5pdGlhdGlvbmAgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgYGxpbmtfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJRCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIExpbmsgc2Vzc2lvbiwgaW5jbHVkaW5nIGFsbCBjYWxsYmFja3MgZmlyZWQgZHVyaW5nIHRoZSBzZXNzaW9uIGFsb25nIHdpdGggdGhlaXIgbWV0YWRhdGEsIGluY2x1ZGluZyB0aGUgcHVibGljIHRva2VuLiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgd2l0aCBMaW5rIGZsb3dzIHRoYXQgZG9uXFwndCBwcm92aWRlIGEgcHVibGljIHRva2VuIHZpYSBmcm9udGVuZCBjYWxsYmFja3MsIHN1Y2ggYXMgdGhlIFtIb3N0ZWQgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaG9zdGVkLWxpbmsvKSBhbmQgdGhlIFtNdWx0aS1JdGVtIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluay8pLiBJdCBhbHNvIGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gIEJ5IGRlZmF1bHQsIHRoaXMgZW5kcG9pbnQgd2lsbCBvbmx5IHJldHVybiBjb21wbGV0ZSBldmVudCBkYXRhIGZvciBIb3N0ZWQgTGluayBzZXNzaW9ucy4gVG8gdXNlIGAvbGluay90b2tlbi9nZXRgIHRvIHJldHJpZXZlIGV2ZW50IGRhdGEgZm9yIG5vbi1Ib3N0ZWQtTGluayBzZXNzaW9ucywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IHRoYXQgeW91ciBhY2NvdW50IGJlIGVuYWJsZWQgZm9yIExpbmsgZXZlbnRzLiBJZiB5b3UgZG8gbm90IGhhdmUgYW4gYWNjb3VudCBtYW5hZ2VyLCB5b3UgY2FuIHN1Ym1pdCB0aGlzIHJlcXVlc3QgdmlhIGEgc3VwcG9ydCB0aWNrZXQuIEVuYWJsZW1lbnQgZm9yIExpbmsgZXZlbnRzIHdpbGwgYWxzbyBjYXVzZSB5b3UgdG8gcmVjZWl2ZSBhZGRpdGlvbmFsIHdlYmhvb2tzIHJlbGF0ZWQgdG8gTGluayBldmVudHMsIHN1Y2ggYXMgdGhlIGBTRVNTSU9OX0ZJTklTSEVEYCBhbmQgYEVWRU5UU2Agd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9uZXR3b3JrL3N0YXR1cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgUGxhaWQgaGFzIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgc3RyZWFtbGluZWQgZXhwZXJpZW5jZSwgc3VjaCBhcyBMYXllci4gVG8gYWNjZXNzIHRoaXMgZW5kcG9pbnQsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBOb3RlOiBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBjaGVjayBmb3IgTGF5ZXIgZWxpZ2liaWxpdHkgaW4gdGhlIGZyb250ZW5kLiBgL25ldHdvcmsvc3RhdHVzL2dldGAgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY2hlY2tpbmcgTGF5ZXIgZWxpZ2liaWxpdHkgaWYgYSBmcm9udGVuZCBjaGVjayBpcyBub3QgcG9zc2libGUgZm9yIHlvdXIgdXNlIGNhc2UuIEZvciBpbnN0cnVjdGlvbnMgb24gcGVyZm9ybWluZyBhIGZyb250ZW5kIGVsaWdpYmlsaXR5IGNoZWNrLCBzZWUgdGhlIFtMYXllciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGEgdXNlclxcJ3MgUGxhaWQgTmV0d29yayBzdGF0dXNcbiAgICAgICAgICogQHBhcmFtIHtOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gbmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBuZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvb2F1dGgvaW50cm9zcGVjdGAgcmV0dXJucyBtZXRhZGF0YSBhYm91dCBhbiBhY2Nlc3MgdG9rZW4gb3IgcmVmcmVzaCB0b2tlbi4gIE5vdGU6IFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgbWV0YWRhdGEgYWJvdXQgYW4gT0F1dGggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtPQXV0aEludHJvc3BlY3RSZXF1ZXN0fSBvQXV0aEludHJvc3BlY3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgb2F1dGhJbnRyb3NwZWN0KG9BdXRoSW50cm9zcGVjdFJlcXVlc3Q6IE9BdXRoSW50cm9zcGVjdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8T0F1dGhJbnRyb3NwZWN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iub2F1dGhJbnRyb3NwZWN0KG9BdXRoSW50cm9zcGVjdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL29hdXRoL3Jldm9rZWAgcmV2b2tlcyBhbiBhY2Nlc3Mgb3IgcmVmcmVzaCB0b2tlbiwgcHJldmVudGluZyBhbnkgZnVydGhlciB1c2UuIElmIGEgcmVmcmVzaCB0b2tlbiBpcyByZXZva2VkLCBhbGwgYWNjZXNzIGFuZCByZWZyZXNoIHRva2VucyBkZXJpdmVkIGZyb20gaXQgYXJlIGFsc28gcmV2b2tlZCwgaW5jbHVkaW5nIGV4Y2hhbmdlZCB0b2tlbnMuICBOb3RlOiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIGFuIE9BdXRoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7T0F1dGhSZXZva2VSZXF1ZXN0fSBvQXV0aFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBvYXV0aFJldm9rZShvQXV0aFJldm9rZVJlcXVlc3Q6IE9BdXRoUmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxPQXV0aFJldm9rZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLm9hdXRoUmV2b2tlKG9BdXRoUmV2b2tlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvb2F1dGgvdG9rZW5gIGlzc3VlcyBhbiBhY2Nlc3MgdG9rZW4gYW5kIHJlZnJlc2ggdG9rZW4gZGVwZW5kaW5nIG9uIHRoZSBgZ3JhbnRfdHlwZWAgcHJvdmlkZWQuIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBhcyB3ZWxsIGFzIEpTT04uIFRoZSBmaWVsZHMgZm9yIHRoZSBmb3JtIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmaWVsZHMgZm9yIEpTT04gYW5kIGNvbmZvcm0gdG8gdGhlIE9BdXRoIDIuMCBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgb3IgcmVmcmVzaCBhbiBPQXV0aCBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtPQXV0aFRva2VuUmVxdWVzdH0gb0F1dGhUb2tlblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBvYXV0aFRva2VuKG9BdXRoVG9rZW5SZXF1ZXN0OiBPQXV0aFRva2VuUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxPQXV0aFRva2VuUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iub2F1dGhUb2tlbihvQXV0aFRva2VuUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLiBUbyBjcmVhdGUgZW5kIGN1c3RvbWVycywgaXQgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudCBvbmx5LCBldmVuIHdoZW4gY3JlYXRpbmcgU2FuZGJveCBBUEkga2V5cy4gSWYgY2FsbGVkIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBpdCB3aWxsIHJldHVybiBhIHNhbXBsZSByZXNwb25zZSwgYnV0IG5vIGN1c3RvbWVyIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIEFQSSBrZXlzIHdpbGwgbm90IGJlIHZhbGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIGRhdGEgYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIGZ1bGwgUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gRVVSLCBHQlAsIG9yIGFub3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJhY3MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnRcXCdzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLiAgUG9sbGluZyBmb3Igc3RhdHVzIHVwZGF0ZXMgaW4gUHJvZHVjdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQuIFJlcGVhdGVkbHkgY2FsbGluZyBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgdG8gY2hlY2sgYSBwYXltZW50XFwncyBzdGF0dXMgaXMgdW5yZWxpYWJsZSBhbmQgbWF5IHRyaWdnZXIgQVBJIHJhdGUgbGltaXRzLiBPbmx5IHRoZSBgcGF5bWVudF9zdGF0dXNfdXBkYXRlYCB3ZWJob29rIHNob3VsZCBiZSB1c2VkIHRvIHJlY2VpdmUgcmVhbC10aW1lIHN0YXR1cyB1cGRhdGVzIGluIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnRzIEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9zdXBwb3J0LnBsYWlkLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yNzg5NTgyNjk0NzczNS1XaGF0LVBsYWlkLXByb2R1Y3RzLWFyZS1zdXBwb3J0ZWQtaW4tZWFjaC1jb3VudHJ5LWFuZC1yZWdpb24pIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3RzIHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdFxcJ3MgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcsIHNhdmluZ3MsIG9yIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBiYWxhbmNlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgYXV0aG9yaXplZCBieSBhIHByb2Nlc3NvciB0b2tlbiwgaW5jbHVkaW5nIGFjY291bnQgbnVtYmVycywgYWNjb3VudCBvd25lcnMsIGhvbGRpbmdzLCBhbmQgZGF0YSBwcm92ZW5hbmNlIGluZm9ybWF0aW9uLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBBdXRoIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IGFjY291bnQgYXV0aGVudGljYXRpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgaW52ZXN0bWVudCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIEludmVzdG1lbnRzIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgeW91IGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgUGxhaWQgd2lsbCBub3JtYWxseSBpbmZlciB0aGUgb3V0Y29tZSBmcm9tIHlvdXIgU2lnbmFsIFJ1bGVzLiBIb3dldmVyLCBpZiB5b3UgYXJlIG5vdCB1c2luZyBTaWduYWwgUnVsZXMsIGlmIHRoZSBTaWduYWwgUnVsZXMgb3V0Y29tZSB3YXMgYFJFVklFV2AsIG9yIGlmIHlvdSB0YWtlIGEgZGlmZmVyZW50IGFjdGlvbiB0aGFuIHRoZSBvbmUgZGV0ZXJtaW5lZCBieSB0aGUgU2lnbmFsIFJ1bGVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAuIFRoaXMgaGVscHMgaW1wcm92ZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUgYWNjdXJhY3kgZm9yIHlvdXIgYWNjb3VudCBhbmQgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgdGhlIHJ1bGUgcGVyZm9ybWFuY2UgYW5kIHJ1bGUgdHVuaW5nIGNhcGFiaWxpdGllcyBpbiB0aGUgRGFzaGJvYXJkLiBJZiB5b3VyIGVmZmVjdGl2ZSBkZWNpc2lvbiBjaGFuZ2VzIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgYWdhaW4gZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBjb3JyZWN0IFBsYWlkXFwncyByZWNvcmRzLiAgSWYgeW91IGFyZSB1c2luZyBQbGFpZCBUcmFuc2ZlciBhcyB5b3VyIHBheW1lbnQgcHJvY2Vzc29yLCB5b3UgYWxzbyBkbyBub3QgbmVlZCB0byBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLCBhcyBQbGFpZCBjYW4gaW5mZXIgb3V0Y29tZXMgZnJvbSB5b3VyIFRyYW5zZmVyIGFjdGl2aXR5LiAgSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB1c2VzIFJ1bGVzZXRzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlIGVuZCBjdXN0b21lclxcJ3MgRGFzaGJvYXJkIGFuZCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBwcm9kdWN0IG9yIHRoZSBCYWxhbmNlIHByb2R1Y3QuIFdoaWNoIHByb2R1Y3QgaXMgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGBydWxlc2V0X2tleWAgdGhhdCB5b3UgcHJvdmlkZS4gTm90ZSB0aGF0IG9ubHkgY3VzdG9tZXItY29uZmlndXJlZCBydWxlc2V0cyB3b3JrIHdpdGggdGhpcyBlbmRwb2ludDsgYXMgYSBwcm9jZXNzb3IgcGFydG5lciwgeW91IGNhbm5vdCBjcmVhdGUgb3IgY29uZmlndXJlIHlvdXIgb3duIHJ1bGVzZXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IGhhdmUgaGlnaGVyIGxhdGVuY3kgaWYgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtIGZvciB0aGUgZmlyc3QgdGltZSwgb3Igd2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXF1ZXN0IGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIElmIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMsIG11bHRpcGxlIGRpZmZlcmVudCBwcm9jZXNzb3IgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIGZvciBhIHNpbmdsZSBhY2Nlc3MgdG9rZW4uIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW4gYmUgbW9kaWZpZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9zZXRgLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXJcXCdzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBpbnRlZ3JhdGlvbiBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBhbiBleGlzdGluZyBpbnRlZ3JhdGlvbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcuIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0KHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbXB1dGUgYSBQcm90ZWN0IFRydXN0IEluZGV4IHNjb3JlIGZvciBhIHVzZXIuIFRoZSBtb2RlbCBzZWxlY3RlZCBkZXRlcm1pbmVzIHdoYXQgaXMgc2NvcmVkIGFuZCB3aGF0IGFkZGl0aW9uYWwgZmllbGRzIHRoZSByZXNwb25zZSBjb250YWlucy4gRm9yIGV4YW1wbGUsIGB0aS1saW5rLXNlc3Npb24tMi4wYCBzY29yZXMgYSBjb21wbGV0ZWQgTGluayBzZXNzaW9uIGZvciBmcmF1ZCByaXNrOyBgY2FzaC1hZHZhbmNlLW9uYm9hcmRpbmctMS4wYCBzY29yZXMgcmVwYXltZW50IHJpc2sgZm9yIGEgZmlyc3QtdGltZSBjYXNoIGFkdmFuY2UgYW5kIGFkZGl0aW9uYWxseSBwb3B1bGF0ZXMgcGVyLWFtb3VudC1idWNrZXQgc3Vic2NvcmVzLiBDYXNoLWFkdmFuY2UgbW9kZWxzIHJlcXVpcmUgdGhhdCB0aGUgdXNlciBoYXZlIGEgUGxhaWQgSXRlbSB3aXRoIFRyYW5zYWN0aW9ucyBlbmFibGVkLCBvciBhbiBBc3NldHMgUmVwb3J0LCBiZWZvcmUgc2NvcmluZy4gIFRoZSBlbmRwb2ludCByZXR1cm5zIEhUVFAgNDAwIHdpdGggYGVycm9yX3R5cGVgID0gYElOVkFMSURfUkVRVUVTVGAgYW5kIGBlcnJvcl9jb2RlYCA9IGBGQUlMRURfUFJFQ09ORElUSU9OYCB3aGVuIGEgcmVxdWlyZWQgcHJlY29uZGl0aW9uIGlzIG5vdCBtZXQ6IGZvciBsaW5rLXNlc3Npb24gbW9kZWxzLCB3aGVuIHRoZSBMaW5rIHNlc3Npb24gaGFzIG5vdCBjb21wbGV0ZWQ7IGZvciBjYXNoLWFkdmFuY2UgbW9kZWxzLCB3aGVuIHRoZSB1c2VyIGhhcyBub3Qgc3VjY2Vzc2Z1bGx5IGxpbmtlZCBhbnkgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29tcHV0ZSBQcm90ZWN0IFRydXN0IEluZGV4IHNjb3JlcyBhbmQgc3Vic2NvcmVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvdGVjdENvbXB1dGVSZXF1ZXN0fSBwcm90ZWN0Q29tcHV0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm90ZWN0Q29tcHV0ZShwcm90ZWN0Q29tcHV0ZVJlcXVlc3Q6IFByb3RlY3RDb21wdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm90ZWN0Q29tcHV0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb3RlY3RDb21wdXRlKHByb3RlY3RDb21wdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnQgaW5jbHVkaW5nIFRydXN0IEluZGV4IHNjb3JlIGFuZCBmcmF1ZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7UHJvdGVjdEV2ZW50R2V0UmVxdWVzdH0gcHJvdGVjdEV2ZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0OiBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb3RlY3RFdmVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIG5ldyBldmVudCB0byBlbnJpY2ggdXNlciBkYXRhIGFuZCBvcHRpb25hbGx5IGdldCBhIFRydXN0IEluZGV4IHNjb3JlIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RFdmVudFNlbmRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb3RlY3RFdmVudFNlbmQocHJvdGVjdEV2ZW50U2VuZFJlcXVlc3Q6IFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb3RlY3RFdmVudFNlbmRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm90ZWN0RXZlbnRTZW5kKHByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgUHJvdGVjdCByZXBvcnQgdG8gZG9jdW1lbnQgZnJhdWQgaW5jaWRlbnRzLCBpbnZlc3RpZ2F0aW9uIG91dGNvbWVzLCBvciBvdGhlciByaXNrIGV2ZW50cy4gVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlcG9ydCB2YXJpb3VzIHR5cGVzIG9mIGluY2lkZW50cyBpbmNsdWRpbmcgYWNjb3VudCB0YWtlb3ZlcnMsIGlkZW50aXR5IGZyYXVkLCB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zLCBhbmQgb3RoZXIgc2VjdXJpdHkgZXZlbnRzLiBUaGUgcmVwb3J0ZWQgZGF0YSBoZWxwcyBpbXByb3ZlIGZyYXVkIGRldGVjdGlvbiBtb2RlbHMgYW5kIHByb3ZpZGVzIHZhbHVhYmxlIGZlZWRiYWNrIHRvIGVuaGFuY2UgdGhlIG92ZXJhbGwgc2VjdXJpdHkgb2YgdGhlIFBsYWlkIG5ldHdvcmsuIFJlcG9ydHMgY2FuIGJlIGNyZWF0ZWQgZm9yIGNvbmZpcm1lZCBpbmNpZGVudHMgdGhhdCBoYXZlIGJlZW4gZnVsbHkgaW52ZXN0aWdhdGVkLCBvciBmb3Igc3VzcGVjdGVkIGluY2lkZW50cyB0aGF0IHJlcXVpcmUgZnVydGhlciByZXZpZXcuIFlvdSBjYW4gYXNzb2NpYXRlIHJlcG9ydHMgd2l0aCBzcGVjaWZpYyB1c2Vycywgc2Vzc2lvbnMsIG9yIHRyYW5zYWN0aW9ucyB0byBwcm92aWRlIGNvbXByZWhlbnNpdmUgY29udGV4dCBhYm91dCB0aGUgaW5jaWRlbnQuIEVhY2ggcmVwb3J0IG11c3QgaW5jbHVkZSBgdXNlcl9pZGAsIG9yIGFuIGBpbmNpZGVudF9ldmVudGAgd2l0aCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIGlkZW50aWZpZXI6IGBsaW5rX3Nlc3Npb25faWRgLCBgaWR2X3Nlc3Npb25faWRgLCBgcHJvdGVjdF9ldmVudF9pZGAsIGBzaWduYWxfY2xpZW50X3RyYW5zYWN0aW9uX2lkYCwgb3IgYGFjY2Vzc190b2tlbmAuIENvbnRleHQgZmllbGRzIHN1Y2ggYXMgYGludGVybmFsX3JlZmVyZW5jZWAsIGB0aW1lYCwgYGFtb3VudGAsIGFuZCBgYmFua19hY2NvdW50YCBkbyBub3Qgc2F0aXNmeSB0aGlzIGlkZW50aWZpZXIgcmVxdWlyZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIFByb3RlY3QgcmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7UHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3R9IHByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvdGVjdFJlcG9ydENyZWF0ZShwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdDogUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvdGVjdFJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb3RlY3RSZXBvcnRDcmVhdGUocHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBnZXQgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGFzIGl0IHJlbGF0ZXMgdG8gdGhlaXIgZnJhdWQgcHJvZmlsZSB3aXRoIFByb3RlY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBQcm90ZWN0IHVzZXIgaW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdH0gcHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm90ZWN0VXNlckluc2lnaHRzR2V0KHByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm90ZWN0VXNlckluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvdGVjdFVzZXJJbnNpZ2h0c0dldChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBNYW51YWxseSBmaXJlIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdDogU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvZmR4L2NvbnNlbnQvc2VlZGAgY3JlYXRlcyBhIHRlc3QgRkRYIGNvbnNlbnQgZ3JhbnQgKGFuZCBhIGJhY2tpbmcgSXRlbSkgZm9yIGEgZGF0YSBwcm92aWRlclxcJ3MgY3VzdG9tZXIgaW4gU2FuZGJveCwgc28gdGhlIEZEWCBDb25zZW50IEFQSSBlbmRwb2ludHMgY2FuIGJlIGV4ZXJjaXNlZCBlbmQtdG8tZW5kIHdpdGhvdXQgYSBsaXZlIGRhdGEgcHJvdmlkZXIgY29ubmVjdGlvbi4gIGBjdXN0b21lcl9pZGAgaXMgdGhlIGRhdGEgcHJvdmlkZXJcXCdzIGlkZW50aWZpZXIgZm9yIHRoZSBlbmQgdXNlciBhbmQgYGFwcGxpY2F0aW9uX2lkYCBpZGVudGlmaWVzIHRoZSBkYXRhIHJlY2lwaWVudCBhcHBsaWNhdGlvbiB0aGUgY29uc2VudCBpcyBncmFudGVkIHRvOyBib3RoIGFyZSByZXF1aXJlZC4gT3B0aW9uYWxseSBwcm92aWRlIGBjb25zZW50X2lkYCAoYSBVVUlEdjQpIHRvIGNvbnRyb2wgdGhlIHNlZWRlZCBncmFudFxcJ3MgaWRlbnRpZmllcjsgb25lIGlzIGdlbmVyYXRlZCB3aGVuIG9taXR0ZWQuIFRoZSBzZWVkZWQgZ3JhbnQgaXMgcmV0dXJuZWQgYnkgYC9mZHgvY29uc2VudHNgIGFuZCBgL2ZkeC9jb25zZW50cy97Y29uc2VudElkfWAsIGFuZCBjYW4gYmUgcmV2b2tlZCB2aWEgYC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH0vcmV2b2NhdGlvbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlZWQgYW4gRkRYIGNvbnNlbnQgZ3JhbnQgZm9yIGEgc2FuZGJveCBkYXRhIHBhcnRuZXJcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0fSBzYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEZkeENvbnNlbnRTZWVkKHNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3Q6IFNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEZkeENvbnNlbnRTZWVkUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEZkeENvbnNlbnRTZWVkKHNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL2FwcGxpY2F0aW9uL3NlZWRgIGNyZWF0ZXMgYSB0ZXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBvbiBhbiBleGlzdGluZyBQZXJtaXNzaW9ucyBNYW5hZ2VyIEl0ZW1cXCdzIGxvZ2luLiBUaGUgc2VlZGVkIGFwcGxpY2F0aW9uIHdpbGwgYXBwZWFyIGluIHN1YnNlcXVlbnQgY2FsbHMgdG8gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgLiAgVGhlIGBhY2Nlc3NfdG9rZW5gIG11c3QgYmVsb25nIHRvIGEgUGVybWlzc2lvbnMgTWFuYWdlciBJdGVtIGNyZWF0ZWQgdmlhIGAvaXRlbS9pbXBvcnRgIGluIFNhbmRib3guIFRoZSBgYXBwbGljYXRpb25faWRgIGlkZW50aWZpZXMgdGhlIGFwcGxpY2F0aW9uIHRvIHNlZWQgYXMgYSBjb25uZWN0ZWQgYXBwLiBUbyBkaXNjb25uZWN0IGEgc2VlZGVkIGFwcGxpY2F0aW9uLCB1c2UgYC9pdGVtL2FwcGxpY2F0aW9uL3VubGlua2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlZWQgYSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgUGVybWlzc2lvbnMgTWFuYWdlciBzYW5kYm94IGl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3R9IHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdDogU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWQoc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIFNhbWUtRGF5IE1pY3JvLWRlcG9zaXQgSXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnNcXCcgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBQTkMgSXRlbXMsIGJ1dCBtYXkgYmUgc2VudCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgb3IgSXRlbS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgeW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9BdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT0F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3R9IHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgdmFyaW91cyBwYXltZW50IGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVGhpcyBlbmRwb2ludCB3aWxsIHRyaWdnZXIgdGhlIGNvcnJlc3BvbmRpbmcgcGF5bWVudCBzdGF0dXMgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBwYXltZW50IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YSwgb3Igd2l0aCBQbGFpZFxcJ3MgW3ByZS1wb3B1bGF0ZWQgU2FuZGJveCB0ZXN0IGFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdGVzdC1jcmVkZW50aWFscy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2FjdGlvbnMvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgbmV3IHRyYW5zYWN0aW9ucyBmb3IgYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgdXAgdG8gMTAgdHJhbnNhY3Rpb25zIHRvIGFueSBJdGVtIGF0IGEgdGltZS4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEl0ZW1zIHRoYXQgd2VyZSBjcmVhdGVkIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50IHVzaW5nIHRoZSBgdXNlcl90cmFuc2FjdGlvbnNfZHluYW1pY2AgdGVzdCB1c2VyLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGFkZCB0cmFuc2FjdGlvbnMgdG8gdGVzdCB0aGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnRzLiAgQ3VzdG9tIHRyYW5zYWN0aW9ucyBhcmUgb25seSBhcHBsaWVkIHRvIHRoZSBkZXBvc2l0b3J5IGFjY291bnQuIFN1cHBvcnQgZm9yIHBlci1hY2NvdW50IHRhcmdldGluZyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHNhbmRib3ggdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZShzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGUoc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmAgZnVuY3Rpb25zIHRoZSBzYW1lIGFzIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgYnV0IHdpbGwgbW9kaWZ5IEl0ZW1zIHJlbGF0ZWQgdG8gYSBVc2VyLiBUaGlzIGVuZHBvaW50IGZvcmNlcyBlYWNoIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmAsIHlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgaXRlbShzKSBmb3IgYSBTYW5kYm94IFVzZXIgaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2Vzc2lvbi90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgTGF5ZXIuIFRoZSByZXR1cm5lZCBMaW5rIHRva2VuIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgdGhlIExpbmsgU0RLLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgTGluayB0b2tlbiBmb3IgTGF5ZXJcbiAgICAgICAgICogQHBhcmFtIHtTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0fSBzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2Vzc2lvblRva2VuQ3JlYXRlKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3Q6IFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2Vzc2lvblRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2Vzc2lvblRva2VuQ3JlYXRlKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciB5b3UgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAsIFBsYWlkIHdpbGwgbm9ybWFsbHkgaW5mZXIgdGhlIG91dGNvbWUgZnJvbSB5b3VyIFNpZ25hbCBSdWxlcy4gSG93ZXZlciwgaWYgeW91IGFyZSBub3QgdXNpbmcgU2lnbmFsIFJ1bGVzLCBpZiB0aGUgU2lnbmFsIFJ1bGVzIG91dGNvbWUgd2FzIGBSRVZJRVdgLCBvciBpZiB5b3UgdGFrZSBhIGRpZmZlcmVudCBhY3Rpb24gdGhhbiB0aGUgb25lIGRldGVybWluZWQgYnkgdGhlIFNpZ25hbCBSdWxlcywgeW91IHdpbGwgbmVlZCB0byBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAuIFRoaXMgaGVscHMgaW1wcm92ZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUgYWNjdXJhY3kgZm9yIHlvdXIgYWNjb3VudCBhbmQgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgdGhlIHJ1bGUgcGVyZm9ybWFuY2UgYW5kIHJ1bGUgdHVuaW5nIGNhcGFiaWxpdGllcyBpbiB0aGUgRGFzaGJvYXJkLiBJZiB5b3VyIGVmZmVjdGl2ZSBkZWNpc2lvbiBjaGFuZ2VzIGFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCAoZm9yIGV4YW1wbGUsIHlvdSBpbmRpY2F0ZWQgdGhhdCB5b3UgYWNjZXB0ZWQgYSB0cmFuc2FjdGlvbiwgYnV0IGxhdGVyIG9uLCB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIHJlamVjdGVkIGl0LCBzbyBpdCB3YXMgbmV2ZXIgaW5pdGlhdGVkKSwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIGFnYWluIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gY29ycmVjdCBQbGFpZFxcJ3MgcmVjb3Jkcy4gIElmIHlvdSBhcmUgdXNpbmcgUGxhaWQgVHJhbnNmZXIgYXMgeW91ciBwYXltZW50IHByb2Nlc3NvciwgeW91IGFsc28gZG8gbm90IG5lZWQgdG8gY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLCBhcyBQbGFpZCBjYW4gaW5mZXIgb3V0Y29tZXMgZnJvbSB5b3VyIFRyYW5zZmVyIGFjdGl2aXR5LiAgSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBCZWZvcmUgdXNpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgcnVsZXNldF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykgaW4gdGhlIERhc2hib2FyZCB1bmRlciBbKipTaWduYWwtPlJ1bGVzKipdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zaWduYWwvcmlzay1wcm9maWxlcykuICBgL3NpZ25hbC9ldmFsdWF0ZWAgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBvciB0aGUgQmFsYW5jZSBwcm9kdWN0LiBXaGljaCBwcm9kdWN0IGlzIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBgcnVsZXNldF9rZXlgIHRoYXQgeW91IHByb3ZpZGUuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbU2lnbmFsIFJ1bGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NpZ25hbC9zaWduYWwtcnVsZXMvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgaGF2ZSBoaWdoZXIgbGF0ZW5jeSB3aGVuIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQuIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJlcXVlc3QgZGF0YS4gQmFsYW5jZS1vbmx5IHJ1bGVzZXRzIG1heSBoYXZlIGxhdGVuY3kgb2YgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsRXZhbHVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGFuIEl0ZW0gaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgdXNlZCB0byBkZXZlbG9wIGEgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIGBzaWduYWxgIHdhcyBhZGRlZCBpbiB0aGUgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheSBidXQgbm90IGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheS4gSWYgYC9zaWduYWwvcHJlcGFyZWAgaXMgc2tpcHBlZCBvbiBhbiBJdGVtIHRoYXQgaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIHRoZSBpbml0aWFsIGNhbGwgdG8gYC9zaWduYWwvZXZhbHVhdGVgIG9uIHRoYXQgSXRlbSB3aWxsIGJlIGxlc3MgYWNjdXJhdGUsIGJlY2F1c2UgUGxhaWQgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgeW91ciBpbnRlZ3JhdGlvbiBpcyBwdXJlbHkgQmFsYW5jZS1vbmx5LCB0aGlzIGVuZHBvaW50IHdpbGwgaGF2ZSBubyBlZmZlY3QsIGFzIEJhbGFuY2Utb25seSBydWxlc2V0cyBkbyBub3QgY2FsY3VsYXRlIGEgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3Jlc1xuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmRzIGludG8geW91ciBzY29yZXMgYW5kIHR1bmUgcnVsZSBsb2dpYy4gSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChhcyBCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFNjaGVkdWxlUmVxdWVzdH0gc2lnbmFsU2NoZWR1bGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0OiBTaWduYWxTY2hlZHVsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsU2NoZWR1bGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxTY2hlZHVsZShzaWduYWxTY2hlZHVsZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnQgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0aGUgSXRlbSB3YXMgbGFzdCB1cGRhdGVkLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlclxcJ3MgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoZSBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBUcmFuc2FjdGlvbnMgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAuICBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIG9wdGlvbmFsIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcuIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBBIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHVzZWQgdG8gY3JlYXRlIGEgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6ICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZS1EYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGdldCBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIG9mIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYW4gYWNjb3VudCB0byBiZSB1c2VkIHdpdGggVHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgd29ya3Mgb24gYWxsIFRyYW5zZmVyLWNhcGFibGUgSXRlbXMsIGluY2x1ZGluZyB0aG9zZSBjcmVhdGVkIGJ5IGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGVpciBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdVxcJ2xsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBgbXVsdGlwYXJ0L2Zvcm0tZGF0YWAuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgNTAwIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0fSB0cmFuc2ZlckludGVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3Q6IFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzLCBpZiB5b3UgaGF2ZSBtdWx0aXBsZS4gSWYgeW91XFwncmUgYSBwbGF0Zm9ybSwgeW91IGNhbiBtb3ZlIGZ1bmRzIGJldHdlZW4gb25lIG9mIHlvdXIgbGVkZ2VycyBhbmQgb25lIG9mIHlvdXIgY3VzdG9tZXJcXCdzIGxlZGdlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIGxlZGdlciBldmVudHMgZm9yIGEgc3BlY2lmaWMgbGVkZ2VyIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgbGVkZ2VyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJFdmVudExpc3QodHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlckV2ZW50TGlzdCh0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy4gIEluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCB0aGlzIGVuZHBvaW50IHJldHVybnMgc3RhdGljIHBsYWNlaG9sZGVyIHZhbHVlcyByYXRoZXIgdGhhbiBtZXRyaWNzIGNvbXB1dGVkIGZyb20geW91ciBTYW5kYm94IHRyYW5zZmVyIGFjdGl2aXR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBwcmV2aW91c2x5LXZlcmlmaWVkIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBvciBbc3VwcG9ydF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQpLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBmdW5kaW5nIGFjY291bnQgZm9yIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgZnVuZGluZyBhY2NvdW50IGZvciBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBzdWJtaXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3IgeW91IGFyZSBvbmJvYXJkaW5nLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmF0b3JcXCdzIGFncmVlbWVudCB0byB0aGUgcmVxdWlyZWQgbGVnYWwgdGVybXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yIChlLmcuIGJlbmVmaWNpYWwgb3duZXIgb3IgY29udHJvbCBwZXJzb24pIGFuZCBvcHRpb25hbGx5IHN1Ym1pdCBwZXJzb25hbCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgYWRkaXRpb25hbCBvbmJvYXJkaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVlZGVkIGJ5IFBsYWlkIHRvIGFwcHJvdmUgb3IgZGVjbGluZSB0aGUgb3JpZ2luYXRvci4gU2VlIFtSZXF1aXJlbWVudCB0eXBlIHNjaGVtYSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFORVFrVEQwc1ZLNTBpQVFpNnhIaWdyZXhEVXhaNFF4WHFTRWZWX0ZGVGlVLykgZm9yIGEgbGlzdCBvZiByZXF1aXJlbWVudCB0eXBlcyBhbmQgcG9zc2libGUgdmFsdWVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgYWRkaXRpb25hbCBvbmJvYXJkaW5nIGluZm9ybWF0aW9uIG9uIGJlaGFsZiBvZiBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZFxcJ3MgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci4gIEEgc2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIGJhbmsgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuICBBIHJlZnVuZCBjYW4gc3RpbGwgYmUgaXNzdWVkIGV2ZW4gaWYgdGhlIEl0ZW1cXCdzIGBhY2Nlc3NfdG9rZW5gIGlzIG5vIGxvbmdlciB2YWxpZCAoZS5nLiBpZiB0aGUgdXNlciByZXZva2VkIE9BdXRoIGNvbnNlbnQgb3IgdGhlIEl0ZW0gd2FzIGRlbGV0ZWQgdmlhIGAvaXRlbS9yZW1vdmVgKSwgYXMgbG9uZyBhcyB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgcGFpciB1c2VkIHRvIG1ha2UgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGlzIHN0aWxsIHZhbGlkLiBBIHJlZnVuZCBjYW5ub3QgYmUgaXNzdWVkIGlmIHRoZSBJdGVtIGhhcyBhbiBbaW52YWxpZGF0ZWQgVEFOXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLCB3aGljaCBjYW4gb2NjdXIgYXQgQ2hhc2Ugb3IgUE5DLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JldHVybi9yZWNvdmVyYCBlbmRwb2ludCB0byBub3RpZnkgUGxhaWQgdGhhdCB5b3UgaGF2ZSByZWNvdmVyZWQgc29tZSBvciBhbGwgb2YgdGhlIGxvc3Mgb24gYSByZXR1cm5lZCBndWFyYW50ZWVkIHRyYW5zZmVyLiAgUmVjb3ZlcnkgY2FuIGJlIHJlcG9ydGVkIGluIGZ1bGwgb3IgaW4gcGFydHM7IHRoZSBzdW0gb2YgcmVjb3ZlcmVkIGFtb3VudHMgYWNyb3NzIGNhbGxzIGNhbm5vdCBleGNlZWQgdGhlIG9yaWdpbmFsIHRyYW5zZmVyXFwncyBhbW91bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiByZWNvdmVyeVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3R9IHRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJldHVyblJlY292ZXIodHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdDogVHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJldHVyblJlY292ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJldHVyblJlY292ZXIodHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyBzZW5kaW5nIGNsaWVudC1zcGVjaWZpYyBldmVudHMgcmVsYXRlZCB0byBMYXllciBzZXNzaW9ucyBmb3IgYW5hbHl0aWNzIGFuZCB0cmFja2luZyBwdXJwb3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgU2VuZCBVc2VyIEFjY291bnQgU2Vzc2lvbiBFdmVudFxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3R9IHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmQodXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmQodXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB1c2VyIHBlcm1pc3Npb25lZCBhY2NvdW50IGRhdGEsIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLCBmb3IgdXNlIHdpdGggW1BsYWlkIExheWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyKS4gTm90ZSB0aGF0IGVuZCB1c2VycyBhcmUgcGVybWl0dGVkIHRvIGVkaXQgdGhlIHByZWZpbGxlZCBpZGVudGl0eSBkYXRhIGluIHRoZSBMaW5rIGZsb3cgYmVmb3JlIHNoYXJpbmcgaXQgd2l0aCB5b3U7IHlvdSBzaG91bGQgdHJlYXQgYW55IGlkZW50aXR5IGRhdGEgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcyB1c2VyLXN1Ym1pdHRlZCwgdW52ZXJpZmllZCBkYXRhLiBGb3IgYSB2ZXJpZmljYXRpb24gbGF5ZXIsIHlvdSBjYW4gYWRkIFtJZGVudGl0eSBWZXJpZmljYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uLykgdG8geW91ciBmbG93LCBvciBjaGVjayB0aGUgc3VibWl0dGVkIGlkZW50aXR5IGRhdGEgYWdhaW5zdCBiYW5rIGFjY291bnQgZGF0YSBmcm9tIGxpbmtlZCBhY2NvdW50cyB1c2luZyBbSWRlbnRpdHkgTWF0Y2hdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvI2lkZW50aXR5LW1hdGNoKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRm9yIFBsYWlkIHByb2R1Y3RzIGFuZCBmbG93cyB0aGF0IHVzZSB0aGUgdXNlciBvYmplY3QsIGAvdXNlci9jcmVhdGVgIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3UgbXVzdCBjYWxsIHRoaXMgZW5kcG9pbnQgYmVmb3JlIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaWYgeW91IGFyZSB1c2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZzogUGxhaWQgQ2hlY2ssIEluY29tZSBWZXJpZmljYXRpb24sIE11bHRpLUl0ZW0gTGluaywgb3IgUGxhaWQgUHJvdGVjdCAoSWRlbnRpdHkpLiBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFByb3RlY3QgTGluayBzZXNzaW9uIHNjb3JpbmcsIHlvdSBkbyBub3QgbmVlZCB0byBjYWxsIGAvdXNlci9jcmVhdGVgIGZpcnN0OyBQbGFpZCB3aWxsIHJlc29sdmUgb3IgY3JlYXRlIHRoZSB1c2VyIHdoZW4gYHVzZXIuY2xpZW50X3VzZXJfaWRgIGlzIHByb3ZpZGVkIGluIGAvbGluay90b2tlbi9jcmVhdGVgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyB0aGlzIGVuZHBvaW50IG9uIG9yIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1LCB0aGlzIGVuZHBvaW50IHRha2VzIGEgYGNsaWVudF91c2VyX2lkYCBhbmQgYW4gYGlkZW50aXR5YCBvYmplY3QgYW5kIHdpbGwgcmV0dXJuIGEgYHVzZXJfaWRgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyBpdCBiZWZvcmUgdGhhdCBkYXRlLCB0aGUgZW5kcG9pbnQgdGFrZXMgYSBgY2xpZW50X3VzZXJfaWRgIGFuZCBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IGFuZCB3aWxsIHJldHVybiBhIGB1c2VyX3Rva2VuYCBhbmQgYHVzZXJfaWRgLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIEluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLCB0aGUgYGlkZW50aXR5YCAobmV3KSBvciBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIChsZWdhY3kpIG9iamVjdCBtdXN0IGJlIHByZXNlbnQuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiAgIEluIG9yZGVyIHRvIGdlbmVyYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCB0aGUgZm9sbG93aW5nIGBpZGVudGl0eWAgZmllbGRzLCBhdCBtaW5pbXVtLCBhcmUgcmVxdWlyZWQgYW5kIG11c3QgYmUgbm9uLWVtcHR5OiBgbmFtZWAsIGBkYXRlX29mX2JpcnRoYCwgYGVtYWlsc2AsIGBwaG9uZV9udW1iZXJzYCwgYW5kIGBhZGRyZXNzZXNgICh3aXRoIGF0IGxlYXN0IG9uZSBlbWFpbCwgcGhvbmUgbnVtYmVyLCBhbmQgYWRkcmVzcyBkZXNpZ25hdGVkIGFzIGBwcmltYXJ5YCkuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiBJZiBjcmVhdGluZyBhIHJlcG9ydCBmb3Igc2hhcmluZyB3aXRoIGEgR1NFIHN1Y2ggYXMgRmFubmllIG9yIEZyZWRkaWUsIHRoZSB1c2VyXFwncyBmdWxsIFNTTiBtdXN0IGJlIHByb3ZpZGVkIHZpYSB0aGUgYGlkX251bWJlcnNgIGZpZWxkLiBQcm92aWRpbmcgYXQgbGVhc3QgYSBwYXJ0aWFsIFNTTiBpcyBhbHNvIHN0cm9uZ2x5IHJlY29tbWVuZGVkIGZvciBhbGwgdXNlIGNhc2VzLCBzaW5jZSBpdCBpbXByb3ZlcyB0aGUgYWNjdXJhY3kgb2YgbWF0Y2hpbmcgdXNlciByZWNvcmRzIGR1cmluZyBjb21wbGlhbmNlIHByb2Nlc3NlcyBzdWNoIGFzIGZpbGUgZGlzY2xvc3VyZSwgZGlzcHV0ZSwgb3Igc2VjdXJpdHkgZnJlZXplIHJlcXVlc3RzLiAgIFdoZW4gdXNpbmcgUGxhaWQgUHJvdGVjdCwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHByb3ZpZGUgYW4gYGlkZW50aXR5YCBvYmplY3QgdG8gYmV0dGVyIGlkZW50aWZ5IGFuZCBibG9jayBmcmF1ZCBhY3Jvc3MgeW91ciBMaW5rIHNlc3Npb25zLiAgIFBsYWlkIHdpbGwgbm9ybWFsaXplIGlkZW50aXR5IGZpZWxkcyBiZWZvcmUgc3RvcmluZyB0aGVtIGFuZCB1dGlsaXplIHRoZSBzYW1lIGlkZW50aXR5IGFjcm9zcyBkaWZmZXJlbnQgdXNlci1iYXNlZCBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIEZpbmFuY2lhbCBJbnNpZ2h0cyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyB0aGUgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgYW5kIExpYWJpbGl0aWVzIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBGaW5hbmNpYWwgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdXNlciBpdGVtcyBmb3IgRmluYW5jaWFsLUluc2lnaHRzIGJ1bmRsZVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3R9IHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2godXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdDogVXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyRmluYW5jaWFsRGF0YVJlZnJlc2godXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCB1c2VyIGRldGFpbHMgdXNpbmcgYSBgdXNlcl9pZGAuIFRoaXMgZW5kcG9pbnQgb25seSBzdXBwb3J0cyB1c2VycyB0aGF0IHdlcmUgY3JlYXRlZCBvbiB0aGUgbmV3IHVzZXIgQVBJIGZsb3csIHdpdGhvdXQgYSBgdXNlcl90b2tlbmAuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbTmV3IFVzZXIgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdXNlcnMvdXNlci1hcGlzKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdXNlciBpZGVudGl0eSBhbmQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyR2V0UmVxdWVzdH0gdXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckdldCh1c2VyR2V0UmVxdWVzdDogVXNlckdldFJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyR2V0KHVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgY3VzdG9tZXJzIHRvIGV4cGxpY2l0bHkgcHVyZ2UgaWRlbnRpdHkvUElJIGRhdGEgcHJvdmlkZWQgdG8gUGxhaWQgZm9yIGEgZ2l2ZW4gdXNlci4gVGhpcyBpcyBub3QgZXhwb3NlZCB0byBjdXN0b21lcnMgYnkgZGVmYXVsdCwgYXMgaXQgaXMgbWVhbnQgZm9yIHNwZWNpYWwgc2NlbmFyaW9zIG9yIHJlcXVlc3RzLCBidXQgUGxhaWQgaXMgb2JsaWdhdGVkIHRvIGVuYWJsZSBjdXN0b21lcnMgdG8gZGVsZXRlIFBJSSBwcm92aWRlZCB0byB1cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXIgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3R9IHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlcklkZW50aXR5UmVtb3ZlKHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3Q6IFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJJZGVudGl0eVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJJZGVudGl0eVJlbW92ZSh1c2VySWRlbnRpdHlSZW1vdmVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXNzb2NpYXRlcyBJdGVtcyB0byB0aGUgdGFyZ2V0IHVzZXIuIElmIGFuIEl0ZW0gaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGFub3RoZXIgdXNlciwgdGhlIEl0ZW0gd2lsbCBiZSBkaXNhc3NvY2lhdGVkIHdpdGggdGhlIGV4aXN0aW5nIHVzZXIgYW5kIGFzc29jaWF0ZWQgdG8gdGhlIHRhcmdldCB1c2VyLiBUaGlzIG9wZXJhdGlvbiBzdXBwb3J0cyBhIG1heCBvZiAxMDAgSXRlbXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFzc29jaWF0ZSBJdGVtcyB0byBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0fSB1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckl0ZW1zQXNzb2NpYXRlKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3Q6IFVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckl0ZW1zQXNzb2NpYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckl0ZW1zQXNzb2NpYXRlKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIGB1c2VyX2lkYCwgYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHN0YXR1c2VzLiBQbGFpZCBhc3NvY2lhdGVzIGFuIEl0ZW0gd2l0aCBhIFVzZXIgd2hlbiBpdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHdpdGhpbiBhIExpbmsgc2Vzc2lvbiBpbml0aWFsaXplZCB3aXRoIHRoYXQgYHVzZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VySXRlbXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgc3BlY2lmaWMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci4gSXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIG9uIGVhY2ggSXRlbSBpbmRpdmlkdWFsbHksIGJ1dCBzdXBwb3J0cyB1c2UgY2FzZXMgKHN1Y2ggYXMgUGxhaWQgQ2hlY2spIHdoZXJlIGFjY2VzcyB0b2tlbnMgYXJlIG5vdCBhdmFpbGFibGUuIEFsbCBzcGVjaWZpZWQgSXRlbXMgbXVzdCBiZWxvbmcgdG8gdGhlIHVzZXIgb3IgdGhlIGVudGlyZSBvcGVyYXRpb24gZmFpbHMuIFNpbWlsYXIgdG8gYC9pdGVtL3JlbW92ZWAsIHRoaXMgZGVsZXRlcyBJdGVtIHByb2R1Y3QgZGF0YSBhbmQgdGVybWluYXRlcyBiaWxsaW5nIG9uIHRoZSBJdGVtXFwncyBwcm9kdWN0cy4gT25jZSByZW1vdmVkLCBJdGVtcyBjYW5ub3QgYmUgcmVjb25uZWN0ZWQgd2l0aG91dCBnb2luZyB0aHJvdWdoIExpbmsgYWdhaW4uIFRoaXMgZW5kcG9pbnQgaXMgbm90IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgZGF0YSBmb3IgYSB1c2VyLCBhcyBpdCB3aWxsIG9ubHkgcmVtb3ZlIEl0ZW1zIGFuZCBubyBvdGhlciBkYXRhIGZvciB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIGFueSB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gcHJvZHVjdHMgKEZpbmFuY2lhbCBNYW5hZ2VtZW50LCBQbGFpZCBQcm90ZWN0LCBvciBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFuZCBpcyBkZWxldGluZyB0aGVpciBhY2NvdW50IHdpdGggeW91ciBwcm9kdWN0LCBhbHNvIGNhbGwgYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWAgdG8gZW5kIHRob3NlIHN1YnNjcmlwdGlvbnM7IHBlci1JdGVtIGJpbGxpbmcgaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBhIHVzZXIgaW5pdGlhdGVkIGRhdGEgZGVsZXRpb24gcmVxdWVzdCwgc2VlIHRoZSBbQ29uc3VtZXIgU2VydmljZSBDZW50ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2NoZWNrL2NvbnN1bWVyLXNlcnZpY2UtY2VudGVyLykgdG8gcmV2b2tlIGFjY2VzcyB0byBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgSXRlbXMgZnJvbSBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNSZW1vdmVSZXF1ZXN0fSB1c2VySXRlbXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckl0ZW1zUmVtb3ZlKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3Q6IFVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckl0ZW1zUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckl0ZW1zUmVtb3ZlKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUZXJtaW5hdGVzIHVzZXItYmFzZWQgcmVjdXJyaW5nIHN1YnNjcmlwdGlvbiBidW5kbGVzIG9yIHByb2R1Y3RzIChGaW5hbmNpYWwgTWFuYWdlbWVudCwgUGxhaWQgUHJvdGVjdCwgYW5kIENSQSBDYXNoIEZsb3cgVXBkYXRlcykgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLiBBZnRlciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LCB0aGUgdXNlciB3aWxsIG5vIGxvbmdlciBiZSBiaWxsZWQgZm9yIHRoZXNlIHByb2R1Y3RzLiBGb3IgQ1JBIE1vbml0b3JpbmcsIHRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQgYnV0IGhpc3RvcmljYWwgZGF0YSByZW1haW5zIGF2YWlsYWJsZSBmb3IgZnV0dXJlIHJlcG9ydCByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVGVybWluYXRlIHVzZXItYmFzZWQgcHJvZHVjdHNcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0fSB1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclByb2R1Y3RzVGVybWluYXRlKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3Q6IFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclByb2R1Y3RzVGVybWluYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlclByb2R1Y3RzVGVybWluYXRlKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3VzZXIvcmVtb3ZlYCBkZWxldGVzIGEgYHVzZXJfaWRgIG9yIGB1c2VyX3Rva2VuYCBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGFueSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBzaGFyZWQgd2l0aCBhbmQgdXNlZCBieSBhIHNwZWNpZmllZCB0aGlyZC1wYXJ0eSBjbGllbnQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRocm91Z2ggc3VwcG9ydGVkIGVuZHBvaW50cy4gIEVuc3VyZSB5b3Ugc3RvcmUgdGhlIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHRoZSBgdXNlcl90b2tlbmAgYW5kIGB0aGlyZF9wYXJ0eV9jbGllbnRfaWRgLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBVc2VyIHVzaW5nIHRoZSBUcmFuc2FjdGlvbnMgYnVuZGxlLiBUaGlzIGJ1bmRsZSByZWZyZXNoZXMgb25seSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBUcmFuc2FjdGlvbnMgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIHRvIHRhcmdldCBhbGwgSXRlbXMgZm9yIGEgdXNlciBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHVzZXIgaXRlbXMgZm9yIFRyYW5zYWN0aW9ucyBidW5kbGVcbiAgICAgICAgICogQHBhcmFtIHtVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoKHVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlclRyYW5zYWN0aW9uc1JlZnJlc2godXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCB1cGRhdGVzIHVzZXIgaW5mb3JtYXRpb24gZm9yIGFuIGV4aXN0aW5nIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAuIElmIGFuIGV4aXN0aW5nIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAgaXMgbWlzc2luZyBmaWVsZHMgcmVxdWlyZWQgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgKGUuZy4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQpIHVzZSBgL3VzZXIvdXBkYXRlYCB0byBhZGQgdmFsdWVzIGZvciB0aG9zZSBmaWVsZHMuICBJZGVudGl0eSB1cGRhdGVzIHVzZSBtZXJnZSBzZW1hbnRpY3M6IHByb3ZpZGVkIGZpZWxkcyBvdmVyd3JpdGUgZXhpc3Rpbmcgb25lczsgb21pdHRlZCBmaWVsZHMgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZmFjdG9yeSBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRmFjdG9yeSA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbiwgYmFzZVBhdGg/OiBzdHJpbmcsIGF4aW9zPzogQXhpb3NJbnN0YW5jZSkge1xuICAgIGNvbnN0IGxvY2FsVmFyRnAgPSBQbGFpZEFwaUZwKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsICBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZFxcJ3Mgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3Q7IGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIE5vdGU6IElmIHlvdSBhcmUgZ2V0dGluZyByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzZXNzaW5nIHRoZSByZXR1cm4gcmlzayBvZiBhIHByb3Bvc2VkIEFDSCB0cmFuc2FjdGlvbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGAvc2lnbmFsL2V2YWx1YXRlYCBpbnN0ZWFkIG9mIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiBgL3NpZ25hbC9ldmFsdWF0ZWAgcmV0dXJucyB0aGUgc2FtZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiBhbmQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gU2lnbmFsIFJ1bGVzLCB3aGljaCBwcm92aWRlcyBuby1jb2RlIHRyYW5zYWN0aW9uIGJ1c2luZXNzIGxvZ2ljIGNvbmZpZ3VyYXRpb24sIGJhY2t0ZXN0aW5nIGFuZCByZWNvbW1lbmRhdGlvbnMgZm9yIHR1bmluZyB5b3VyIHRyYW5zYWN0aW9uIGFjY2VwdGFuY2UgbG9naWMsIGFuZCB0aGUgYWJpbGl0eSB0byBlYXNpbHkgc3dpdGNoIGJldHdlZW4gQmFsYW5jZSBhbmQgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBhcyBuZWVkZWQgZm9yIHVsdHJhLWxvdy1sYXRlbmN5LCBNTC1wb3dlcmVkIHJpc2sgYXNzZXNzbWVudHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0JhbGFuY2UgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9iYWxhbmNlLyNiYWxhbmNlLWludGVncmF0aW9uLW9wdGlvbnMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyAtLSB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50cyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXBwbGljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byB0aGUgR1NFcyBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0gb3IgdXRpbGl6ZSBGcmVkZGllIE1hY1xcJ3MgTG9hbiBQcm9kdWN0IEFkdmlzb3LCriAoTFBBwq4pIEFzc2V0IGFuZCBJbmNvbWUgTW9kZWxlciAoQUlNKS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5IGluIFBERiBmb3JtYXQuIFRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldChhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvdmVyaWZ5YCBlbmRwb2ludCB2ZXJpZmllcyBiYW5rIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyBhbmQgKG9wdGlvbmFsbHkpIGFjY291bnQgb3duZXIgbmFtZXMgYWdhaW5zdCBQbGFpZFxcJ3MgZGF0YWJhc2UgdmlhIFtEYXRhYmFzZSBBdXRoXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvZGF0YWJhc2UtYXV0aC8pLiBJdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYWNjb3VudCBudW1iZXJzIHRoYXQgd2VyZSBub3QgY29sbGVjdGVkIHZpYSB0aGUgUGxhaWQgTGluayBmbG93LiAgVGhpcyBlbmRwb2ludCBpcyBjdXJyZW50bHkgaW4gRWFybHkgQXZhaWxhYmlsaXR5OyBjb250YWN0IHNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBWZXJpZnkgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aFZlcmlmeVJlcXVlc3R9IGF1dGhWZXJpZnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aFZlcmlmeShhdXRoVmVyaWZ5UmVxdWVzdDogQXV0aFZlcmlmeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXV0aFZlcmlmeVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hdXRoVmVyaWZ5KGF1dGhWZXJpZnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgIHRvIGdldCByaXNrIGluc2lnaHRzIGZvciBhIGxpbmtlZCBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgSUQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIEJlYWNvbiBVc2VyIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckhpc3RvcnlMaXN0KGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGByZWplY3RlZGAsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgY2xlYXJlZGAsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYGNsZWFyZWRgLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgcGVuZGluZ19yZXZpZXdgLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9ld2FfcmVwb3J0L3YxL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYW4gRWFybmVkIFdhZ2UgQWNjZXNzIChFV0EpIHNjb3JlIHRoYXQgcXVhbnRpZmllcyB0aGUgZGVsaW5xdWVuY3kgcmlzayBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBpdGVtLiBUaGUgc2NvcmUgaXMgZGVyaXZlZCBmcm9tIGEgY29tYmluYXRpb24gb2YgY2FzaGZsb3cgcGF0dGVybnMgYW5kIG5ldHdvcmstYmFzZWQgYmVoYXZpb3JhbCBmZWF0dXJlcy4gIFRoZSByZXNwb25zZSByZXR1cm5zIGEgbGlzdCBvZiBFV0Egc2NvcmVzLCB3aGVyZSBlYWNoIHNjb3JlIGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsIGFkdmFuY2UgYW1vdW50IHJhbmdlLiBUaGVzZSBzY29yZXMgZXN0aW1hdGUgdGhlIGxpa2VsaWhvb2Qgb2YgcmVwYXltZW50IGZvciBhZHZhbmNlcyB3aXRoaW4gdGhhdCByYW5nZS4gIFNjb3JlIHJhbmdlOiAxLTk5ICBJbnRlcnByZXRhdGlvbjogSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBhIGdyZWF0ZXIgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQuICBUaGlzIGVuZHBvaW50IGVuYWJsZXMgY2xpZW50cyB0byBhc3Nlc3MgcmVwYXltZW50IHJpc2sgYW5kIG1ha2UgZGF0YS1kcml2ZW4gZGVjaXNpb25zIHdoZW4gZGV0ZXJtaW5pbmcgZWxpZ2liaWxpdHkgb3IgbGltaXRzIGZvciBlYXJuZWQgd2FnZSBhZHZhbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEVXQSBTY29yZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0fSBiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YUV3YVJlcG9ydFYxR2V0KGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3Q6IEJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmV0YUV3YVJlcG9ydFYxR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJldGFFd2FSZXBvcnRWMUdldChiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgcmVjb3JkLiBZb3UgY2FuIHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyB5b3UgaGF2ZSBhdmFpbGFibGUuIElmIGFueSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nIGZvciB0aGUgcHJvZHVjdHMgeW91IGludGVuZCB0byB1c2UsIGl0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBgcmVxdWlyZW1lbnRzX2R1ZWAgZmllbGQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgICAgICogQHBhcmFtIHtCZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0fSBiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlKGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3Q6IEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS9wYXJ0bmVyL2N1c3RvbWVyL3YxL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmV0YVBhcnRuZXJDdXN0b21lclYxRW5hYmxlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgZGV0YWlscyBvZiBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7QmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdH0gYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldChiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0OiBCZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZXRhUGFydG5lckN1c3RvbWVyVjFHZXQoYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgZW5kIGN1c3RvbWVyIHJlY29yZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlcyBhbiBleGlzdGluZyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1c2luZXNzIHZlcmlmaWNhdGlvbiB0byBjaGVjayBhIGJ1c2luZXNzXFwncyBpZGVudGl0eSBhbmQgcmlzayBwcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlKGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlKGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgc3BlY2lmaWMgYnVzaW5lc3MgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0KGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogQnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0KGJ1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9jYXNoZmxvd19yZXBvcnQvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYGNhc2hmbG93X3JlcG9ydGAsIG9yIGlmIGl0IHdhc25cXCd0LCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXRzIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgICAgICogQHBhcmFtIHtDYXNoZmxvd1JlcG9ydEdldFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9pbnNpZ2h0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyBpbnNpZ2h0cyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBJbnNpZ2h0cyBhcmUgb25seSBjYWxjdWxhdGVkIG9uIGNyZWRpdCBhbmQgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyBpbnNpZ2h0cyBkYXRhIGluIENhc2hmbG93IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQoY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgIGlzIGFuIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtIChnaXZlbiBhbiBgaXRlbV9pZGApLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBDYXNoZmxvdyBSZXBvcnQgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAuICBBZnRlciBjYWxsaW5nIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIGBDQVNIRkxPV19SRVBPUlRfUkVBRFlgIGFsZXJ0aW5nIGNsaWVudHMgdGhhdCBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgY2FuIHRoZW4gYmUgaW5nZXN0ZWQgdmlhIGAvY2FzaGZsb3dfcmVwb3J0L2dldGAgb3IgdGhlIHdlYmhvb2sgd2lsbCBjb250YWluIGFuIGVycm9yIGNvZGUgaW5mb3JtaW5nIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZWZyZXNoaW5nIHRyYW5zYWN0aW9ucyBkYXRhLiAgTm90ZSB0aGF0IHRoZSBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpLiBJZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCBmb3IgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YSBpbiBgY2FzaGZsb3dfcmVwb3J0YFxuICAgICAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXNoZmxvd1JlcG9ydFJlZnJlc2goY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY2FzaGZsb3dSZXBvcnRSZWZyZXNoKGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUcmFuc2FjdGlvbnMgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL2Nhc2hmbG93X3JlcG9ydC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGBjYXNoZmxvd19yZXBvcnRgLCBvciBpZiBpdCB3YXNuXFwndCwgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0cyB0cmFuc2FjdGlvbiBkYXRhIGluIGBjYXNoZmxvd19yZXBvcnRgXG4gICAgICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldChjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldChjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGxlZ2FjeSBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byBbdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3BmYy1taWdyYXRpb24vKSBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBsZWdhY3kgY2F0ZWdvcmllc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhdGVnb3JpZXNHZXQoYm9keTogb2JqZWN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhdGVnb3JpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gRXh0cmVtZWx5IHJlY2VudCBldmVudHMgKG9jY3VycmluZyB3aXRoaW4gdGhlIHBhc3QgMTIgaG91cnMpIG1heSBub3QgYmUgYXZhaWxhYmxlIHZpYSB0aGlzIGVuZHBvaW50LiBVcCB0byB0aHJlZSB5ZWFycyBvZiBjb25zZW50IGxvZ3Mgd2lsbCBiZSBhdmFpbGFibGUgdmlhIHRoZSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0OiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDb25zZW50RXZlbnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUERGIFJlcG9ydHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3R9IGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdDogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIENhc2hmbG93IEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQgYW5kIHJlZnJlc2ggdGhlIGRhdGEgaW4gdGhlIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBvciBjcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgTk9URTogVGhlIGZvbGxvd2luZyBzY2hlbWEgd2FzIHVwZGF0ZWQgaW4gQXByaWwgMjAyNiB0byByZWZsZWN0IHRoZSByZXNwb25zZSB3aGVuIHRoZSBwcm92aWRlZCB2ZXJzaW9uIGlzIFxcXCJJSTJcXFwiLiBQbGVhc2Ugc2VlIFt0aGlzIGRvY3VtZW50XShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNoZWFkaW5nPWgucnVkYW16aW51czJpKSBmb3IgZ3VpZGFuY2Ugb24gbWlncmF0aW5nIHRvIElJMiBpZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyB0aGUgSUkxIHZlcnNpb24sIGFuZCBbdGhpcyBzZWN0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNib29rbWFyaz1pZC50ZGNjMndwazBoNjApIGZvciBhbiBleGFtcGxlIElJMSByZXNwb25zZSBhbG9uZyB3aXRoIGl0cyBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjM2Yzg1bjJpcmNxayNoZWFkaW5nPWguNzlkd3I1YzFpc3psKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5jb21lIGluc2lnaHRzIGZyb20geW91ciB1c2VyXFwncyBiYW5rc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTGVuZFNjb3JlIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgTGVuZFNjb3JlIGZyb20geW91ciB1c2VyXFwncyBiYW5raW5nIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0KGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0KGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbmV0d29yayBhdHRyaWJ1dGVzIGZvciB0aGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSBwYXJ0bmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgIHJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnQgQ29uc3VtZXIgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJ5IGRlZmF1bHQsIHRoZSBtb3N0IHJlY2VudCBCYXNlIFJlcG9ydCAoaWYgaXQgZXhpc3RzKSBmb3IgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZC4gVG8gcmVxdWVzdCB0aGF0IHRoZSBtb3N0IHJlY2VudCBQYXJ0bmVyIEluc2lnaHRzIG9yIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIFBERiBhcyB3ZWxsLCB1c2UgdGhlIGBhZGQtb25zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBDb25zdW1lciBSZXBvcnQgYXMgYSBQREZcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGhvbWUgbGVuZGluZyByZXBvcnRzIGZvciBhIHVzZXIuIFRvIG9idGFpbiBhIFZvQSBvciBFbXBsb3ltZW50IFJlZnJlc2ggcmVwb3J0LCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBgY3JhX2Jhc2VfcmVwb3J0YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIG9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHZhcmlvdXMgaG9tZSBsZW5kaW5nIHJlcG9ydHMgZm9yIGEgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JhL2NoZWNrX3JlcG9ydC92ZXJpZmljYXRpb24vcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdCwgc3BlY2lmaWNhbGx5IGZvcm1hdHRlZCBmb3IgSG9tZSBMZW5kaW5nIHZlcmlmaWNhdGlvbiB1c2UgY2FzZXMuIEJlZm9yZSBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGVuc3VyZSB0aGF0IHlvdVxcJ3ZlIGNyZWF0ZWQgYSBWT0EgcmVwb3J0IHRocm91Z2ggTGluayBvciB0aGUgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQsIGFuZCBoYXZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgb3IgYSBgVVNFUl9DSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2suICBUaGUgcmVzcG9uc2UgdG8gYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBDb25zdW1lciBSZXBvcnQgYXMgYSBWZXJpZmljYXRpb24gUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0KGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NyZWRpdF9wcm9maWxlL3JlcG9ydC9nZXRgIHJldHJpZXZlcyBhIGNyZWRpdCBwcm9maWxlIHJlcG9ydCBmb3IgYSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IGZvciBhIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0KGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXQoY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHNcbiAgICAgICAgICogQHBhcmFtIHtDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdH0gY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0OiBDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFMb2Fuc1JlZ2lzdGVyUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hblVucmVnaXN0ZXJSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91cGRhdGVgIHVwZGF0ZXMgbG9hbiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzdGF0dXMgYW5kIHBheW1lbnQgaGlzdG9yeS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGxvYW4gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVXBkYXRlUmVxdWVzdH0gY3JhTG9hbnNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGEgQ2FzaCBGbG93IFVwZGF0ZXMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX2lkYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBsaW5rZWQgQ1JBIEl0ZW0sIHdoaWNoIGFyZSB1cGRhdGVkIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXkgKGJlc3QtZWZmb3J0KS4gSW4gdGhlIGN1cnJlbnQgQ2FzaCBGbG93IFVwZGF0ZXMgYmV0YSBleHBlcmllbmNlLCBvbmx5IG9uZSBJdGVtIHBlciB1c2VyIG1heSBiZSBzdWJzY3JpYmVkIGZvciBtb25pdG9yaW5nIHVwZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byB1bnN1YnNjcmliZSBmcm9tIHByZXZpb3VzbHkgc3Vic2NyaWJlZCBNb25pdG9yaW5nIEluc2lnaHRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbnN1YnNjcmliZSBmcm9tIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YCByZXR1cm5zIGNhc2ggZmxvdyBpbnNpZ2h0cyBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhUGFydG5lckluc2lnaHRzR2V0KGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9yZXBvcnQvZ2V0YCByZXRyaWV2ZXMgYSBDUkEgUmVwb3J0IGZvciBhIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQ1JBIFJlcG9ydCBmb3IgcHJvdmlkZWQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYVJlcG9ydEdldFJlcXVlc3R9IGNyYVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFSZXBvcnRHZXQoY3JhUmVwb3J0R2V0UmVxdWVzdDogQ3JhUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhUmVwb3J0R2V0KGNyYVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIGNyZWF0ZSBhbiBBdWRpdCBDb3B5IHRva2VuIG9mIGFuIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCB0byBzaGFyZSB3aXRoIGEgcGFydGljaXBhdGluZyBHb3Zlcm5tZW50LVNwb25zb3JlZCBFbnRlcnByaXNlIChHU0UpIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiBGYW5uaWUgTWFlXFwncyBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSBvciB1dGlsaXplIEZyZWRkaWUgTWFjXFwncyBMb2FuIFByb2R1Y3QgQWR2aXNvcsKuIChMUEHCrikgQXNzZXQgYW5kIEluY29tZSBNb2RlbGVyIChBSU0pLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgYSBzcGVjaWZpZWQgdXNlciBpbiBQREYgZm9ybWF0LiAgQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBQREYgZm9ybWF0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgaXMgZGVwcmVjYXRlZC4gVGhlIGJhY2tlbmQgaW1wbGVtZW50YXRpb24gd2FzIHJlbW92ZWQgKHJldHVybnMgYW4gYFVuaW1wbGVtZW50ZWRgIGVycm9yIGF0IHJ1bnRpbWUpLCBhbmQgdGhlIGVuZHBvaW50IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudGVkIEFQSSBzdXJmYWNlLiBUbyByZWZyZXNoIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGV4aXN0aW5nIHVzZXIsIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZSBzbyB0aGV5IGNhbiBjb25maXJtIHRoZWlyIGluY29tZSBzb3VyY2VzLiBGb3IgYSBmdWxseSBiYWNrZW5kIHJlZnJlc2gsIG1pZ3JhdGUgdG8gQ1JBIEluY29tZSBJbnNpZ2h0cyBhbmQgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvZnJlZGRpZV9tYWMvcmVwb3J0cy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0IChha2EgVk9BIC0gVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyksIGFuZCBhIFZlcmlmaWNhdGlvbiBPZiBFbXBsb3ltZW50IChWT0UpIHJlcG9ydCBpZiB0aGlzIG9uZSBpcyBhdmFpbGFibGUuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyBhIGdpdmVuIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBQREYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBQREYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYCBlbmRwb2ludCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWZyZXNoIGEgcmVwb3J0IHRoYXQgd2FzIHJlbGF5ZWQgdG8gdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gQSBuZXcgcmVwb3J0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCByZXBvcnQgcGFyYW1ldGVycywgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSByZXBvcnQgb2YgYSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3R9IGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhYm91dCBhIHNwZWNpZmljIERhc2hib2FyZCB1c2VyIGJhc2VkIG9uIHRoZSBgZGFzaGJvYXJkX3VzZXJfaWRgIGZpZWxkLCB3aGljaCBpcyByZXR1cm5lZCBpbiB0aGUgYGF1ZGl0X3RyYWlsYCBvYmplY3Qgb2YgY2VydGFpbiBNb25pdG9yIGFuZCBCZWFjb24gZW5kcG9pbnRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyByZXZpZXdlciB3aG8gcGVyZm9ybWVkIGEgRGFzaGJvYXJkIGFjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBEYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF1ZGl0IG9yIHRyYWNrIHRoZSBsaXN0IG9mIHJldmlld2VycyBmb3IgTW9uaXRvciwgQmVhY29uLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IERhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZFxcJ3MgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RW1wbG95ZXJzU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGNvbnNlbnQgZ3JhbnQgYnkgaXRzIGlkZW50aWZpZXJcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEZEWCBDb25zZW50IEdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhDb25zZW50c0dldChjb25zZW50SWQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxGRFhDb25zZW50R3JhbnQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmZkeENvbnNlbnRzR2V0KGNvbnNlbnRJZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgemVybyBvciBtb3JlIGNvbnNlbnQgZ3JhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YSBwcm92aWRlciBjdXN0b21lciwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdGF0dXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgRkRYIENvbnNlbnQgR3JhbnRzIGZvciBhIGN1c3RvbWVyXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21lcklkIERhdGEgcHJvdmlkZXIgY3VzdG9tZXIgaWRlbnRpZmllciB3aG9zZSBjb25zZW50IGdyYW50cyB0byByZXR1cm4uXG4gICAgICAgICAqIEBwYXJhbSB7RkRYQ29uc2VudEdyYW50U3RhdHVzfSBbc3RhdHVzXSBPcHRpb25hbCBmaWx0ZXIgcmVzdHJpY3RpbmcgcmVzdWx0cyB0byBhIHNpbmdsZSBjb25zZW50IGdyYW50IHN0YXR1cy4gT25lIG9mICYjeDYwO0FDVElWRSYjeDYwOywgJiN4NjA7UkVWT0tFRCYjeDYwOywgJiN4NjA7RVhQSVJFRCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeENvbnNlbnRzTGlzdChjdXN0b21lcklkOiBzdHJpbmcsIHN0YXR1cz86IEZEWENvbnNlbnRHcmFudFN0YXR1cywgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxHZXRDb25zZW50c1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZHhDb25zZW50c0xpc3QoY3VzdG9tZXJJZCwgc3RhdHVzLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgcmV2b2NhdGlvbiBoaXN0b3J5IG9mIGEgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBGRFggQ29uc2VudCBHcmFudCByZXZvY2F0aW9uIHJlY29yZHNcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnNlbnRJZCBDb25zZW50IEdyYW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNvbnNlbnQgZ3JhbnRcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeENvbnNlbnRzUmV2b2NhdGlvbkdldChjb25zZW50SWQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxGRFhDb25zZW50UmV2b2NhdGlvbnM+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmZkeENvbnNlbnRzUmV2b2NhdGlvbkdldChjb25zZW50SWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcHBlbmRzIGEgUkVWT0tFRCBzdGF0dXMgcmVjb3JkIHRvIHRoZSBuYW1lZCBjb25zZW50IGdyYW50XG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBGRFggQ29uc2VudCBHcmFudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeENvbnNlbnRzUmV2b2tlKGNvbnNlbnRJZDogc3RyaW5nLCByZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZmR4Q29uc2VudHNSZXZva2UoY29uc2VudElkLCByZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2VuZXJpYyB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBGRFggRXZlbnQgTm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnRJZCBSZWNpcGllbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkOiBzdHJpbmcsIG9BVVRIU1RBVEVJRD86IHN0cmluZywgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxHZXRSZWNpcGllbnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkLCBvQVVUSFNUQVRFSUQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBSZWNpcGllbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBnZXRSZWNpcGllbnRzKG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50c1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5nZXRSZWNpcGllbnRzKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHRvIHJldHJpZXZlIGlkZW50aXR5IGRldGFpbHMgd2hlbiB1c2luZyBbSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5L2lkZW50aXR5LWRvY3VtZW50LXVwbG9hZC8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGF1dG9maWxsIGZvciBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgYW5kL29yIGB1c2VyX2lkYCBmaWVsZC4gQXQgbGVhc3Qgb25lIG9mIHRoZXNlIHR3byBmaWVsZHMgbXVzdCBiZSBwcm92aWRlZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgYHVzZXJfaWRgIGlzIHByb3ZpZGVkLCB0aGVyZSBtdXN0IGJlIGFuIGFzc29jaWF0ZWQgdXNlcjsgb3RoZXJ3aXNlLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgLCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICAgSWYgYHVzZXJfaWRgIGlzIG5vdCBwcm92aWRlZCwgeW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIElmIGB1c2VyX2lkYCBpcyBwcm92aWRlZCwgdXNlciBpbmZvcm1hdGlvbiBjYW4gbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuIFBsZWFzZSB1c2UgdGhlIGAvdXNlci91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB1c2VyIGRhdGEgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvblxcJ3MgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnRcXCdzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBwYXJhbWV0ZXJzIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBoYXMgc2luY2UgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXNzdWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1NlYXJjaChpc3N1ZXNTZWFyY2hSZXF1ZXN0OiBJc3N1ZXNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElzc3Vlc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBhIHVzZXIgdG8gc3Vic2NyaWJlIHRvIHVwZGF0ZXMgb24gYSBzcGVjaWZpYyBgSXNzdWVgIHVzaW5nIGEgUE9TVCBtZXRob2QuIFN1YnNjcmliZXJzIHdpbGwgcmVjZWl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgaXNzdWUgc3RhdHVzIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB3aGVuIHJlc29sdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXNzdWVzU3Vic2NyaWJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlzc3Vlc1N1YnNjcmliZShpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb25cXCdzIGFjY2VzcyB0byB0aGUgVXNlclxcJ3MgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHRlcm1pbmF0ZSBhbiBJdGVtLiBPbmNlIHRlcm1pbmF0ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaXMgbm8gbG9uZ2VyIHZhbGlkLCBiaWxsaW5nIGZvciB0aGUgSXRlbVxcJ3MgcHJvZHVjdHMgaXMgZW5kZWQsIGFuZCByZWxldmFudCB3ZWJob29rcyBhcmUgZmlyZWQuICBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIG9mZmJvYXJkIHVzZXJzIG9yIGRpc2Nvbm5lY3QgYWNjb3VudHMgbGlua2VkIHZpYSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgVGVybWluYXRlIHByb2R1Y3RzIGZvciBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZShpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0OiBJdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtUHJvZHVjdHNUZXJtaW5hdGUoaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgQ2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyBhIHJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2Ugd2hlbiBvZmZib2FyZGluZyB1c2VycyBvciBpZiBhIHVzZXIgY2hvb3NlcyB0byBkaXNjb25uZWN0IGFuIGFjY291bnQgbGlua2VkIHZpYSBQbGFpZC4gRm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cywgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIExpYWJpbGl0aWVzLCBhbmQgSW52ZXN0bWVudHMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgcmVxdWlyZWQgdG8gZW5kIHN1YnNjcmlwdGlvbiBiaWxsaW5nIGZvciB0aGUgSXRlbSwgdW5sZXNzIHRoZSBlbmQgdXNlciByZXZva2VkIHBlcm1pc3Npb24gKGUuZy4gdmlhIFtodHRwczovL215LnBsYWlkLmNvbS9dKGh0dHBzOi8vbXkucGxhaWQuY29tLykpLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1N1YnNjcmlwdGlvbiBmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNzdWJzY3JpcHRpb24tZmVlKS4gIE9uIGEgVHJpYWwgcGxhbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgVHJpYWwgSXRlbXMgKGJhbmsgY29ubmVjdGlvbnMpIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIGBwYXltZW50X2luaXRpYXRpb25gIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIGBsaW5rX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSUQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAuIEZvciBtb3N0IFBsYWlkIHByb2R1Y3RzLCB0aGUgYHB1YmxpY190b2tlbmAgaXMgc2F2ZWQgYW5kIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIExpbmsgc2Vzc2lvbiwgaW5jbHVkaW5nIGFsbCBjYWxsYmFja3MgZmlyZWQgZHVyaW5nIHRoZSBzZXNzaW9uIGFsb25nIHdpdGggdGhlaXIgbWV0YWRhdGEsIGluY2x1ZGluZyB0aGUgcHVibGljIHRva2VuLiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgd2l0aCBMaW5rIGZsb3dzIHRoYXQgZG9uXFwndCBwcm92aWRlIGEgcHVibGljIHRva2VuIHZpYSBmcm9udGVuZCBjYWxsYmFja3MsIHN1Y2ggYXMgdGhlIFtIb3N0ZWQgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaG9zdGVkLWxpbmsvKSBhbmQgdGhlIFtNdWx0aS1JdGVtIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluay8pLiBJdCBhbHNvIGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gIEJ5IGRlZmF1bHQsIHRoaXMgZW5kcG9pbnQgd2lsbCBvbmx5IHJldHVybiBjb21wbGV0ZSBldmVudCBkYXRhIGZvciBIb3N0ZWQgTGluayBzZXNzaW9ucy4gVG8gdXNlIGAvbGluay90b2tlbi9nZXRgIHRvIHJldHJpZXZlIGV2ZW50IGRhdGEgZm9yIG5vbi1Ib3N0ZWQtTGluayBzZXNzaW9ucywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IHRoYXQgeW91ciBhY2NvdW50IGJlIGVuYWJsZWQgZm9yIExpbmsgZXZlbnRzLiBJZiB5b3UgZG8gbm90IGhhdmUgYW4gYWNjb3VudCBtYW5hZ2VyLCB5b3UgY2FuIHN1Ym1pdCB0aGlzIHJlcXVlc3QgdmlhIGEgc3VwcG9ydCB0aWNrZXQuIEVuYWJsZW1lbnQgZm9yIExpbmsgZXZlbnRzIHdpbGwgYWxzbyBjYXVzZSB5b3UgdG8gcmVjZWl2ZSBhZGRpdGlvbmFsIHdlYmhvb2tzIHJlbGF0ZWQgdG8gTGluayBldmVudHMsIHN1Y2ggYXMgdGhlIGBTRVNTSU9OX0ZJTklTSEVEYCBhbmQgYEVWRU5UU2Agd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua1Rva2VuR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSB1c2VyIGlzIGVsaWdpYmxlIGZvciBhIHN0cmVhbWxpbmVkIGV4cGVyaWVuY2UsIHN1Y2ggYXMgTGF5ZXIuIFRvIGFjY2VzcyB0aGlzIGVuZHBvaW50LCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9vYXV0aC9pbnRyb3NwZWN0YCByZXR1cm5zIG1ldGFkYXRhIGFib3V0IGFuIGFjY2VzcyB0b2tlbiBvciByZWZyZXNoIHRva2VuLiAgTm90ZTogVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGFzIHdlbGwgYXMgSlNPTi4gVGhlIGZpZWxkcyBmb3IgdGhlIGZvcm0gYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZpZWxkcyBmb3IgSlNPTiBhbmQgY29uZm9ybSB0byB0aGUgT0F1dGggMi4wIHNwZWNpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBtZXRhZGF0YSBhYm91dCBhbiBPQXV0aCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge09BdXRoSW50cm9zcGVjdFJlcXVlc3R9IG9BdXRoSW50cm9zcGVjdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBvYXV0aEludHJvc3BlY3Qob0F1dGhJbnRyb3NwZWN0UmVxdWVzdDogT0F1dGhJbnRyb3NwZWN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxPQXV0aEludHJvc3BlY3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAub2F1dGhJbnRyb3NwZWN0KG9BdXRoSW50cm9zcGVjdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL29hdXRoL3Jldm9rZWAgcmV2b2tlcyBhbiBhY2Nlc3Mgb3IgcmVmcmVzaCB0b2tlbiwgcHJldmVudGluZyBhbnkgZnVydGhlciB1c2UuIElmIGEgcmVmcmVzaCB0b2tlbiBpcyByZXZva2VkLCBhbGwgYWNjZXNzIGFuZCByZWZyZXNoIHRva2VucyBkZXJpdmVkIGZyb20gaXQgYXJlIGFsc28gcmV2b2tlZCwgaW5jbHVkaW5nIGV4Y2hhbmdlZCB0b2tlbnMuICBOb3RlOiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIGFuIE9BdXRoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7T0F1dGhSZXZva2VSZXF1ZXN0fSBvQXV0aFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBvYXV0aFJldm9rZShvQXV0aFJldm9rZVJlcXVlc3Q6IE9BdXRoUmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxPQXV0aFJldm9rZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5vYXV0aFJldm9rZShvQXV0aFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL29hdXRoL3Rva2VuYCBpc3N1ZXMgYW4gYWNjZXNzIHRva2VuIGFuZCByZWZyZXNoIHRva2VuIGRlcGVuZGluZyBvbiB0aGUgYGdyYW50X3R5cGVgIHByb3ZpZGVkLiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlZnJlc2ggYW4gT0F1dGggYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7T0F1dGhUb2tlblJlcXVlc3R9IG9BdXRoVG9rZW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgb2F1dGhUb2tlbihvQXV0aFRva2VuUmVxdWVzdDogT0F1dGhUb2tlblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8T0F1dGhUb2tlblJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5vYXV0aFRva2VuKG9BdXRoVG9rZW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIGZ1bGwgUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBFVVIsIEdCUCwgb3IgYW5vdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQmFjcyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudFxcJ3MgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLiAgUG9sbGluZyBmb3Igc3RhdHVzIHVwZGF0ZXMgaW4gUHJvZHVjdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQuIFJlcGVhdGVkbHkgY2FsbGluZyBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgdG8gY2hlY2sgYSBwYXltZW50XFwncyBzdGF0dXMgaXMgdW5yZWxpYWJsZSBhbmQgbWF5IHRyaWdnZXIgQVBJIHJhdGUgbGltaXRzLiBPbmx5IHRoZSBgcGF5bWVudF9zdGF0dXNfdXBkYXRlYCB3ZWJob29rIHNob3VsZCBiZSB1c2VkIHRvIHJlY2VpdmUgcmVhbC10aW1lIHN0YXR1cyB1cGRhdGVzIGluIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyB0aGUgbGlrZWxpaG9vZCBvZiByZWZ1bmQgYmVpbmcgc3VjY2Vzc2Z1bCB3aXRob3V0IGh1bWFuIGludGVydmVudGlvbi4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnRzIEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9zdXBwb3J0LnBsYWlkLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yNzg5NTgyNjk0NzczNS1XaGF0LVBsYWlkLXByb2R1Y3RzLWFyZS1zdXBwb3J0ZWQtaW4tZWFjaC1jb3VudHJ5LWFuZC1yZWdpb24pIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdHMgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl0XFwncyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZywgc2F2aW5ncywgb3IgY2FzaCBtYW5hZ2VtZW50IGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBiYWxhbmNlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IGF1dGhvcml6ZWQgYnkgYSBwcm9jZXNzb3IgdG9rZW4sIGluY2x1ZGluZyBhY2NvdW50IG51bWJlcnMsIGFjY291bnQgb3duZXJzLCBob2xkaW5ncywgYW5kIGRhdGEgcHJvdmVuYW5jZSBpbmZvcm1hdGlvbi4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgQXV0aCB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCBhY2NvdW50IGF1dGhlbnRpY2F0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0KHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldChwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBzdG9jayBwb3NpdGlvbiBkYXRhIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEludmVzdG1lbnQgSG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgaW52ZXN0bWVudCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIEludmVzdG1lbnRzIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciB5b3UgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YC4gVGhpcyBoZWxwcyBpbXByb3ZlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZSBhY2N1cmFjeSBmb3IgeW91ciBhY2NvdW50IGFuZCBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGUgcnVsZSBwZXJmb3JtYW5jZSBhbmQgcnVsZSB0dW5pbmcgY2FwYWJpbGl0aWVzIGluIHRoZSBEYXNoYm9hcmQuIElmIHlvdXIgZWZmZWN0aXZlIGRlY2lzaW9uIGNoYW5nZXMgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCAoZm9yIGV4YW1wbGUsIHlvdSBpbmRpY2F0ZWQgdGhhdCB5b3UgYWNjZXB0ZWQgYSB0cmFuc2FjdGlvbiwgYnV0IGxhdGVyIG9uLCB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIHJlamVjdGVkIGl0LCBzbyBpdCB3YXMgbmV2ZXIgaW5pdGlhdGVkKSwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAsIGFzIFBsYWlkIGNhbiBpbmZlciBvdXRjb21lcyBmcm9tIHlvdXIgVHJhbnNmZXIgYWN0aXZpdHkuICBJZiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGVuZHBvaW50IHdpbGwgbm90IGltcGFjdCBzY29yZXMgKEJhbGFuY2UgZG9lcyBub3QgdXNlIHNjb3JlcyksIGJ1dCBpcyBuZWNlc3NhcnkgdG8gdmlldyBhY2N1cmF0ZSB0cmFuc2FjdGlvbiBvdXRjb21lcyBhbmQgdHVuZSBydWxlIGxvZ2ljIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB1c2VzIFJ1bGVzZXRzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlIGVuZCBjdXN0b21lclxcJ3MgRGFzaGJvYXJkIGFuZCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBwcm9kdWN0IG9yIHRoZSBCYWxhbmNlIHByb2R1Y3QuIFdoaWNoIHByb2R1Y3QgaXMgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGBydWxlc2V0X2tleWAgdGhhdCB5b3UgcHJvdmlkZS4gTm90ZSB0aGF0IG9ubHkgY3VzdG9tZXItY29uZmlndXJlZCBydWxlc2V0cyB3b3JrIHdpdGggdGhpcyBlbmRwb2ludDsgYXMgYSBwcm9jZXNzb3IgcGFydG5lciwgeW91IGNhbm5vdCBjcmVhdGUgb3IgY29uZmlndXJlIHlvdXIgb3duIHJ1bGVzZXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IGhhdmUgaGlnaGVyIGxhdGVuY3kgaWYgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtIGZvciB0aGUgZmlyc3QgdGltZSwgb3Igd2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXF1ZXN0IGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYHNpZ25hbGAsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2FuIGJlIG1vZGlmaWVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YC4gVG8gcmV2b2tlIHRoZSBwcm9jZXNzb3JcXCdzIGFjY2VzcywgdGhlIGVudGlyZSBJdGVtIG11c3QgYmUgZGVsZXRlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXJcXCdzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZy4gZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb21wdXRlIGEgUHJvdGVjdCBUcnVzdCBJbmRleCBzY29yZSBmb3IgYSB1c2VyLiBUaGUgbW9kZWwgc2VsZWN0ZWQgZGV0ZXJtaW5lcyB3aGF0IGlzIHNjb3JlZCBhbmQgd2hhdCBhZGRpdGlvbmFsIGZpZWxkcyB0aGUgcmVzcG9uc2UgY29udGFpbnMuIEZvciBleGFtcGxlLCBgdGktbGluay1zZXNzaW9uLTIuMGAgc2NvcmVzIGEgY29tcGxldGVkIExpbmsgc2Vzc2lvbiBmb3IgZnJhdWQgcmlzazsgYGNhc2gtYWR2YW5jZS1vbmJvYXJkaW5nLTEuMGAgc2NvcmVzIHJlcGF5bWVudCByaXNrIGZvciBhIGZpcnN0LXRpbWUgY2FzaCBhZHZhbmNlIGFuZCBhZGRpdGlvbmFsbHkgcG9wdWxhdGVzIHBlci1hbW91bnQtYnVja2V0IHN1YnNjb3Jlcy4gQ2FzaC1hZHZhbmNlIG1vZGVscyByZXF1aXJlIHRoYXQgdGhlIHVzZXIgaGF2ZSBhIFBsYWlkIEl0ZW0gd2l0aCBUcmFuc2FjdGlvbnMgZW5hYmxlZCwgb3IgYW4gQXNzZXRzIFJlcG9ydCwgYmVmb3JlIHNjb3JpbmcuICBUaGUgZW5kcG9pbnQgcmV0dXJucyBIVFRQIDQwMCB3aXRoIGBlcnJvcl90eXBlYCA9IGBJTlZBTElEX1JFUVVFU1RgIGFuZCBgZXJyb3JfY29kZWAgPSBgRkFJTEVEX1BSRUNPTkRJVElPTmAgd2hlbiBhIHJlcXVpcmVkIHByZWNvbmRpdGlvbiBpcyBub3QgbWV0OiBmb3IgbGluay1zZXNzaW9uIG1vZGVscywgd2hlbiB0aGUgTGluayBzZXNzaW9uIGhhcyBub3QgY29tcGxldGVkOyBmb3IgY2FzaC1hZHZhbmNlIG1vZGVscywgd2hlbiB0aGUgdXNlciBoYXMgbm90IHN1Y2Nlc3NmdWxseSBsaW5rZWQgYW55IEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbXB1dGUgUHJvdGVjdCBUcnVzdCBJbmRleCBzY29yZXMgYW5kIHN1YnNjb3Jlc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RDb21wdXRlUmVxdWVzdH0gcHJvdGVjdENvbXB1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvdGVjdENvbXB1dGUocHJvdGVjdENvbXB1dGVSZXF1ZXN0OiBQcm90ZWN0Q29tcHV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvdGVjdENvbXB1dGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvdGVjdENvbXB1dGUocHJvdGVjdENvbXB1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBldmVudCBpbmNsdWRpbmcgVHJ1c3QgSW5kZXggc2NvcmUgYW5kIGZyYXVkIGF0dHJpYnV0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgZXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvdGVjdEV2ZW50R2V0KHByb3RlY3RFdmVudEdldFJlcXVlc3Q6IFByb3RlY3RFdmVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvdGVjdEV2ZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIG5ldyBldmVudCB0byBlbnJpY2ggdXNlciBkYXRhIGFuZCBvcHRpb25hbGx5IGdldCBhIFRydXN0IEluZGV4IHNjb3JlIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RFdmVudFNlbmRSZXF1ZXN0fSBwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RFdmVudFNlbmQocHJvdGVjdEV2ZW50U2VuZFJlcXVlc3Q6IFByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb3RlY3RFdmVudFNlbmRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvdGVjdEV2ZW50U2VuZChwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIFByb3RlY3QgcmVwb3J0IHRvIGRvY3VtZW50IGZyYXVkIGluY2lkZW50cywgaW52ZXN0aWdhdGlvbiBvdXRjb21lcywgb3Igb3RoZXIgcmlzayBldmVudHMuIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXBvcnQgdmFyaW91cyB0eXBlcyBvZiBpbmNpZGVudHMgaW5jbHVkaW5nIGFjY291bnQgdGFrZW92ZXJzLCBpZGVudGl0eSBmcmF1ZCwgdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucywgYW5kIG90aGVyIHNlY3VyaXR5IGV2ZW50cy4gVGhlIHJlcG9ydGVkIGRhdGEgaGVscHMgaW1wcm92ZSBmcmF1ZCBkZXRlY3Rpb24gbW9kZWxzIGFuZCBwcm92aWRlcyB2YWx1YWJsZSBmZWVkYmFjayB0byBlbmhhbmNlIHRoZSBvdmVyYWxsIHNlY3VyaXR5IG9mIHRoZSBQbGFpZCBuZXR3b3JrLiBSZXBvcnRzIGNhbiBiZSBjcmVhdGVkIGZvciBjb25maXJtZWQgaW5jaWRlbnRzIHRoYXQgaGF2ZSBiZWVuIGZ1bGx5IGludmVzdGlnYXRlZCwgb3IgZm9yIHN1c3BlY3RlZCBpbmNpZGVudHMgdGhhdCByZXF1aXJlIGZ1cnRoZXIgcmV2aWV3LiBZb3UgY2FuIGFzc29jaWF0ZSByZXBvcnRzIHdpdGggc3BlY2lmaWMgdXNlcnMsIHNlc3Npb25zLCBvciB0cmFuc2FjdGlvbnMgdG8gcHJvdmlkZSBjb21wcmVoZW5zaXZlIGNvbnRleHQgYWJvdXQgdGhlIGluY2lkZW50LiBFYWNoIHJlcG9ydCBtdXN0IGluY2x1ZGUgYHVzZXJfaWRgLCBvciBhbiBgaW5jaWRlbnRfZXZlbnRgIHdpdGggYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBpZGVudGlmaWVyOiBgbGlua19zZXNzaW9uX2lkYCwgYGlkdl9zZXNzaW9uX2lkYCwgYHByb3RlY3RfZXZlbnRfaWRgLCBgc2lnbmFsX2NsaWVudF90cmFuc2FjdGlvbl9pZGAsIG9yIGBhY2Nlc3NfdG9rZW5gLiBDb250ZXh0IGZpZWxkcyBzdWNoIGFzIGBpbnRlcm5hbF9yZWZlcmVuY2VgLCBgdGltZWAsIGBhbW91bnRgLCBhbmQgYGJhbmtfYWNjb3VudGAgZG8gbm90IHNhdGlzZnkgdGhpcyBpZGVudGlmaWVyIHJlcXVpcmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBQcm90ZWN0IHJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0fSBwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RSZXBvcnRDcmVhdGUocHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3Q6IFByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb3RlY3RSZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvdGVjdFJlcG9ydENyZWF0ZShwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGdldCBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBhIHVzZXIgYXMgaXQgcmVsYXRlcyB0byB0aGVpciBmcmF1ZCBwcm9maWxlIHdpdGggUHJvdGVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFByb3RlY3QgdXNlciBpbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSBwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb3RlY3RVc2VySW5zaWdodHNHZXQocHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb3RlY3RVc2VySW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvdGVjdFVzZXJJbnNpZ2h0c0dldChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBNYW51YWxseSBmaXJlIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdDogU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2ZkeC9jb25zZW50L3NlZWRgIGNyZWF0ZXMgYSB0ZXN0IEZEWCBjb25zZW50IGdyYW50IChhbmQgYSBiYWNraW5nIEl0ZW0pIGZvciBhIGRhdGEgcHJvdmlkZXJcXCdzIGN1c3RvbWVyIGluIFNhbmRib3gsIHNvIHRoZSBGRFggQ29uc2VudCBBUEkgZW5kcG9pbnRzIGNhbiBiZSBleGVyY2lzZWQgZW5kLXRvLWVuZCB3aXRob3V0IGEgbGl2ZSBkYXRhIHByb3ZpZGVyIGNvbm5lY3Rpb24uICBgY3VzdG9tZXJfaWRgIGlzIHRoZSBkYXRhIHByb3ZpZGVyXFwncyBpZGVudGlmaWVyIGZvciB0aGUgZW5kIHVzZXIgYW5kIGBhcHBsaWNhdGlvbl9pZGAgaWRlbnRpZmllcyB0aGUgZGF0YSByZWNpcGllbnQgYXBwbGljYXRpb24gdGhlIGNvbnNlbnQgaXMgZ3JhbnRlZCB0bzsgYm90aCBhcmUgcmVxdWlyZWQuIE9wdGlvbmFsbHkgcHJvdmlkZSBgY29uc2VudF9pZGAgKGEgVVVJRHY0KSB0byBjb250cm9sIHRoZSBzZWVkZWQgZ3JhbnRcXCdzIGlkZW50aWZpZXI7IG9uZSBpcyBnZW5lcmF0ZWQgd2hlbiBvbWl0dGVkLiBUaGUgc2VlZGVkIGdyYW50IGlzIHJldHVybmVkIGJ5IGAvZmR4L2NvbnNlbnRzYCBhbmQgYC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH1gLCBhbmQgY2FuIGJlIHJldm9rZWQgdmlhIGAvZmR4L2NvbnNlbnRzL3tjb25zZW50SWR9L3Jldm9jYXRpb25gLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWVkIGFuIEZEWCBjb25zZW50IGdyYW50IGZvciBhIHNhbmRib3ggZGF0YSBwYXJ0bmVyXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdH0gc2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hGZHhDb25zZW50U2VlZChzYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0OiBTYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hGZHhDb25zZW50U2VlZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94RmR4Q29uc2VudFNlZWQoc2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL2FwcGxpY2F0aW9uL3NlZWRgIGNyZWF0ZXMgYSB0ZXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBvbiBhbiBleGlzdGluZyBQZXJtaXNzaW9ucyBNYW5hZ2VyIEl0ZW1cXCdzIGxvZ2luLiBUaGUgc2VlZGVkIGFwcGxpY2F0aW9uIHdpbGwgYXBwZWFyIGluIHN1YnNlcXVlbnQgY2FsbHMgdG8gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgLiAgVGhlIGBhY2Nlc3NfdG9rZW5gIG11c3QgYmVsb25nIHRvIGEgUGVybWlzc2lvbnMgTWFuYWdlciBJdGVtIGNyZWF0ZWQgdmlhIGAvaXRlbS9pbXBvcnRgIGluIFNhbmRib3guIFRoZSBgYXBwbGljYXRpb25faWRgIGlkZW50aWZpZXMgdGhlIGFwcGxpY2F0aW9uIHRvIHNlZWQgYXMgYSBjb25uZWN0ZWQgYXBwLiBUbyBkaXNjb25uZWN0IGEgc2VlZGVkIGFwcGxpY2F0aW9uLCB1c2UgYC9pdGVtL2FwcGxpY2F0aW9uL3VubGlua2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlZWQgYSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgUGVybWlzc2lvbnMgTWFuYWdlciBzYW5kYm94IGl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3R9IHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdDogU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIHNpbXVsYXRpbmcgYSBkZWZhdWx0IHVwZGF0ZSBldmVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdCBhcyBzcGVjaWZpZWQgd2l0aCB0aGUgYHdlYmhvb2tfdHlwZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gVmFsaWQgU2FuZGJveCBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgdHlwZXMgaW5jbHVkZTogYEFVVEhgLCBgSURFTlRJVFlgLCBgVFJBTlNBQ1RJT05TYCwgYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2AsIGBMSUFCSUxJVElFU2AsIGBIT0xESU5HU2AuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIHByb2R1Y3QsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IEZpcmVkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgYWNjb3VudCBpcyBhdmFpbGFibGUgb24gdGhlIEl0ZW0gYW5kIHlvdSBjYW4gbGF1bmNoIHVwZGF0ZSBtb2RlIHRvIHJlcXVlc3QgYWNjZXNzIHRvIGl0LiAgYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmA6IEZpcmVkIHdoZW4gYSBnaXZlbiBTYW1lLURheSBNaWNyby1kZXBvc2l0IEl0ZW0gaXMgdmVyaWZpZWQgdmlhIFNNUyB2ZXJpZmljYXRpb24uICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBQRU5ESU5HX0RJU0NPTk5FQ1RgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2lsbCBzdG9wIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlIChlLmcuIGR1ZSB0byBhIHBsYW5uZWQgYmFuayBtaWdyYXRpb24pIGFuZCBtdXN0IGJlIHNlbnQgdGhyb3VnaCB1cGRhdGUgbW9kZSB0byBjb250aW51ZSB3b3JraW5nLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25zXFwnIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCB5b3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPQXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9BdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgdmFyaW91cyBwYXltZW50IGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVGhpcyBlbmRwb2ludCB3aWxsIHRyaWdnZXIgdGhlIGNvcnJlc3BvbmRpbmcgcGF5bWVudCBzdGF0dXMgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBwYXltZW50IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHJvY2Vzc29yX3Rva2VuYCBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElEIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHJvY2Vzc29yX3Rva2VuYCBjb3JyZXNwb25kcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiB1c2UgdGhpcyBgcHJvY2Vzc29yX3Rva2VuYCB3aXRoIHRoZSBgL3Byb2Nlc3Nvci9gIEFQSSBlbmRwb2ludHMgaW4gU2FuZGJveC4gWW91IGNhbiBhbHNvIHVzZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2FjdGlvbnMvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgbmV3IHRyYW5zYWN0aW9ucyBmb3IgYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgdXAgdG8gMTAgdHJhbnNhY3Rpb25zIHRvIGFueSBJdGVtIGF0IGEgdGltZS4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEl0ZW1zIHRoYXQgd2VyZSBjcmVhdGVkIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50IHVzaW5nIHRoZSBgdXNlcl90cmFuc2FjdGlvbnNfZHluYW1pY2AgdGVzdCB1c2VyLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGFkZCB0cmFuc2FjdGlvbnMgdG8gdGVzdCB0aGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnRzLiAgQ3VzdG9tIHRyYW5zYWN0aW9ucyBhcmUgb25seSBhcHBsaWVkIHRvIHRoZSBkZXBvc2l0b3J5IGFjY291bnQuIFN1cHBvcnQgZm9yIHBlci1hY2NvdW50IHRhcmdldGluZyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHNhbmRib3ggdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZShzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlKHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCB5b3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hVc2VyUmVzZXRMb2dpbihzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zZXNzaW9uL3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciBMYXllci4gVGhlIHJldHVybmVkIExpbmsgdG9rZW4gaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyB0aGUgTGluayBTREsuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBMaW5rIHRva2VuIGZvciBMYXllclxuICAgICAgICAgKiBAcGFyYW0ge1Nlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3R9IHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzZXNzaW9uVG9rZW5DcmVhdGUoc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdDogU2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTZXNzaW9uVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2Vzc2lvblRva2VuQ3JlYXRlKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciB5b3UgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAsIFBsYWlkIHdpbGwgbm9ybWFsbHkgaW5mZXIgdGhlIG91dGNvbWUgZnJvbSB5b3VyIFNpZ25hbCBSdWxlcy4gSG93ZXZlciwgaWYgeW91IGFyZSBub3QgdXNpbmcgU2lnbmFsIFJ1bGVzLCBpZiB0aGUgU2lnbmFsIFJ1bGVzIG91dGNvbWUgd2FzIGBSRVZJRVdgLCBvciBpZiB5b3UgdGFrZSBhIGRpZmZlcmVudCBhY3Rpb24gdGhhbiB0aGUgb25lIGRldGVybWluZWQgYnkgdGhlIFNpZ25hbCBSdWxlcywgeW91IHdpbGwgbmVlZCB0byBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAuIFRoaXMgaGVscHMgaW1wcm92ZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUgYWNjdXJhY3kgZm9yIHlvdXIgYWNjb3VudCBhbmQgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgdGhlIHJ1bGUgcGVyZm9ybWFuY2UgYW5kIHJ1bGUgdHVuaW5nIGNhcGFiaWxpdGllcyBpbiB0aGUgRGFzaGJvYXJkLiBJZiB5b3VyIGVmZmVjdGl2ZSBkZWNpc2lvbiBjaGFuZ2VzIGFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCAoZm9yIGV4YW1wbGUsIHlvdSBpbmRpY2F0ZWQgdGhhdCB5b3UgYWNjZXB0ZWQgYSB0cmFuc2FjdGlvbiwgYnV0IGxhdGVyIG9uLCB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIHJlamVjdGVkIGl0LCBzbyBpdCB3YXMgbmV2ZXIgaW5pdGlhdGVkKSwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIGFnYWluIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gY29ycmVjdCBQbGFpZFxcJ3MgcmVjb3Jkcy4gIElmIHlvdSBhcmUgdXNpbmcgUGxhaWQgVHJhbnNmZXIgYXMgeW91ciBwYXltZW50IHByb2Nlc3NvciwgeW91IGFsc28gZG8gbm90IG5lZWQgdG8gY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLCBhcyBQbGFpZCBjYW4gaW5mZXIgb3V0Y29tZXMgZnJvbSB5b3VyIFRyYW5zZmVyIGFjdGl2aXR5LiAgSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgQmVmb3JlIHVzaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIHJ1bGVzZXRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pIGluIHRoZSBEYXNoYm9hcmQgdW5kZXIgWyoqU2lnbmFsLT5SdWxlcyoqXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc2lnbmFsL3Jpc2stcHJvZmlsZXMpLiAgYC9zaWduYWwvZXZhbHVhdGVgIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgb3IgdGhlIEJhbGFuY2UgcHJvZHVjdC4gV2hpY2ggcHJvZHVjdCBpcyB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgYHJ1bGVzZXRfa2V5YCB0aGF0IHlvdSBwcm92aWRlLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IGhhdmUgaGlnaGVyIGxhdGVuY3kgd2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXF1ZXN0IGRhdGEuIEJhbGFuY2Utb25seSBydWxlc2V0cyBtYXkgaGF2ZSBsYXRlbmN5IG9mIHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyB1c2VkIHRvIGRldmVsb3AgYSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUgb24gSXRlbXMgd2hlcmUgYHNpZ25hbGAgd2FzIGFkZGVkIGluIHRoZSBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5IGJ1dCBub3QgaW4gdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgIGFycmF5LiBJZiBgL3NpZ25hbC9wcmVwYXJlYCBpcyBza2lwcGVkIG9uIGFuIEl0ZW0gdGhhdCBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBQbGFpZCB3aWxsIGhhdmUgYWNjZXNzIHRvIGxlc3MgZGF0YSBmb3IgY29tcHV0aW5nIHRoZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuICBJZiB5b3VyIGludGVncmF0aW9uIGlzIHB1cmVseSBCYWxhbmNlLW9ubHksIHRoaXMgZW5kcG9pbnQgd2lsbCBoYXZlIG5vIGVmZmVjdCwgYXMgQmFsYW5jZS1vbmx5IHJ1bGVzZXRzIGRvIG5vdCBjYWxjdWxhdGUgYSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYW4gSXRlbSB0byBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmVzXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmRzIGludG8geW91ciBzY29yZXMgYW5kIHR1bmUgcnVsZSBsb2dpYy4gSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChhcyBCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvc2NoZWR1bGVgIHRvIHNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxTY2hlZHVsZVJlcXVlc3R9IHNpZ25hbFNjaGVkdWxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdDogU2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFNjaGVkdWxlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50IGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2VyXFwncyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuICBXaGVuIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGZvciBiZXN0IHJlc3VsdHMsIG1ha2Ugc3VyZSB0byB1c2UgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgcGFyYW1ldGVyIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBJdGVtcyB3aXRoIFRyYW5zYWN0aW9ucy4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoZSBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBUcmFuc2FjdGlvbnMgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAuICBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIG9wdGlvbmFsIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC90cmFuc2FjdGlvbnMvc3luY2AsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBpbnRlZ3JhdGlvbiBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBhbiBleGlzdGluZyBpbnRlZ3JhdGlvbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nLiBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBBIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHVzZWQgdG8gY3JlYXRlIGEgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gVGhlIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gd2lsbCBleHBpcmUgaWYgbm90IHVzZWQgYWZ0ZXIgb25lIGhvdXIuIChZb3UgY2FuIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGF1dGhvcml6YXRpb24gbGlmZXRpbWUuKSAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBhZGRpdGlvbmFsIHVzZXIgaW5wdXQgaXMgbmVlZGVkLCB1c3VhbGx5IHRvIGZpeCBhIGJyb2tlbiBiYW5rIGNvbm5lY3Rpb24sIGJlZm9yZSBQbGFpZCBjYW4gcHJvcGVybHkgYXNzZXNzIHRoZSByaXNrLiBZb3UgbmVlZCB0byBsYXVuY2ggTGluayBpbiB1cGRhdGUgbW9kZSB0byBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgdXNlciBhY3Rpb24uIFdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCB0byBnZXQgYSBuZXcgTGluayB0b2tlbiwgaW5zdGVhZCBvZiBwcm92aWRpbmcgYGFjY2Vzc190b2tlbmAgaW4gdGhlIHJlcXVlc3QsIHlvdSBzaG91bGQgc2V0IFtgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNmZXItYXV0aG9yaXphdGlvbi1pZCkgYXMgdGhlIGBhdXRob3JpemF0aW9uLmlkYC4gQWZ0ZXIgdGhlIExpbmsgZmxvdyBpcyBjb21wbGV0ZWQsIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbi4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUtRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBnZXQgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBvZiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIChEZXByZWNhdGVkKSBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlaXIgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3VcXCdsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgYG11bHRpcGFydC9mb3JtLWRhdGFgLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvciAoaS5lLiwgdGhlIGVuZCBjdXN0b21lcikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDUwMCB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYC4gT25lIG9mIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgIG11c3QgYmUgcG9wdWxhdGVkIGJ1dCBub3QgYm90aC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzLCBpZiB5b3UgaGF2ZSBtdWx0aXBsZS4gSWYgeW91XFwncmUgYSBwbGF0Zm9ybSwgeW91IGNhbiBtb3ZlIGZ1bmRzIGJldHdlZW4gb25lIG9mIHlvdXIgbGVkZ2VycyBhbmQgb25lIG9mIHlvdXIgY3VzdG9tZXJcXCdzIGxlZGdlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiBsZWRnZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBsZWRnZXIgZXZlbnRzIGZvciBhIHNwZWNpZmljIGxlZGdlciBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGxlZGdlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0KHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0KHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLiAgSW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZW5kcG9pbnQgcmV0dXJucyBzdGF0aWMgcGxhY2Vob2xkZXIgdmFsdWVzIHJhdGhlciB0aGFuIG1ldHJpY3MgY29tcHV0ZWQgZnJvbSB5b3VyIFNhbmRib3ggdHJhbnNmZXIgYWN0aXZpdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBwcmV2aW91c2x5LXZlcmlmaWVkIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBvciBbc3VwcG9ydF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQpLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IGZ1bmRpbmcgYWNjb3VudCBmb3IgdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBmdW5kaW5nIGFjY291bnQgZm9yIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBzdWJtaXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3IgeW91IGFyZSBvbmJvYXJkaW5nLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmF0b3JcXCdzIGFncmVlbWVudCB0byB0aGUgcmVxdWlyZWQgbGVnYWwgdGVybXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBUcmFuc2ZlciBmb3IgUGxhdGZvcm1zIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciAoZS5nLiBiZW5lZmljaWFsIG93bmVyIG9yIGNvbnRyb2wgcGVyc29uKSBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uYWwgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCBhZGRpdGlvbmFsIG9uYm9hcmRpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQgYnkgUGxhaWQgdG8gYXBwcm92ZSBvciBkZWNsaW5lIHRoZSBvcmlnaW5hdG9yLiBTZWUgW1JlcXVpcmVtZW50IHR5cGUgc2NoZW1hIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMU5FUWtURDBzVks1MGlBUWk2eEhpZ3JleERVeFo0UXhYcVNFZlZfRkZUaVUvKSBmb3IgYSBsaXN0IG9mIHJlcXVpcmVtZW50IHR5cGVzIGFuZCBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBhZGRpdGlvbmFsIG9uYm9hcmRpbmcgaW5mb3JtYXRpb24gb24gYmVoYWxmIG9mIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZFxcJ3MgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBBIHNjaGVkdWxlZCB0cmFuc2ZlciB0aGF0IGhhc25cXCd0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFRyYW5zZmVyIGZvciBQbGF0Zm9ybXMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuICBBIHJlZnVuZCBjYW4gc3RpbGwgYmUgaXNzdWVkIGV2ZW4gaWYgdGhlIEl0ZW1cXCdzIGBhY2Nlc3NfdG9rZW5gIGlzIG5vIGxvbmdlciB2YWxpZCAoZS5nLiBpZiB0aGUgdXNlciByZXZva2VkIE9BdXRoIGNvbnNlbnQgb3IgdGhlIEl0ZW0gd2FzIGRlbGV0ZWQgdmlhIGAvaXRlbS9yZW1vdmVgKSwgYXMgbG9uZyBhcyB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIgcGFpciB1c2VkIHRvIG1ha2UgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGlzIHN0aWxsIHZhbGlkLiBBIHJlZnVuZCBjYW5ub3QgYmUgaXNzdWVkIGlmIHRoZSBJdGVtIGhhcyBhbiBbaW52YWxpZGF0ZWQgVEFOXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLCB3aGljaCBjYW4gb2NjdXIgYXQgQ2hhc2Ugb3IgUE5DLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZXR1cm4vcmVjb3ZlcmAgZW5kcG9pbnQgdG8gbm90aWZ5IFBsYWlkIHRoYXQgeW91IGhhdmUgcmVjb3ZlcmVkIHNvbWUgb3IgYWxsIG9mIHRoZSBsb3NzIG9uIGEgcmV0dXJuZWQgZ3VhcmFudGVlZCB0cmFuc2Zlci4gIFJlY292ZXJ5IGNhbiBiZSByZXBvcnRlZCBpbiBmdWxsIG9yIGluIHBhcnRzOyB0aGUgc3VtIG9mIHJlY292ZXJlZCBhbW91bnRzIGFjcm9zcyBjYWxscyBjYW5ub3QgZXhjZWVkIHRoZSBvcmlnaW5hbCB0cmFuc2ZlclxcJ3MgYW1vdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gcmVjb3ZlcnlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0fSB0cmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXR1cm5SZWNvdmVyKHRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3Q6IFRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmV0dXJuUmVjb3Zlcih0cmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3Mgc2VuZGluZyBjbGllbnQtc3BlY2lmaWMgZXZlbnRzIHJlbGF0ZWQgdG8gTGF5ZXIgc2Vzc2lvbnMgZm9yIGFuYWx5dGljcyBhbmQgdHJhY2tpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlbmQgVXNlciBBY2NvdW50IFNlc3Npb24gRXZlbnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kKHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZCh1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHVzZXIgcGVybWlzc2lvbmVkIGFjY291bnQgZGF0YSwgaW5jbHVkaW5nIGlkZW50aXR5IGFuZCBJdGVtIGFjY2VzcyB0b2tlbnMsIGZvciB1c2Ugd2l0aCBbUGxhaWQgTGF5ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGF5ZXIpLiBOb3RlIHRoYXQgZW5kIHVzZXJzIGFyZSBwZXJtaXR0ZWQgdG8gZWRpdCB0aGUgcHJlZmlsbGVkIGlkZW50aXR5IGRhdGEgaW4gdGhlIExpbmsgZmxvdyBiZWZvcmUgc2hhcmluZyBpdCB3aXRoIHlvdTsgeW91IHNob3VsZCB0cmVhdCBhbnkgaWRlbnRpdHkgZGF0YSByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFzIHVzZXItc3VibWl0dGVkLCB1bnZlcmlmaWVkIGRhdGEuIEZvciBhIHZlcmlmaWNhdGlvbiBsYXllciwgeW91IGNhbiBhZGQgW0lkZW50aXR5IFZlcmlmaWNhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vKSB0byB5b3VyIGZsb3csIG9yIGNoZWNrIHRoZSBzdWJtaXR0ZWQgaWRlbnRpdHkgZGF0YSBhZ2FpbnN0IGJhbmsgYWNjb3VudCBkYXRhIGZyb20gbGlua2VkIGFjY291bnRzIHVzaW5nIFtJZGVudGl0eSBNYXRjaF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS8jaWRlbnRpdHktbWF0Y2gpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRm9yIFBsYWlkIHByb2R1Y3RzIGFuZCBmbG93cyB0aGF0IHVzZSB0aGUgdXNlciBvYmplY3QsIGAvdXNlci9jcmVhdGVgIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3UgbXVzdCBjYWxsIHRoaXMgZW5kcG9pbnQgYmVmb3JlIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaWYgeW91IGFyZSB1c2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZzogUGxhaWQgQ2hlY2ssIEluY29tZSBWZXJpZmljYXRpb24sIE11bHRpLUl0ZW0gTGluaywgb3IgUGxhaWQgUHJvdGVjdCAoSWRlbnRpdHkpLiBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFByb3RlY3QgTGluayBzZXNzaW9uIHNjb3JpbmcsIHlvdSBkbyBub3QgbmVlZCB0byBjYWxsIGAvdXNlci9jcmVhdGVgIGZpcnN0OyBQbGFpZCB3aWxsIHJlc29sdmUgb3IgY3JlYXRlIHRoZSB1c2VyIHdoZW4gYHVzZXIuY2xpZW50X3VzZXJfaWRgIGlzIHByb3ZpZGVkIGluIGAvbGluay90b2tlbi9jcmVhdGVgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyB0aGlzIGVuZHBvaW50IG9uIG9yIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1LCB0aGlzIGVuZHBvaW50IHRha2VzIGEgYGNsaWVudF91c2VyX2lkYCBhbmQgYW4gYGlkZW50aXR5YCBvYmplY3QgYW5kIHdpbGwgcmV0dXJuIGEgYHVzZXJfaWRgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyBpdCBiZWZvcmUgdGhhdCBkYXRlLCB0aGUgZW5kcG9pbnQgdGFrZXMgYSBgY2xpZW50X3VzZXJfaWRgIGFuZCBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IGFuZCB3aWxsIHJldHVybiBhIGB1c2VyX3Rva2VuYCBhbmQgYHVzZXJfaWRgLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIEluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLCB0aGUgYGlkZW50aXR5YCAobmV3KSBvciBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIChsZWdhY3kpIG9iamVjdCBtdXN0IGJlIHByZXNlbnQuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiAgIEluIG9yZGVyIHRvIGdlbmVyYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCB0aGUgZm9sbG93aW5nIGBpZGVudGl0eWAgZmllbGRzLCBhdCBtaW5pbXVtLCBhcmUgcmVxdWlyZWQgYW5kIG11c3QgYmUgbm9uLWVtcHR5OiBgbmFtZWAsIGBkYXRlX29mX2JpcnRoYCwgYGVtYWlsc2AsIGBwaG9uZV9udW1iZXJzYCwgYW5kIGBhZGRyZXNzZXNgICh3aXRoIGF0IGxlYXN0IG9uZSBlbWFpbCwgcGhvbmUgbnVtYmVyLCBhbmQgYWRkcmVzcyBkZXNpZ25hdGVkIGFzIGBwcmltYXJ5YCkuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiBJZiBjcmVhdGluZyBhIHJlcG9ydCBmb3Igc2hhcmluZyB3aXRoIGEgR1NFIHN1Y2ggYXMgRmFubmllIG9yIEZyZWRkaWUsIHRoZSB1c2VyXFwncyBmdWxsIFNTTiBtdXN0IGJlIHByb3ZpZGVkIHZpYSB0aGUgYGlkX251bWJlcnNgIGZpZWxkLiBQcm92aWRpbmcgYXQgbGVhc3QgYSBwYXJ0aWFsIFNTTiBpcyBhbHNvIHN0cm9uZ2x5IHJlY29tbWVuZGVkIGZvciBhbGwgdXNlIGNhc2VzLCBzaW5jZSBpdCBpbXByb3ZlcyB0aGUgYWNjdXJhY3kgb2YgbWF0Y2hpbmcgdXNlciByZWNvcmRzIGR1cmluZyBjb21wbGlhbmNlIHByb2Nlc3NlcyBzdWNoIGFzIGZpbGUgZGlzY2xvc3VyZSwgZGlzcHV0ZSwgb3Igc2VjdXJpdHkgZnJlZXplIHJlcXVlc3RzLiAgIFdoZW4gdXNpbmcgUGxhaWQgUHJvdGVjdCwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHByb3ZpZGUgYW4gYGlkZW50aXR5YCBvYmplY3QgdG8gYmV0dGVyIGlkZW50aWZ5IGFuZCBibG9jayBmcmF1ZCBhY3Jvc3MgeW91ciBMaW5rIHNlc3Npb25zLiAgIFBsYWlkIHdpbGwgbm9ybWFsaXplIGlkZW50aXR5IGZpZWxkcyBiZWZvcmUgc3RvcmluZyB0aGVtIGFuZCB1dGlsaXplIHRoZSBzYW1lIGlkZW50aXR5IGFjcm9zcyBkaWZmZXJlbnQgdXNlci1iYXNlZCBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9maW5hbmNpYWxfZGF0YS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBVc2VyIHVzaW5nIHRoZSBGaW5hbmNpYWwgSW5zaWdodHMgYnVuZGxlLiBUaGlzIGJ1bmRsZSByZWZyZXNoZXMgdGhlIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIGFuZCBMaWFiaWxpdGllcyBwcm9kdWN0IGRhdGEuIFRoaXMgZW5kcG9pbnQgaXMgZm9yIGNsaWVudHMgd2hvIHVzZSB0aGUgRmluYW5jaWFsIEluc2lnaHRzIGJ1bmRsZSBhbmQgd2FudCB0byBwcm9hY3RpdmVseSB1cGRhdGUgYWxsIGxpbmtlZCBJdGVtcyB1bmRlciBhIHVzZXIuIFRoZSByZWZyZXNoIG1heSBzdWNjZWVkIG9yIGZhaWwgb24gYSBwZXItSXRlbSBiYXNpcy4gVXNlIHRoZSBgcmVzdWx0c2AgYXJyYXkgaW4gdGhlIHJlc3BvbnNlIHRvIHVuZGVyc3RhbmQgdGhlIG91dGNvbWUgZm9yIGVhY2ggSXRlbS4gIFRoaXMgZW5kcG9pbnQgaXMgZGlzdGluY3QgZnJvbSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgd2hpY2ggdHJpZ2dlcnMgYSByZWZyZXNoIGZvciBhIHNpbmdsZSBJdGVtLiBVc2UgYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIHRvIHRhcmdldCBhbGwgSXRlbXMgZm9yIGEgdXNlciBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHVzZXIgaXRlbXMgZm9yIEZpbmFuY2lhbC1JbnNpZ2h0cyBidW5kbGVcbiAgICAgICAgICogQHBhcmFtIHtVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0fSB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckZpbmFuY2lhbERhdGFSZWZyZXNoKHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3Q6IFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaCh1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IHVzZXIgZGV0YWlscyB1c2luZyBhIGB1c2VyX2lkYC4gVGhpcyBlbmRwb2ludCBvbmx5IHN1cHBvcnRzIHVzZXJzIHRoYXQgd2VyZSBjcmVhdGVkIG9uIHRoZSBuZXcgdXNlciBBUEkgZmxvdywgd2l0aG91dCBhIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB1c2VyIGlkZW50aXR5IGFuZCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJHZXRSZXF1ZXN0fSB1c2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyR2V0KHVzZXJHZXRSZXF1ZXN0OiBVc2VyR2V0UmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyR2V0KHVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgY3VzdG9tZXJzIHRvIGV4cGxpY2l0bHkgcHVyZ2UgaWRlbnRpdHkvUElJIGRhdGEgcHJvdmlkZWQgdG8gUGxhaWQgZm9yIGEgZ2l2ZW4gdXNlci4gVGhpcyBpcyBub3QgZXhwb3NlZCB0byBjdXN0b21lcnMgYnkgZGVmYXVsdCwgYXMgaXQgaXMgbWVhbnQgZm9yIHNwZWNpYWwgc2NlbmFyaW9zIG9yIHJlcXVlc3RzLCBidXQgUGxhaWQgaXMgb2JsaWdhdGVkIHRvIGVuYWJsZSBjdXN0b21lcnMgdG8gZGVsZXRlIFBJSSBwcm92aWRlZCB0byB1cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXIgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3R9IHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlcklkZW50aXR5UmVtb3ZlKHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3Q6IFVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJJZGVudGl0eVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VySWRlbnRpdHlSZW1vdmUodXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzc29jaWF0ZXMgSXRlbXMgdG8gdGhlIHRhcmdldCB1c2VyLiBJZiBhbiBJdGVtIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB0byBhbm90aGVyIHVzZXIsIHRoZSBJdGVtIHdpbGwgYmUgZGlzYXNzb2NpYXRlZCB3aXRoIHRoZSBleGlzdGluZyB1c2VyIGFuZCBhc3NvY2lhdGVkIHRvIHRoZSB0YXJnZXQgdXNlci4gVGhpcyBvcGVyYXRpb24gc3VwcG9ydHMgYSBtYXggb2YgMTAwIEl0ZW1zLlxuICAgICAgICAgKiBAc3VtbWFyeSBBc3NvY2lhdGUgSXRlbXMgdG8gYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdH0gdXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0Fzc29jaWF0ZSh1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0OiBVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJJdGVtc0Fzc29jaWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VySXRlbXNBc3NvY2lhdGUodXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLCBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuIFBsYWlkIGFzc29jaWF0ZXMgYW4gSXRlbSB3aXRoIGEgVXNlciB3aGVuIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgd2l0aGluIGEgTGluayBzZXNzaW9uIGluaXRpYWxpemVkIHdpdGggdGhhdCBgdXNlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0OiBVc2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJJdGVtc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgc3BlY2lmaWMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci4gSXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIG9uIGVhY2ggSXRlbSBpbmRpdmlkdWFsbHksIGJ1dCBzdXBwb3J0cyB1c2UgY2FzZXMgKHN1Y2ggYXMgUGxhaWQgQ2hlY2spIHdoZXJlIGFjY2VzcyB0b2tlbnMgYXJlIG5vdCBhdmFpbGFibGUuIEFsbCBzcGVjaWZpZWQgSXRlbXMgbXVzdCBiZWxvbmcgdG8gdGhlIHVzZXIgb3IgdGhlIGVudGlyZSBvcGVyYXRpb24gZmFpbHMuIFNpbWlsYXIgdG8gYC9pdGVtL3JlbW92ZWAsIHRoaXMgZGVsZXRlcyBJdGVtIHByb2R1Y3QgZGF0YSBhbmQgdGVybWluYXRlcyBiaWxsaW5nIG9uIHRoZSBJdGVtXFwncyBwcm9kdWN0cy4gT25jZSByZW1vdmVkLCBJdGVtcyBjYW5ub3QgYmUgcmVjb25uZWN0ZWQgd2l0aG91dCBnb2luZyB0aHJvdWdoIExpbmsgYWdhaW4uIFRoaXMgZW5kcG9pbnQgaXMgbm90IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgZGF0YSBmb3IgYSB1c2VyLCBhcyBpdCB3aWxsIG9ubHkgcmVtb3ZlIEl0ZW1zIGFuZCBubyBvdGhlciBkYXRhIGZvciB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIGFueSB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gcHJvZHVjdHMgKEZpbmFuY2lhbCBNYW5hZ2VtZW50LCBQbGFpZCBQcm90ZWN0LCBvciBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFuZCBpcyBkZWxldGluZyB0aGVpciBhY2NvdW50IHdpdGggeW91ciBwcm9kdWN0LCBhbHNvIGNhbGwgYC91c2VyL3Byb2R1Y3RzL3Rlcm1pbmF0ZWAgdG8gZW5kIHRob3NlIHN1YnNjcmlwdGlvbnM7IHBlci1JdGVtIGJpbGxpbmcgaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBhIHVzZXIgaW5pdGlhdGVkIGRhdGEgZGVsZXRpb24gcmVxdWVzdCwgc2VlIHRoZSBbQ29uc3VtZXIgU2VydmljZSBDZW50ZXJdKGh0dHBzOi8vcGxhaWQuY29tL2NoZWNrL2NvbnN1bWVyLXNlcnZpY2UtY2VudGVyLykgdG8gcmV2b2tlIGFjY2VzcyB0byBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgSXRlbXMgZnJvbSBhIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VySXRlbXNSZW1vdmVSZXF1ZXN0fSB1c2VySXRlbXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckl0ZW1zUmVtb3ZlKHVzZXJJdGVtc1JlbW92ZVJlcXVlc3Q6IFVzZXJJdGVtc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckl0ZW1zUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJJdGVtc1JlbW92ZSh1c2VySXRlbXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGVybWluYXRlcyB1c2VyLWJhc2VkIHJlY3VycmluZyBzdWJzY3JpcHRpb24gYnVuZGxlcyBvciBwcm9kdWN0cyAoRmluYW5jaWFsIE1hbmFnZW1lbnQsIFBsYWlkIFByb3RlY3QsIGFuZCBDUkEgQ2FzaCBGbG93IFVwZGF0ZXMpIGFzc29jaWF0ZWQgd2l0aCBhIGB1c2VyX2lkYC4gQWZ0ZXIgeW91IGNhbGwgdGhpcyBlbmRwb2ludCwgdGhlIHVzZXIgd2lsbCBubyBsb25nZXIgYmUgYmlsbGVkIGZvciB0aGVzZSBwcm9kdWN0cy4gRm9yIENSQSBNb25pdG9yaW5nLCB0aGUgc3Vic2NyaXB0aW9uIGlzIGNhbmNlbGVkIGJ1dCBoaXN0b3JpY2FsIGRhdGEgcmVtYWlucyBhdmFpbGFibGUgZm9yIGZ1dHVyZSByZXBvcnQgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRlcm1pbmF0ZSB1c2VyLWJhc2VkIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gdXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZSh1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0OiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyUHJvZHVjdHNUZXJtaW5hdGUodXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUmVtb3ZlUmVxdWVzdH0gdXNlclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBzaGFyZWQgd2l0aCBhbmQgdXNlZCBieSBhIHNwZWNpZmllZCB0aGlyZC1wYXJ0eSBjbGllbnQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRocm91Z2ggc3VwcG9ydGVkIGVuZHBvaW50cy4gIEVuc3VyZSB5b3Ugc3RvcmUgdGhlIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHRoZSBgdXNlcl90b2tlbmAgYW5kIGB0aGlyZF9wYXJ0eV9jbGllbnRfaWRgLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGRlbGV0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIE9uY2UgcmVtb3ZlZCwgdGhlIHRva2VuIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3VzZXIvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIFRyYW5zYWN0aW9ucyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyBvbmx5IHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCBkYXRhLiBUaGlzIGVuZHBvaW50IGlzIGZvciBjbGllbnRzIHdobyB1c2UgdGhlIFRyYW5zYWN0aW9ucyBJbnNpZ2h0cyBidW5kbGUgYW5kIHdhbnQgdG8gcHJvYWN0aXZlbHkgdXBkYXRlIGFsbCBsaW5rZWQgSXRlbXMgdW5kZXIgYSB1c2VyLiBUaGUgcmVmcmVzaCBtYXkgc3VjY2VlZCBvciBmYWlsIG9uIGEgcGVyLUl0ZW0gYmFzaXMuIFVzZSB0aGUgYHJlc3VsdHNgIGFycmF5IGluIHRoZSByZXNwb25zZSB0byB1bmRlcnN0YW5kIHRoZSBvdXRjb21lIGZvciBlYWNoIEl0ZW0uICBUaGlzIGVuZHBvaW50IGlzIGRpc3RpbmN0IGZyb20gYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIHdoaWNoIHRyaWdnZXJzIGEgcmVmcmVzaCBmb3IgYSBzaW5nbGUgSXRlbS4gVXNlIGAvdXNlci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdXNlciBpdGVtcyBmb3IgVHJhbnNhY3Rpb25zIGJ1bmRsZVxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRyYW5zYWN0aW9uc1JlZnJlc2godXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclRyYW5zYWN0aW9uc1JlZnJlc2godXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCB1cGRhdGVzIHVzZXIgaW5mb3JtYXRpb24gZm9yIGFuIGV4aXN0aW5nIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAuIElmIGFuIGV4aXN0aW5nIGB1c2VyX2lkYCBvciBgdXNlcl90b2tlbmAgaXMgbWlzc2luZyBmaWVsZHMgcmVxdWlyZWQgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgKGUuZy4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQpIHVzZSBgL3VzZXIvdXBkYXRlYCB0byBhZGQgdmFsdWVzIGZvciB0aG9zZSBmaWVsZHMuICBJZGVudGl0eSB1cGRhdGVzIHVzZSBtZXJnZSBzZW1hbnRpY3M6IHByb3ZpZGVkIGZpZWxkcyBvdmVyd3JpdGUgZXhpc3Rpbmcgb25lczsgb21pdHRlZCBmaWVsZHMgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0OiBXYWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUGxhaWRBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgUGxhaWRBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCAgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWRcXCdzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0OyBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBOb3RlOiBJZiB5b3UgYXJlIGdldHRpbmcgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2Vzc2luZyB0aGUgcmV0dXJuIHJpc2sgb2YgYSBwcm9wb3NlZCBBQ0ggdHJhbnNhY3Rpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZCBvZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gYC9zaWduYWwvZXZhbHVhdGVgIHJldHVybnMgdGhlIHNhbWUgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24gYW5kIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIFNpZ25hbCBSdWxlcywgd2hpY2ggcHJvdmlkZXMgbm8tY29kZSB0cmFuc2FjdGlvbiBidXNpbmVzcyBsb2dpYyBjb25maWd1cmF0aW9uLCBiYWNrdGVzdGluZyBhbmQgcmVjb21tZW5kYXRpb25zIGZvciB0dW5pbmcgeW91ciB0cmFuc2FjdGlvbiBhY2NlcHRhbmNlIGxvZ2ljLCBhbmQgdGhlIGFiaWxpdHkgdG8gZWFzaWx5IHN3aXRjaCBiZXR3ZWVuIEJhbGFuY2UgYW5kIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgYXMgbmVlZGVkIGZvciB1bHRyYS1sb3ctbGF0ZW5jeSwgTUwtcG93ZXJlZCByaXNrIGFzc2Vzc21lbnRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtCYWxhbmNlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYmFsYW5jZS8jYmFsYW5jZS1pbnRlZ3JhdGlvbi1vcHRpb25zKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyAtLSB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50cyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBvciBgL3NpZ25hbC9ldmFsdWF0ZWAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gdGhlIEdTRXMgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtIG9yIHV0aWxpemUgRnJlZGRpZSBNYWNcXCdzIExvYW4gUHJvZHVjdCBBZHZpc29ywq4gKExQQcKuKSBBc3NldCBhbmQgSW5jb21lIE1vZGVsZXIgKEFJTSkuIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHkgaW4gUERGIGZvcm1hdC4gVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0aGF0IHdhcyBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlQZGZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldChhc3NldFJlcG9ydEF1ZGl0Q29weVBkZkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5UGRmR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcsIHNhdmluZ3MsIGFuZCBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hdXRoL3ZlcmlmeWAgZW5kcG9pbnQgdmVyaWZpZXMgYmFuayBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgYW5kIChvcHRpb25hbGx5KSBhY2NvdW50IG93bmVyIG5hbWVzIGFnYWluc3QgUGxhaWRcXCdzIGRhdGFiYXNlIHZpYSBbRGF0YWJhc2UgQXV0aF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL2RhdGFiYXNlLWF1dGgvKS4gSXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGFjY291bnQgbnVtYmVycyB0aGF0IHdlcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhlIFBsYWlkIExpbmsgZmxvdy4gIFRoaXMgZW5kcG9pbnQgaXMgY3VycmVudGx5IGluIEVhcmx5IEF2YWlsYWJpbGl0eTsgY29udGFjdCBzYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgKiBAc3VtbWFyeSBWZXJpZnkgYXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtBdXRoVmVyaWZ5UmVxdWVzdH0gYXV0aFZlcmlmeVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRoVmVyaWZ5KGF1dGhWZXJpZnlSZXF1ZXN0OiBBdXRoVmVyaWZ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmF1dGhWZXJpZnkoYXV0aFZlcmlmeVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3Qgc3dlZXBzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgdG8gZ2V0IHJpc2sgaW5zaWdodHMgZm9yIGEgbGlua2VkIGFjY291bnQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEV2YWx1YXRlIHJpc2sgb2YgYSBiYW5rIGFjY291bnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IElELlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYWxsIEFjY291bnRzIGxpbmtlZCB0byB0aGlzIEJlYWNvbiBVc2VyLiBUaGUgaW5zaWdodHMgZm9yIGVhY2ggYWNjb3VudCBhcmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBMaXN0IGEgQmVhY29uIFVzZXJcXCdzIGhpc3RvcnlcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIGByZWplY3RlZGAsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgY2xlYXJlZGAsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gYGNsZWFyZWRgLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBgcGVuZGluZ19yZXZpZXdgLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS9ld2FfcmVwb3J0L3YxL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYW4gRWFybmVkIFdhZ2UgQWNjZXNzIChFV0EpIHNjb3JlIHRoYXQgcXVhbnRpZmllcyB0aGUgZGVsaW5xdWVuY3kgcmlzayBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBpdGVtLiBUaGUgc2NvcmUgaXMgZGVyaXZlZCBmcm9tIGEgY29tYmluYXRpb24gb2YgY2FzaGZsb3cgcGF0dGVybnMgYW5kIG5ldHdvcmstYmFzZWQgYmVoYXZpb3JhbCBmZWF0dXJlcy4gIFRoZSByZXNwb25zZSByZXR1cm5zIGEgbGlzdCBvZiBFV0Egc2NvcmVzLCB3aGVyZSBlYWNoIHNjb3JlIGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsIGFkdmFuY2UgYW1vdW50IHJhbmdlLiBUaGVzZSBzY29yZXMgZXN0aW1hdGUgdGhlIGxpa2VsaWhvb2Qgb2YgcmVwYXltZW50IGZvciBhZHZhbmNlcyB3aXRoaW4gdGhhdCByYW5nZS4gIFNjb3JlIHJhbmdlOiAxLTk5ICBJbnRlcnByZXRhdGlvbjogSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBhIGdyZWF0ZXIgbGlrZWxpaG9vZCBvZiByZXBheW1lbnQuICBUaGlzIGVuZHBvaW50IGVuYWJsZXMgY2xpZW50cyB0byBhc3Nlc3MgcmVwYXltZW50IHJpc2sgYW5kIG1ha2UgZGF0YS1kcml2ZW4gZGVjaXNpb25zIHdoZW4gZGV0ZXJtaW5pbmcgZWxpZ2liaWxpdHkgb3IgbGltaXRzIGZvciBlYXJuZWQgd2FnZSBhZHZhbmNlcy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgRVdBIFNjb3JlIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdH0gYmV0YUV3YVJlcG9ydFYxR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJldGFFd2FSZXBvcnRWMUdldChiZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0OiBCZXRhRXdhUmVwb3J0VjFHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmV0YUV3YVJlcG9ydFYxR2V0KGJldGFFd2FSZXBvcnRWMUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIHJlY29yZC4gWW91IGNhbiBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgeW91IGhhdmUgYXZhaWxhYmxlLiBJZiBhbnkgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgbWlzc2luZyBmb3IgdGhlIHByb2R1Y3RzIHlvdSBpbnRlbmQgdG8gdXNlLCBpdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgYHJlcXVpcmVtZW50c19kdWVgIGZpZWxkIG9mIHRoZSByZXNwb25zZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgKiBAcGFyYW0ge0JldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3R9IGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGUoYmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdDogQmV0YVBhcnRuZXJDdXN0b21lclYxQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUNyZWF0ZShiZXRhUGFydG5lckN1c3RvbWVyVjFDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIGZ1bGwgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUVuYWJsZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZXRhUGFydG5lckN1c3RvbWVyVjFFbmFibGUocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvcGFydG5lci9jdXN0b21lci92MS9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZXRhaWxzIG9mIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge0JldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3R9IGJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZXRhUGFydG5lckN1c3RvbWVyVjFHZXQoYmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdDogQmV0YVBhcnRuZXJDdXN0b21lclYxR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJldGFQYXJ0bmVyQ3VzdG9tZXJWMUdldChiZXRhUGFydG5lckN1c3RvbWVyVjFHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3BhcnRuZXIvY3VzdG9tZXIvdjEvdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIGVuZCBjdXN0b21lciByZWNvcmQuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlcyBhbiBleGlzdGluZyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZXRhUGFydG5lckN1c3RvbWVyVjFVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmV0YVBhcnRuZXJDdXN0b21lclYxVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYnVzaW5lc3MgdmVyaWZpY2F0aW9uIHRvIGNoZWNrIGEgYnVzaW5lc3NcXCdzIGlkZW50aXR5IGFuZCByaXNrIHByb2ZpbGUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQnVzaW5lc3MgVmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtCdXNpbmVzc1ZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlKGJ1c2luZXNzVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogQnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGUoYnVzaW5lc3NWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIHNwZWNpZmljIGJ1c2luZXNzIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCdXNpbmVzcyBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0J1c2luZXNzVmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYnVzaW5lc3NWZXJpZmljYXRpb25HZXQoYnVzaW5lc3NWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBCdXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5idXNpbmVzc1ZlcmlmaWNhdGlvbkdldChidXNpbmVzc1ZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVHJhbnNhY3Rpb25zIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9jYXNoZmxvd19yZXBvcnQvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYGNhc2hmbG93X3JlcG9ydGAsIG9yIGlmIGl0IHdhc25cXCd0LCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgLiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgQ0FTSEZMT1dfUkVQT1JUX1JFQURZYCB3ZWJob29rLlxuICAgICAqIEBzdW1tYXJ5IEdldHMgdHJhbnNhY3Rpb24gZGF0YSBpbiBgY2FzaGZsb3dfcmVwb3J0YFxuICAgICAqIEBwYXJhbSB7Q2FzaGZsb3dSZXBvcnRHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXNoZmxvd1JlcG9ydEdldChjYXNoZmxvd1JlcG9ydEdldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhc2hmbG93UmVwb3J0R2V0KGNhc2hmbG93UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY2FzaGZsb3dfcmVwb3J0L2luc2lnaHRzL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIGluc2lnaHRzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIEluc2lnaHRzIGFyZSBvbmx5IGNhbGN1bGF0ZWQgb24gY3JlZGl0IGFuZCBkZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldHMgaW5zaWdodHMgZGF0YSBpbiBDYXNoZmxvdyBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0fSBjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNhc2hmbG93UmVwb3J0SW5zaWdodHNHZXQoY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldFJlcXVlc3Q6IENhc2hmbG93UmVwb3J0SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY2FzaGZsb3dSZXBvcnRJbnNpZ2h0c0dldChjYXNoZmxvd1JlcG9ydEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAgaXMgYW4gZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0gKGdpdmVuIGFuIGBpdGVtX2lkYCkuIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIENhc2hmbG93IFJlcG9ydCBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gIEFmdGVyIGNhbGxpbmcgYC9jYXNoZmxvd19yZXBvcnQvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgYWxlcnRpbmcgY2xpZW50cyB0aGF0IG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBjYW4gdGhlbiBiZSBpbmdlc3RlZCB2aWEgYC9jYXNoZmxvd19yZXBvcnQvZ2V0YCBvciB0aGUgd2ViaG9vayB3aWxsIGNvbnRhaW4gYW4gZXJyb3IgY29kZSBpbmZvcm1pbmcgdGhlcmUgd2FzIGFuIGVycm9yIGluIHJlZnJlc2hpbmcgdHJhbnNhY3Rpb25zIGRhdGEuICBOb3RlIHRoYXQgdGhlIGAvY2FzaGZsb3dfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSkuIElmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIGZvciByZXF1ZXN0cy5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGNhc2hmbG93UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXNoZmxvd1JlcG9ydFJlZnJlc2goY2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdDogQ2FzaGZsb3dSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhc2hmbG93UmVwb3J0UmVmcmVzaChjYXNoZmxvd1JlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jYXNoZmxvd19yZXBvcnQvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUcmFuc2FjdGlvbnMgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL2Nhc2hmbG93X3JlcG9ydC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgaGFzX21vcmVgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuIE5vdGUgdGhhdCBkYXRhIGlzblxcJ3QgbGlrZWx5IHRvIGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2Nhc2hmbG93X3JlcG9ydC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGBjYXNoZmxvd19yZXBvcnRgLCBvciBpZiBpdCB3YXNuXFwndCwgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL2Nhc2hmbG93X3JlcG9ydC9yZWZyZXNoYC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYENBU0hGTE9XX1JFUE9SVF9SRUFEWWAgd2ViaG9vay5cbiAgICAgKiBAc3VtbWFyeSBHZXRzIHRyYW5zYWN0aW9uIGRhdGEgaW4gYGNhc2hmbG93X3JlcG9ydGBcbiAgICAgKiBAcGFyYW0ge0Nhc2hmbG93UmVwb3J0VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXQoY2FzaGZsb3dSZXBvcnRUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBDYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldChjYXNoZmxvd1JlcG9ydFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gbGVnYWN5IGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIFt1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pIGluc3RlYWQgb2YgdGhlIGxlZ2FjeSBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBHZXQgbGVnYWN5IGNhdGVnb3JpZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNhdGVnb3JpZXNHZXQoYm9keTogb2JqZWN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgSXRlbSBjb25zZW50IGV2ZW50cy4gQ29uc2VudCBsb2dzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgZXZlbnRzIG9jY3VycmluZyBvbiBvciBhZnRlciBOb3ZlbWJlciA3LCAyMDI0LiBFeHRyZW1lbHkgcmVjZW50IGV2ZW50cyAob2NjdXJyaW5nIHdpdGhpbiB0aGUgcGFzdCAxMiBob3VycykgbWF5IG5vdCBiZSBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnQuIFVwIHRvIHRocmVlIHllYXJzIG9mIGNvbnNlbnQgbG9ncyB3aWxsIGJlIGF2YWlsYWJsZSB2aWEgdGhlIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0OiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZXhpc3RpbmcgQ1JCIEJhbmsgSW5jb21lIGFuZCBCYXNlIHJlcG9ydHMgZm9yIHRoZSBjb25zdW1lciBpbiBQREYgZm9ybWF0LiAgUmVzcG9uc2UgaXMgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBERiBSZXBvcnRzXG4gICAgICogQHBhcmFtIHtDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3R9IGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdDogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEJhc2UgUmVwb3J0IGZvciB5b3VyIHVzZXIsIGFsbG93aW5nIHlvdSB0byByZWNlaXZlIGNvbXByZWhlbnNpdmUgYmFuayBhY2NvdW50IGFuZCBjYXNoIGZsb3cgZGF0YS4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIENhc2hmbG93IEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIHRvIHJlZnJlc2ggZGF0YSBpbiBhbiBleGlzdGluZyByZXBvcnQuIEEgQ29uc3VtZXIgUmVwb3J0IHdpbGwgbGFzdCBmb3IgMjQgaG91cnMgYmVmb3JlIGV4cGlyaW5nOyB5b3Ugc2hvdWxkIGNhbGwgYW55IGAvZ2V0YCBlbmRwb2ludHMgb24gdGhlIHJlcG9ydCBiZWZvcmUgaXQgZXhwaXJlcy4gSWYgYSByZXBvcnQgZXhwaXJlcywgeW91IGNhbiBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGFnYWluIHRvIHJlLWdlbmVyYXRlIGl0IGFuZCByZWZyZXNoIHRoZSBkYXRhIGluIHRoZSByZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBvciBjcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRDcmVhdGUoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydENyZWF0ZShjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgTk9URTogVGhlIGZvbGxvd2luZyBzY2hlbWEgd2FzIHVwZGF0ZWQgaW4gQXByaWwgMjAyNiB0byByZWZsZWN0IHRoZSByZXNwb25zZSB3aGVuIHRoZSBwcm92aWRlZCB2ZXJzaW9uIGlzIFxcXCJJSTJcXFwiLiBQbGVhc2Ugc2VlIFt0aGlzIGRvY3VtZW50XShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNoZWFkaW5nPWgucnVkYW16aW51czJpKSBmb3IgZ3VpZGFuY2Ugb24gbWlncmF0aW5nIHRvIElJMiBpZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyB0aGUgSUkxIHZlcnNpb24sIGFuZCBbdGhpcyBzZWN0aW9uXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFrUWtRN0ZPZ0ZhQzRuLXNVR1VrNzRob1haTllfTF9uSmVDdU1lN0tlaXA0L2VkaXQ/dGFiPXQuMCNib29rbWFyaz1pZC50ZGNjMndwazBoNjApIGZvciBhbiBleGFtcGxlIElJMSByZXNwb25zZSBhbG9uZyB3aXRoIGl0cyBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xa1FrUTdGT2dGYUM0bi1zVUdVazc0aG9YWk5ZX0xfbkplQ3VNZTdLZWlwNC9lZGl0P3RhYj10LjM2Yzg1bjJpcmNxayNoZWFkaW5nPWguNzlkd3I1YzFpc3psKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmNvbWUgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTGVuZFNjb3JlIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBMZW5kU2NvcmUgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRMZW5kU2NvcmVHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldChjcmFDaGVja1JlcG9ydExlbmRTY29yZUdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0KGNyYUNoZWNrUmVwb3J0TGVuZFNjb3JlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIG9yIGEgYFVTRVJfQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSBwYXJ0bmVyc1xuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgIHJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnQgQ29uc3VtZXIgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJ5IGRlZmF1bHQsIHRoZSBtb3N0IHJlY2VudCBCYXNlIFJlcG9ydCAoaWYgaXQgZXhpc3RzKSBmb3IgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZC4gVG8gcmVxdWVzdCB0aGF0IHRoZSBtb3N0IHJlY2VudCBQYXJ0bmVyIEluc2lnaHRzIG9yIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIFBERiBhcyB3ZWxsLCB1c2UgdGhlIGBhZGQtb25zYCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENvbnN1bWVyIFJlcG9ydCBhcyBhIFBERlxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGhvbWUgbGVuZGluZyByZXBvcnRzIGZvciBhIHVzZXIuIFRvIG9idGFpbiBhIFZvQSBvciBFbXBsb3ltZW50IFJlZnJlc2ggcmVwb3J0LCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBgY3JhX2Jhc2VfcmVwb3J0YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIG9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdmFyaW91cyBob21lIGxlbmRpbmcgcmVwb3J0cyBmb3IgYSB1c2VyXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0KGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXQoY3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jcmEvY2hlY2tfcmVwb3J0L3ZlcmlmaWNhdGlvbi9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LCBzcGVjaWZpY2FsbHkgZm9ybWF0dGVkIGZvciBIb21lIExlbmRpbmcgdmVyaWZpY2F0aW9uIHVzZSBjYXNlcy4gQmVmb3JlIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgZW5zdXJlIHRoYXQgeW91XFwndmUgY3JlYXRlZCBhIFZPQSByZXBvcnQgdGhyb3VnaCBMaW5rIG9yIHRoZSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCwgYW5kIGhhdmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCBvciBhIGBVU0VSX0NIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vay4gIFRoZSByZXNwb25zZSB0byBgL2NyYS9jaGVja19yZXBvcnQvdmVyaWZpY2F0aW9uL3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQ29uc3VtZXIgUmVwb3J0IGFzIGEgVmVyaWZpY2F0aW9uIFBERlxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRWZXJpZmljYXRpb25QZGZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldChjcmFDaGVja1JlcG9ydFZlcmlmaWNhdGlvblBkZkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0KGNyYUNoZWNrUmVwb3J0VmVyaWZpY2F0aW9uUGRmR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvY3JlZGl0X3Byb2ZpbGUvcmVwb3J0L2dldGAgcmV0cmlldmVzIGEgY3JlZGl0IHByb2ZpbGUgcmVwb3J0IGZvciBhIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGNyZWRpdCBwcm9maWxlIHJlcG9ydCBmb3IgYSB1c2VyXG4gICAgICogQHBhcmFtIHtDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0KGNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDcmVkaXRQcm9maWxlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNyZWRpdFByb2ZpbGVSZXBvcnRHZXQoY3JhQ3JlZGl0UHJvZmlsZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9uc1xuICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzXG4gICAgICogQHBhcmFtIHtDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdH0gY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0OiBDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2xvYW5zL3VucmVnaXN0ZXJgIGluZGljYXRlcyB0aGUgbG9hbnMgaGF2ZSByZWFjaGVkIGEgZmluYWwgc3RhdHVzIGFuZCBubyBmdXJ0aGVyIHVwZGF0ZXMgYXJlIGV4cGVjdGVkLlxuICAgICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zXG4gICAgICogQHBhcmFtIHtDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvdXBkYXRlYCB1cGRhdGVzIGxvYW4gaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzIGFuZCBwYXltZW50IGhpc3RvcnkuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGxvYW4gZGF0YVxuICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVcGRhdGVSZXF1ZXN0fSBjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3Q6IENyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGEgQ2FzaCBGbG93IFVwZGF0ZXMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX2lkYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbGlua2VkIENSQSBJdGVtLCB3aGljaCBhcmUgdXBkYXRlZCBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5IChiZXN0LWVmZm9ydCkuIEluIHRoZSBjdXJyZW50IENhc2ggRmxvdyBVcGRhdGVzIGJldGEgZXhwZXJpZW5jZSwgb25seSBvbmUgSXRlbSBwZXIgdXNlciBtYXkgYmUgc3Vic2NyaWJlZCBmb3IgbW9uaXRvcmluZyB1cGRhdGVzLlxuICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAgcmV0dXJucyBjYXNoIGZsb3cgaW5zaWdodHMgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhUGFydG5lckluc2lnaHRzR2V0KGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL3JlcG9ydC9nZXRgIHJldHJpZXZlcyBhIENSQSBSZXBvcnQgZm9yIGEgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIENSQSBSZXBvcnQgZm9yIHByb3ZpZGVkIHVzZXJcbiAgICAgKiBAcGFyYW0ge0NyYVJlcG9ydEdldFJlcXVlc3R9IGNyYVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFSZXBvcnRHZXQoY3JhUmVwb3J0R2V0UmVxdWVzdDogQ3JhUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYVJlcG9ydEdldChjcmFSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIGNyZWF0ZSBhbiBBdWRpdCBDb3B5IHRva2VuIG9mIGFuIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCB0byBzaGFyZSB3aXRoIGEgcGFydGljaXBhdGluZyBHb3Zlcm5tZW50LVNwb25zb3JlZCBFbnRlcnByaXNlIChHU0UpIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiBGYW5uaWUgTWFlXFwncyBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSBvciB1dGlsaXplIEZyZWRkaWUgTWFjXFwncyBMb2FuIFByb2R1Y3QgQWR2aXNvcsKuIChMUEHCrikgQXNzZXQgYW5kIEluY29tZSBNb2RlbGVyIChBSU0pLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nIEF1ZGl0IENvcHkgVG9rZW4gYnkgYWRkaW5nIHRoZSByZXBvcnQgdG9rZW5zIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQgdG8gdGhlIGBhdWRpdF9jb3B5X3Rva2VuYC4gSWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gYWxyZWFkeSBjb250YWlucyBhIHJlcG9ydCBvZiBhIGNlcnRhaW4gdHlwZSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b2tlbiBwcm92aWRlZCBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgYSBzcGVjaWZpZWQgdXNlciBpbiBQREYgZm9ybWF0LiAgQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgaXMgZGVwcmVjYXRlZC4gVGhlIGJhY2tlbmQgaW1wbGVtZW50YXRpb24gd2FzIHJlbW92ZWQgKHJldHVybnMgYW4gYFVuaW1wbGVtZW50ZWRgIGVycm9yIGF0IHJ1bnRpbWUpLCBhbmQgdGhlIGVuZHBvaW50IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudGVkIEFQSSBzdXJmYWNlLiBUbyByZWZyZXNoIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGV4aXN0aW5nIHVzZXIsIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rXFwncyB1cGRhdGUgbW9kZSBzbyB0aGV5IGNhbiBjb25maXJtIHRoZWlyIGluY29tZSBzb3VyY2VzLiBGb3IgYSBmdWxseSBiYWNrZW5kIHJlZnJlc2gsIG1pZ3JhdGUgdG8gQ1JBIEluY29tZSBJbnNpZ2h0cyBhbmQgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIFBERiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgUERGIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3R9IGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhYm91dCBhIHNwZWNpZmljIERhc2hib2FyZCB1c2VyIGJhc2VkIG9uIHRoZSBgZGFzaGJvYXJkX3VzZXJfaWRgIGZpZWxkLCB3aGljaCBpcyByZXR1cm5lZCBpbiB0aGUgYGF1ZGl0X3RyYWlsYCBvYmplY3Qgb2YgY2VydGFpbiBNb25pdG9yIGFuZCBCZWFjb24gZW5kcG9pbnRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyByZXZpZXdlciB3aG8gcGVyZm9ybWVkIGEgRGFzaGJvYXJkIGFjdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIERhc2hib2FyZCB1c2VyXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF1ZGl0IG9yIHRyYWNrIHRoZSBsaXN0IG9mIHJldmlld2VycyBmb3IgTW9uaXRvciwgQmVhY29uLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3RzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgRGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlkXFwncyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvbnNlbnQgZ3JhbnQgYnkgaXRzIGlkZW50aWZpZXJcbiAgICAgKiBAc3VtbWFyeSBHZXQgRkRYIENvbnNlbnQgR3JhbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Q29uc2VudHNHZXQoY29uc2VudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZHhDb25zZW50c0dldChjb25zZW50SWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgemVybyBvciBtb3JlIGNvbnNlbnQgZ3JhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGF0YSBwcm92aWRlciBjdXN0b21lciwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdGF0dXMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBGRFggQ29uc2VudCBHcmFudHMgZm9yIGEgY3VzdG9tZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tZXJJZCBEYXRhIHByb3ZpZGVyIGN1c3RvbWVyIGlkZW50aWZpZXIgd2hvc2UgY29uc2VudCBncmFudHMgdG8gcmV0dXJuLlxuICAgICAqIEBwYXJhbSB7RkRYQ29uc2VudEdyYW50U3RhdHVzfSBbc3RhdHVzXSBPcHRpb25hbCBmaWx0ZXIgcmVzdHJpY3RpbmcgcmVzdWx0cyB0byBhIHNpbmdsZSBjb25zZW50IGdyYW50IHN0YXR1cy4gT25lIG9mICYjeDYwO0FDVElWRSYjeDYwOywgJiN4NjA7UkVWT0tFRCYjeDYwOywgJiN4NjA7RVhQSVJFRCYjeDYwOy5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGZkeENvbnNlbnRzTGlzdChjdXN0b21lcklkOiBzdHJpbmcsIHN0YXR1cz86IEZEWENvbnNlbnRHcmFudFN0YXR1cywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeENvbnNlbnRzTGlzdChjdXN0b21lcklkLCBzdGF0dXMsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJldm9jYXRpb24gaGlzdG9yeSBvZiBhIGNvbnNlbnQgZ3JhbnRcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBGRFggQ29uc2VudCBHcmFudCByZXZvY2F0aW9uIHJlY29yZHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uc2VudElkIENvbnNlbnQgR3JhbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc2VudCBncmFudFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Q29uc2VudHNSZXZvY2F0aW9uR2V0KGNvbnNlbnRJZDogc3RyaW5nLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmR4Q29uc2VudHNSZXZvY2F0aW9uR2V0KGNvbnNlbnRJZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIFJFVk9LRUQgc3RhdHVzIHJlY29yZCB0byB0aGUgbmFtZWQgY29uc2VudCBncmFudFxuICAgICAqIEBzdW1tYXJ5IFJldm9rZSBGRFggQ29uc2VudCBHcmFudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25zZW50SWQgQ29uc2VudCBHcmFudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBjb25zZW50IGdyYW50XG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBmZHhDb25zZW50c1Jldm9rZShjb25zZW50SWQ6IHN0cmluZywgcmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmR4Q29uc2VudHNSZXZva2UoY29uc2VudElkLCByZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudElkIFJlY2lwaWVudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5nZXRSZWNpcGllbnQocmVjaXBpZW50SWQsIG9BVVRIU1RBVEVJRCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRzXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSZWNpcGllbnRzKG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5nZXRSZWNpcGllbnRzKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgdG8gcmV0cmlldmUgaWRlbnRpdHkgZGV0YWlscyB3aGVuIHVzaW5nIFtJZGVudGl0eSBEb2N1bWVudCBVcGxvYWRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvaWRlbnRpdHktZG9jdW1lbnQtdXBsb2FkLykuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIG9yIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGZvciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgYW5kL29yIGB1c2VyX2lkYCBmaWVsZC4gQXQgbGVhc3Qgb25lIG9mIHRoZXNlIHR3byBmaWVsZHMgbXVzdCBiZSBwcm92aWRlZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgYHVzZXJfaWRgIGlzIHByb3ZpZGVkLCB0aGVyZSBtdXN0IGJlIGFuIGFzc29jaWF0ZWQgdXNlcjsgb3RoZXJ3aXNlLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGV4aXN0cyBmb3IgYSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgIGFuZC9vciBgdXNlcl9pZGAsIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQvb3IgYHVzZXJfaWRgLCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICAgSWYgYHVzZXJfaWRgIGlzIG5vdCBwcm92aWRlZCwgeW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIElmIGB1c2VyX2lkYCBpcyBwcm92aWRlZCwgdXNlciBpbmZvcm1hdGlvbiBjYW4gbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuIFBsZWFzZSB1c2UgdGhlIGAvdXNlci91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB1c2VyIGRhdGEgaW5zdGVhZC4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvblxcJ3MgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnRcXCdzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGludmVzdG1lbnQgZGF0YVxuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0OiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAqIEBzdW1tYXJ5IEdldCBhbiBJc3N1ZVxuICAgICAqIEBwYXJhbSB7SXNzdWVzR2V0UmVxdWVzdH0gaXNzdWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0OiBJc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgYW4gaXNzdWUgYXNzb2NpYXRlZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOiAgYGl0ZW1faWRgLCBgbGlua19zZXNzaW9uX2lkYCBvciBMaW5rIHNlc3Npb24gYHJlcXVlc3RfaWRgLiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTZWFyY2hSZXF1ZXN0fSBpc3N1ZXNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU2VhcmNoKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXJcXCdzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIGEgdXNlclxcJ3MgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9uXFwncyBhY2Nlc3MgdG8gdGhlIFVzZXJcXCdzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2VyXFwncyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIHB1YmxpYyB0b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUdldChpdGVtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHRlcm1pbmF0ZSBhbiBJdGVtLiBPbmNlIHRlcm1pbmF0ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaXMgbm8gbG9uZ2VyIHZhbGlkLCBiaWxsaW5nIGZvciB0aGUgSXRlbVxcJ3MgcHJvZHVjdHMgaXMgZW5kZWQsIGFuZCByZWxldmFudCB3ZWJob29rcyBhcmUgZmlyZWQuICBgL2l0ZW0vcHJvZHVjdHMvdGVybWluYXRlYCBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIG9mZmJvYXJkIHVzZXJzIG9yIGRpc2Nvbm5lY3QgYWNjb3VudHMgbGlua2VkIHZpYSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBUZXJtaW5hdGUgcHJvZHVjdHMgZm9yIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3R9IGl0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtUHJvZHVjdHNUZXJtaW5hdGUoaXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdDogSXRlbVByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1Qcm9kdWN0c1Rlcm1pbmF0ZShpdGVtUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgQ2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyBhIHJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2Ugd2hlbiBvZmZib2FyZGluZyB1c2VycyBvciBpZiBhIHVzZXIgY2hvb3NlcyB0byBkaXNjb25uZWN0IGFuIGFjY291bnQgbGlua2VkIHZpYSBQbGFpZC4gRm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cywgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIExpYWJpbGl0aWVzLCBhbmQgSW52ZXN0bWVudHMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgcmVxdWlyZWQgdG8gZW5kIHN1YnNjcmlwdGlvbiBiaWxsaW5nIGZvciB0aGUgSXRlbSwgdW5sZXNzIHRoZSBlbmQgdXNlciByZXZva2VkIHBlcm1pc3Npb24gKGUuZy4gdmlhIFtodHRwczovL215LnBsYWlkLmNvbS9dKGh0dHBzOi8vbXkucGxhaWQuY29tLykpLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1N1YnNjcmlwdGlvbiBmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNzdWJzY3JpcHRpb24tZmVlKS4gIE9uIGEgVHJpYWwgcGxhbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgVHJpYWwgSXRlbXMgKGJhbmsgY29ubmVjdGlvbnMpIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIGBwYXltZW50X2luaXRpYXRpb25gIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIGBsaW5rX3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJRCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAgQnkgZGVmYXVsdCwgdGhpcyBlbmRwb2ludCB3aWxsIG9ubHkgcmV0dXJuIGNvbXBsZXRlIGV2ZW50IGRhdGEgZm9yIEhvc3RlZCBMaW5rIHNlc3Npb25zLiBUbyB1c2UgYC9saW5rL3Rva2VuL2dldGAgdG8gcmV0cmlldmUgZXZlbnQgZGF0YSBmb3Igbm9uLUhvc3RlZC1MaW5rIHNlc3Npb25zLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgdGhhdCB5b3VyIGFjY291bnQgYmUgZW5hYmxlZCBmb3IgTGluayBldmVudHMuIElmIHlvdSBkbyBub3QgaGF2ZSBhbiBhY2NvdW50IG1hbmFnZXIsIHlvdSBjYW4gc3VibWl0IHRoaXMgcmVxdWVzdCB2aWEgYSBzdXBwb3J0IHRpY2tldC4gRW5hYmxlbWVudCBmb3IgTGluayBldmVudHMgd2lsbCBhbHNvIGNhdXNlIHlvdSB0byByZWNlaXZlIGFkZGl0aW9uYWwgd2ViaG9va3MgcmVsYXRlZCB0byBMaW5rIGV2ZW50cywgc3VjaCBhcyB0aGUgYFNFU1NJT05fRklOSVNIRURgIGFuZCBgRVZFTlRTYCB3ZWJob29rLlxuICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSB1c2VyIGlzIGVsaWdpYmxlIGZvciBhIHN0cmVhbWxpbmVkIGV4cGVyaWVuY2UsIHN1Y2ggYXMgTGF5ZXIuIFRvIGFjY2VzcyB0aGlzIGVuZHBvaW50LCBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGEgdXNlclxcJ3MgUGxhaWQgTmV0d29yayBzdGF0dXNcbiAgICAgKiBAcGFyYW0ge05ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIG5ldHdvcmtTdGF0dXNHZXQobmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9vYXV0aC9pbnRyb3NwZWN0YCByZXR1cm5zIG1ldGFkYXRhIGFib3V0IGFuIGFjY2VzcyB0b2tlbiBvciByZWZyZXNoIHRva2VuLiAgTm90ZTogVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGFzIHdlbGwgYXMgSlNPTi4gVGhlIGZpZWxkcyBmb3IgdGhlIGZvcm0gYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZpZWxkcyBmb3IgSlNPTiBhbmQgY29uZm9ybSB0byB0aGUgT0F1dGggMi4wIHNwZWNpZmljYXRpb24uXG4gICAgICogQHN1bW1hcnkgR2V0IG1ldGFkYXRhIGFib3V0IGFuIE9BdXRoIHRva2VuXG4gICAgICogQHBhcmFtIHtPQXV0aEludHJvc3BlY3RSZXF1ZXN0fSBvQXV0aEludHJvc3BlY3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgb2F1dGhJbnRyb3NwZWN0KG9BdXRoSW50cm9zcGVjdFJlcXVlc3Q6IE9BdXRoSW50cm9zcGVjdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5vYXV0aEludHJvc3BlY3Qob0F1dGhJbnRyb3NwZWN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9vYXV0aC9yZXZva2VgIHJldm9rZXMgYW4gYWNjZXNzIG9yIHJlZnJlc2ggdG9rZW4sIHByZXZlbnRpbmcgYW55IGZ1cnRoZXIgdXNlLiBJZiBhIHJlZnJlc2ggdG9rZW4gaXMgcmV2b2tlZCwgYWxsIGFjY2VzcyBhbmQgcmVmcmVzaCB0b2tlbnMgZGVyaXZlZCBmcm9tIGl0IGFyZSBhbHNvIHJldm9rZWQsIGluY2x1ZGluZyBleGNoYW5nZWQgdG9rZW5zLiAgTm90ZTogVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGFzIHdlbGwgYXMgSlNPTi4gVGhlIGZpZWxkcyBmb3IgdGhlIGZvcm0gYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZpZWxkcyBmb3IgSlNPTiBhbmQgY29uZm9ybSB0byB0aGUgT0F1dGggMi4wIHNwZWNpZmljYXRpb24uXG4gICAgICogQHN1bW1hcnkgUmV2b2tlIGFuIE9BdXRoIHRva2VuXG4gICAgICogQHBhcmFtIHtPQXV0aFJldm9rZVJlcXVlc3R9IG9BdXRoUmV2b2tlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIG9hdXRoUmV2b2tlKG9BdXRoUmV2b2tlUmVxdWVzdDogT0F1dGhSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikub2F1dGhSZXZva2Uob0F1dGhSZXZva2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL29hdXRoL3Rva2VuYCBpc3N1ZXMgYW4gYWNjZXNzIHRva2VuIGFuZCByZWZyZXNoIHRva2VuIGRlcGVuZGluZyBvbiB0aGUgYGdyYW50X3R5cGVgIHByb3ZpZGVkLiBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgYXMgd2VsbCBhcyBKU09OLiBUaGUgZmllbGRzIGZvciB0aGUgZm9ybSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZmllbGRzIGZvciBKU09OIGFuZCBjb25mb3JtIHRvIHRoZSBPQXV0aCAyLjAgc3BlY2lmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgb3IgcmVmcmVzaCBhbiBPQXV0aCBhY2Nlc3MgdG9rZW5cbiAgICAgKiBAcGFyYW0ge09BdXRoVG9rZW5SZXF1ZXN0fSBvQXV0aFRva2VuUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIG9hdXRoVG9rZW4ob0F1dGhUb2tlblJlcXVlc3Q6IE9BdXRoVG9rZW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikub2F1dGhUb2tlbihvQXV0aFRva2VuUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgZnVsbCBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIGRhdGEgYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZW5kIGN1c3RvbWVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIEVVUiwgR0JQLCBvciBhbm90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCYWNzIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW50XFwncyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLiAgUG9sbGluZyBmb3Igc3RhdHVzIHVwZGF0ZXMgaW4gUHJvZHVjdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQuIFJlcGVhdGVkbHkgY2FsbGluZyBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgdG8gY2hlY2sgYSBwYXltZW50XFwncyBzdGF0dXMgaXMgdW5yZWxpYWJsZSBhbmQgbWF5IHRyaWdnZXIgQVBJIHJhdGUgbGltaXRzLiBPbmx5IHRoZSBgcGF5bWVudF9zdGF0dXNfdXBkYXRlYCB3ZWJob29rIHNob3VsZCBiZSB1c2VkIHRvIHJlY2VpdmUgcmVhbC10aW1lIHN0YXR1cyB1cGRhdGVzIGluIFByb2R1Y3Rpb24uXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50cyBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vc3VwcG9ydC5wbGFpZC5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjc4OTU4MjY5NDc3MzUtV2hhdC1QbGFpZC1wcm9kdWN0cy1hcmUtc3VwcG9ydGVkLWluLWVhY2gtY291bnRyeS1hbmQtcmVnaW9uKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0cyB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdFxcJ3MgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIGJhbGFuY2UgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgYXV0aG9yaXplZCBieSBhIHByb2Nlc3NvciB0b2tlbiwgaW5jbHVkaW5nIGFjY291bnQgbnVtYmVycywgYWNjb3VudCBvd25lcnMsIGhvbGRpbmdzLCBhbmQgZGF0YSBwcm92ZW5hbmNlIGluZm9ybWF0aW9uLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBBdXRoIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC4gXG4gICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgYWNjb3VudCBhdXRoZW50aWNhdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0KHByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJbnZlc3RtZW50c0F1dGhHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBzdG9jayBwb3NpdGlvbiBkYXRhIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgSW52ZXN0bWVudCBIb2xkaW5nc1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgaW52ZXN0bWVudCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIEludmVzdG1lbnRzIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgeW91IGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgUGxhaWQgd2lsbCBub3JtYWxseSBpbmZlciB0aGUgb3V0Y29tZSBmcm9tIHlvdXIgU2lnbmFsIFJ1bGVzLiBIb3dldmVyLCBpZiB5b3UgYXJlIG5vdCB1c2luZyBTaWduYWwgUnVsZXMsIGlmIHRoZSBTaWduYWwgUnVsZXMgb3V0Y29tZSB3YXMgYFJFVklFV2AsIG9yIGlmIHlvdSB0YWtlIGEgZGlmZmVyZW50IGFjdGlvbiB0aGFuIHRoZSBvbmUgZGV0ZXJtaW5lZCBieSB0aGUgU2lnbmFsIFJ1bGVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAuIFRoaXMgaGVscHMgaW1wcm92ZSBTaWduYWwgVHJhbnNhY3Rpb24gU2NvcmUgYWNjdXJhY3kgZm9yIHlvdXIgYWNjb3VudCBhbmQgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgdGhlIHJ1bGUgcGVyZm9ybWFuY2UgYW5kIHJ1bGUgdHVuaW5nIGNhcGFiaWxpdGllcyBpbiB0aGUgRGFzaGJvYXJkLiBJZiB5b3VyIGVmZmVjdGl2ZSBkZWNpc2lvbiBjaGFuZ2VzIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgYWdhaW4gZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBjb3JyZWN0IFBsYWlkXFwncyByZWNvcmRzLiAgSWYgeW91IGFyZSB1c2luZyBQbGFpZCBUcmFuc2ZlciBhcyB5b3VyIHBheW1lbnQgcHJvY2Vzc29yLCB5b3UgYWxzbyBkbyBub3QgbmVlZCB0byBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLCBhcyBQbGFpZCBjYW4gaW5mZXIgb3V0Y29tZXMgZnJvbSB5b3VyIFRyYW5zZmVyIGFjdGl2aXR5LiAgSWYgdXNpbmcgYSBCYWxhbmNlLW9ubHkgcnVsZXNldCwgdGhpcyBlbmRwb2ludCB3aWxsIG5vdCBpbXBhY3Qgc2NvcmVzIChCYWxhbmNlIGRvZXMgbm90IHVzZSBzY29yZXMpLCBidXQgaXMgbmVjZXNzYXJ5IHRvIHZpZXcgYWNjdXJhdGUgdHJhbnNhY3Rpb24gb3V0Y29tZXMgYW5kIHR1bmUgcnVsZSBsb2dpYyBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB1c2VzIFJ1bGVzZXRzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlIGVuZCBjdXN0b21lclxcJ3MgRGFzaGJvYXJkIGFuZCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBwcm9kdWN0IG9yIHRoZSBCYWxhbmNlIHByb2R1Y3QuIFdoaWNoIHByb2R1Y3QgaXMgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGBydWxlc2V0X2tleWAgdGhhdCB5b3UgcHJvdmlkZS4gTm90ZSB0aGF0IG9ubHkgY3VzdG9tZXItY29uZmlndXJlZCBydWxlc2V0cyB3b3JrIHdpdGggdGhpcyBlbmRwb2ludDsgYXMgYSBwcm9jZXNzb3IgcGFydG5lciwgeW91IGNhbm5vdCBjcmVhdGUgb3IgY29uZmlndXJlIHlvdXIgb3duIHJ1bGVzZXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IGhhdmUgaGlnaGVyIGxhdGVuY3kgaWYgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlcyBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtIGZvciB0aGUgZmlyc3QgdGltZSwgb3Igd2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXF1ZXN0IGRhdGEuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgc2lnbmFsYCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2FuIGJlIG1vZGlmaWVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YC4gVG8gcmV2b2tlIHRoZSBwcm9jZXNzb3JcXCdzIGFjY2VzcywgdGhlIGVudGlyZSBJdGVtIG11c3QgYmUgZGVsZXRlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzIG9uIHRoZSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIEJ5IGRlZmF1bHQsIGEgcHJvY2Vzc29yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cyBvbiB0aGUgY29ycmVzcG9uZGluZyBpdGVtLiBUbyByZXN0cmljdCBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggdGhlIGRlc2lyZWQgcHJvZHVjdHMuIFRvIHJlc3RvcmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIGFuIGVtcHR5IGxpc3QuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB5b3VyIG5lZWRzIGFuZCB5b3VyIHByb2Nlc3NvclxcJ3MgbmVlZHMgY2hhbmdlLlxuICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2VyXFwncyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nLiBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvZmlsZS9uZXR3b3JrX3N0YXR1cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgUGxhaWQgaGFzIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgdGhlIHVzZXIuXG4gICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0KHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBhIFByb3RlY3QgVHJ1c3QgSW5kZXggc2NvcmUgZm9yIGEgdXNlci4gVGhlIG1vZGVsIHNlbGVjdGVkIGRldGVybWluZXMgd2hhdCBpcyBzY29yZWQgYW5kIHdoYXQgYWRkaXRpb25hbCBmaWVsZHMgdGhlIHJlc3BvbnNlIGNvbnRhaW5zLiBGb3IgZXhhbXBsZSwgYHRpLWxpbmstc2Vzc2lvbi0yLjBgIHNjb3JlcyBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24gZm9yIGZyYXVkIHJpc2s7IGBjYXNoLWFkdmFuY2Utb25ib2FyZGluZy0xLjBgIHNjb3JlcyByZXBheW1lbnQgcmlzayBmb3IgYSBmaXJzdC10aW1lIGNhc2ggYWR2YW5jZSBhbmQgYWRkaXRpb25hbGx5IHBvcHVsYXRlcyBwZXItYW1vdW50LWJ1Y2tldCBzdWJzY29yZXMuIENhc2gtYWR2YW5jZSBtb2RlbHMgcmVxdWlyZSB0aGF0IHRoZSB1c2VyIGhhdmUgYSBQbGFpZCBJdGVtIHdpdGggVHJhbnNhY3Rpb25zIGVuYWJsZWQsIG9yIGFuIEFzc2V0cyBSZXBvcnQsIGJlZm9yZSBzY29yaW5nLiAgVGhlIGVuZHBvaW50IHJldHVybnMgSFRUUCA0MDAgd2l0aCBgZXJyb3JfdHlwZWAgPSBgSU5WQUxJRF9SRVFVRVNUYCBhbmQgYGVycm9yX2NvZGVgID0gYEZBSUxFRF9QUkVDT05ESVRJT05gIHdoZW4gYSByZXF1aXJlZCBwcmVjb25kaXRpb24gaXMgbm90IG1ldDogZm9yIGxpbmstc2Vzc2lvbiBtb2RlbHMsIHdoZW4gdGhlIExpbmsgc2Vzc2lvbiBoYXMgbm90IGNvbXBsZXRlZDsgZm9yIGNhc2gtYWR2YW5jZSBtb2RlbHMsIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCBzdWNjZXNzZnVsbHkgbGlua2VkIGFueSBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IENvbXB1dGUgUHJvdGVjdCBUcnVzdCBJbmRleCBzY29yZXMgYW5kIHN1YnNjb3Jlc1xuICAgICAqIEBwYXJhbSB7UHJvdGVjdENvbXB1dGVSZXF1ZXN0fSBwcm90ZWN0Q29tcHV0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm90ZWN0Q29tcHV0ZShwcm90ZWN0Q29tcHV0ZVJlcXVlc3Q6IFByb3RlY3RDb21wdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb3RlY3RDb21wdXRlKHByb3RlY3RDb21wdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBldmVudCBpbmNsdWRpbmcgVHJ1c3QgSW5kZXggc2NvcmUgYW5kIGZyYXVkIGF0dHJpYnV0ZXMuXG4gICAgICogQHN1bW1hcnkgR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBldmVudFxuICAgICAqIEBwYXJhbSB7UHJvdGVjdEV2ZW50R2V0UmVxdWVzdH0gcHJvdGVjdEV2ZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb3RlY3RFdmVudEdldChwcm90ZWN0RXZlbnRHZXRSZXF1ZXN0OiBQcm90ZWN0RXZlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvdGVjdEV2ZW50R2V0KHByb3RlY3RFdmVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YSBhbmQgb3B0aW9uYWxseSBnZXQgYSBUcnVzdCBJbmRleCBzY29yZSBmb3IgdGhlIGV2ZW50LlxuICAgICAqIEBzdW1tYXJ5IFNlbmQgYSBuZXcgZXZlbnQgdG8gZW5yaWNoIHVzZXIgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvdGVjdEV2ZW50U2VuZFJlcXVlc3R9IHByb3RlY3RFdmVudFNlbmRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvdGVjdEV2ZW50U2VuZChwcm90ZWN0RXZlbnRTZW5kUmVxdWVzdDogUHJvdGVjdEV2ZW50U2VuZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm90ZWN0RXZlbnRTZW5kKHByb3RlY3RFdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBjcmVhdGUgYSBQcm90ZWN0IHJlcG9ydCB0byBkb2N1bWVudCBmcmF1ZCBpbmNpZGVudHMsIGludmVzdGlnYXRpb24gb3V0Y29tZXMsIG9yIG90aGVyIHJpc2sgZXZlbnRzLiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVwb3J0IHZhcmlvdXMgdHlwZXMgb2YgaW5jaWRlbnRzIGluY2x1ZGluZyBhY2NvdW50IHRha2VvdmVycywgaWRlbnRpdHkgZnJhdWQsIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMsIGFuZCBvdGhlciBzZWN1cml0eSBldmVudHMuIFRoZSByZXBvcnRlZCBkYXRhIGhlbHBzIGltcHJvdmUgZnJhdWQgZGV0ZWN0aW9uIG1vZGVscyBhbmQgcHJvdmlkZXMgdmFsdWFibGUgZmVlZGJhY2sgdG8gZW5oYW5jZSB0aGUgb3ZlcmFsbCBzZWN1cml0eSBvZiB0aGUgUGxhaWQgbmV0d29yay4gUmVwb3J0cyBjYW4gYmUgY3JlYXRlZCBmb3IgY29uZmlybWVkIGluY2lkZW50cyB0aGF0IGhhdmUgYmVlbiBmdWxseSBpbnZlc3RpZ2F0ZWQsIG9yIGZvciBzdXNwZWN0ZWQgaW5jaWRlbnRzIHRoYXQgcmVxdWlyZSBmdXJ0aGVyIHJldmlldy4gWW91IGNhbiBhc3NvY2lhdGUgcmVwb3J0cyB3aXRoIHNwZWNpZmljIHVzZXJzLCBzZXNzaW9ucywgb3IgdHJhbnNhY3Rpb25zIHRvIHByb3ZpZGUgY29tcHJlaGVuc2l2ZSBjb250ZXh0IGFib3V0IHRoZSBpbmNpZGVudC4gRWFjaCByZXBvcnQgbXVzdCBpbmNsdWRlIGB1c2VyX2lkYCwgb3IgYW4gYGluY2lkZW50X2V2ZW50YCB3aXRoIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgaWRlbnRpZmllcjogYGxpbmtfc2Vzc2lvbl9pZGAsIGBpZHZfc2Vzc2lvbl9pZGAsIGBwcm90ZWN0X2V2ZW50X2lkYCwgYHNpZ25hbF9jbGllbnRfdHJhbnNhY3Rpb25faWRgLCBvciBgYWNjZXNzX3Rva2VuYC4gQ29udGV4dCBmaWVsZHMgc3VjaCBhcyBgaW50ZXJuYWxfcmVmZXJlbmNlYCwgYHRpbWVgLCBgYW1vdW50YCwgYW5kIGBiYW5rX2FjY291bnRgIGRvIG5vdCBzYXRpc2Z5IHRoaXMgaWRlbnRpZmllciByZXF1aXJlbWVudC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBQcm90ZWN0IHJlcG9ydFxuICAgICAqIEBwYXJhbSB7UHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3R9IHByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvdGVjdFJlcG9ydENyZWF0ZShwcm90ZWN0UmVwb3J0Q3JlYXRlUmVxdWVzdDogUHJvdGVjdFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm90ZWN0UmVwb3J0Q3JlYXRlKHByb3RlY3RSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBnZXQgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGFzIGl0IHJlbGF0ZXMgdG8gdGhlaXIgZnJhdWQgcHJvZmlsZSB3aXRoIFByb3RlY3QuXG4gICAgICogQHN1bW1hcnkgR2V0IFByb3RlY3QgdXNlciBpbnNpZ2h0c1xuICAgICAqIEBwYXJhbSB7UHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvdGVjdFVzZXJJbnNpZ2h0c0dldChwcm90ZWN0VXNlckluc2lnaHRzR2V0UmVxdWVzdDogUHJvdGVjdFVzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm90ZWN0VXNlckluc2lnaHRzR2V0KHByb3RlY3RVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBNYW51YWxseSBmaXJlIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2ggRmxvdyBVcGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIGFuIHVwZGF0ZSBmb3IgQ2FzaCBGbG93IFVwZGF0ZXNcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0fSBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Q6IFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L2ZkeC9jb25zZW50L3NlZWRgIGNyZWF0ZXMgYSB0ZXN0IEZEWCBjb25zZW50IGdyYW50IChhbmQgYSBiYWNraW5nIEl0ZW0pIGZvciBhIGRhdGEgcHJvdmlkZXJcXCdzIGN1c3RvbWVyIGluIFNhbmRib3gsIHNvIHRoZSBGRFggQ29uc2VudCBBUEkgZW5kcG9pbnRzIGNhbiBiZSBleGVyY2lzZWQgZW5kLXRvLWVuZCB3aXRob3V0IGEgbGl2ZSBkYXRhIHByb3ZpZGVyIGNvbm5lY3Rpb24uICBgY3VzdG9tZXJfaWRgIGlzIHRoZSBkYXRhIHByb3ZpZGVyXFwncyBpZGVudGlmaWVyIGZvciB0aGUgZW5kIHVzZXIgYW5kIGBhcHBsaWNhdGlvbl9pZGAgaWRlbnRpZmllcyB0aGUgZGF0YSByZWNpcGllbnQgYXBwbGljYXRpb24gdGhlIGNvbnNlbnQgaXMgZ3JhbnRlZCB0bzsgYm90aCBhcmUgcmVxdWlyZWQuIE9wdGlvbmFsbHkgcHJvdmlkZSBgY29uc2VudF9pZGAgKGEgVVVJRHY0KSB0byBjb250cm9sIHRoZSBzZWVkZWQgZ3JhbnRcXCdzIGlkZW50aWZpZXI7IG9uZSBpcyBnZW5lcmF0ZWQgd2hlbiBvbWl0dGVkLiBUaGUgc2VlZGVkIGdyYW50IGlzIHJldHVybmVkIGJ5IGAvZmR4L2NvbnNlbnRzYCBhbmQgYC9mZHgvY29uc2VudHMve2NvbnNlbnRJZH1gLCBhbmQgY2FuIGJlIHJldm9rZWQgdmlhIGAvZmR4L2NvbnNlbnRzL3tjb25zZW50SWR9L3Jldm9jYXRpb25gLlxuICAgICAqIEBzdW1tYXJ5IFNlZWQgYW4gRkRYIGNvbnNlbnQgZ3JhbnQgZm9yIGEgc2FuZGJveCBkYXRhIHBhcnRuZXJcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3R9IHNhbmRib3hGZHhDb25zZW50U2VlZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94RmR4Q29uc2VudFNlZWQoc2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdDogU2FuZGJveEZkeENvbnNlbnRTZWVkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hGZHhDb25zZW50U2VlZChzYW5kYm94RmR4Q29uc2VudFNlZWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L2l0ZW0vYXBwbGljYXRpb24vc2VlZGAgY3JlYXRlcyBhIHRlc3QgY29ubmVjdGVkIGFwcGxpY2F0aW9uIG9uIGFuIGV4aXN0aW5nIFBlcm1pc3Npb25zIE1hbmFnZXIgSXRlbVxcJ3MgbG9naW4uIFRoZSBzZWVkZWQgYXBwbGljYXRpb24gd2lsbCBhcHBlYXIgaW4gc3Vic2VxdWVudCBjYWxscyB0byBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGAuICBUaGUgYGFjY2Vzc190b2tlbmAgbXVzdCBiZWxvbmcgdG8gYSBQZXJtaXNzaW9ucyBNYW5hZ2VyIEl0ZW0gY3JlYXRlZCB2aWEgYC9pdGVtL2ltcG9ydGAgaW4gU2FuZGJveC4gVGhlIGBhcHBsaWNhdGlvbl9pZGAgaWRlbnRpZmllcyB0aGUgYXBwbGljYXRpb24gdG8gc2VlZCBhcyBhIGNvbm5lY3RlZCBhcHAuIFRvIGRpc2Nvbm5lY3QgYSBzZWVkZWQgYXBwbGljYXRpb24sIHVzZSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYC5cbiAgICAgKiBAc3VtbWFyeSBTZWVkIGEgY29ubmVjdGVkIGFwcGxpY2F0aW9uIGZvciBhIFBlcm1pc3Npb25zIE1hbmFnZXIgc2FuZGJveCBpdGVtXG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUFwcGxpY2F0aW9uU2VlZFJlcXVlc3R9IHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkKHNhbmRib3hJdGVtQXBwbGljYXRpb25TZWVkUmVxdWVzdDogU2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWQoc2FuZGJveEl0ZW1BcHBsaWNhdGlvblNlZWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBzaW11bGF0aW5nIGEgZGVmYXVsdCB1cGRhdGUgZXZlbnQgZm9yIHRoZSByZXNwZWN0aXZlIHByb2R1Y3QgYXMgc3BlY2lmaWVkIHdpdGggdGhlIGB3ZWJob29rX3R5cGVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFZhbGlkIFNhbmRib3ggYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHR5cGVzIGluY2x1ZGU6IGBBVVRIYCwgYElERU5USVRZYCwgYFRSQU5TQUNUSU9OU2AsIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgLCBgTElBQklMSVRJRVNgLCBgSE9MRElOR1NgLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9kdWN0LCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBGaXJlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGFjY291bnQgaXMgYXZhaWxhYmxlIG9uIHRoZSBJdGVtIGFuZCB5b3UgY2FuIGxhdW5jaCB1cGRhdGUgbW9kZSB0byByZXF1ZXN0IGFjY2VzcyB0byBpdC4gIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gOiBGaXJlZCB3aGVuIGEgZ2l2ZW4gU2FtZS1EYXkgTWljcm8tZGVwb3NpdCBJdGVtIGlzIHZlcmlmaWVkIHZpYSBTTVMgdmVyaWZpY2F0aW9uLiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUEVORElOR19ESVNDT05ORUNUYDogRmlyZWQgd2hlbiBhbiBJdGVtIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZSAoZS5nLiBkdWUgdG8gYSBwbGFubmVkIGJhbmsgbWlncmF0aW9uKSBhbmQgbXVzdCBiZSBzZW50IHRocm91Z2ggdXBkYXRlIG1vZGUgdG8gY29udGludWUgd29ya2luZy4gIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWA6IFJlY3VycmluZyBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiAgSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgUFJPRFVDVF9SRUFEWWA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYSBnaXZlbiBhc3NldCByZXBvcnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgRVJST1JgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGFzc2V0IHJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFVTRVJfUEVSTUlTU0lPTl9SRVZPS0VEYDogSW5kaWNhdGVzIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhleSBwcmV2aW91c2x5IGdyYW50ZWQgdG8gYWNjZXNzIGFuIEl0ZW0uIE1heSBub3QgYWx3YXlzIGZpcmUgdXBvbiByZXZvY2F0aW9uLCBhcyBzb21lIGluc3RpdHV0aW9uc1xcJyBjb25zZW50IHBvcnRhbHMgZG8gbm90IHRyaWdnZXIgdGhpcyB3ZWJob29rLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgb3IgSXRlbS4gIGBVU0VSX0FDQ09VTlRfUkVWT0tFRGA6IEZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBzZW50IG9ubHkgZm9yIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgeW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT0F1dGggaW5zdGl0dXRpb25cbiAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9BdXRoIGluc3RpdHV0aW9uXG4gICAgICogQHBhcmFtIHtTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3R9IHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcGF5bWVudCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNhY3Rpb25zL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIG5ldyB0cmFuc2FjdGlvbnMgZm9yIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIHVwIHRvIDEwIHRyYW5zYWN0aW9ucyB0byBhbnkgSXRlbSBhdCBhIHRpbWUuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBJdGVtcyB0aGF0IHdlcmUgY3JlYXRlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCB1c2luZyB0aGUgYHVzZXJfdHJhbnNhY3Rpb25zX2R5bmFtaWNgIHRlc3QgdXNlci4gWW91IGNhbiB1c2UgdGhpcyB0byBhZGQgdHJhbnNhY3Rpb25zIHRvIHRlc3QgdGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50cy4gIEN1c3RvbSB0cmFuc2FjdGlvbnMgYXJlIG9ubHkgYXBwbGllZCB0byB0aGUgZGVwb3NpdG9yeSBhY2NvdW50LiBTdXBwb3J0IGZvciBwZXItYWNjb3VudCB0YXJnZXRpbmcgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHNhbmRib3ggdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlKHNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNhY3Rpb25zQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2FjdGlvbnNDcmVhdGUoc2FuZGJveFRyYW5zYWN0aW9uc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGEgNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmAgZnVuY3Rpb25zIHRoZSBzYW1lIGFzIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgYnV0IHdpbGwgbW9kaWZ5IEl0ZW1zIHJlbGF0ZWQgdG8gYSBVc2VyLiBUaGlzIGVuZHBvaW50IGZvcmNlcyBlYWNoIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmAsIHlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBpdGVtKHMpIGZvciBhIFNhbmRib3ggVXNlciBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zZXNzaW9uL3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciBMYXllci4gVGhlIHJldHVybmVkIExpbmsgdG9rZW4gaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyB0aGUgTGluayBTREsuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIExheWVyXG4gICAgICogQHBhcmFtIHtTZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0fSBzZXNzaW9uVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2Vzc2lvblRva2VuQ3JlYXRlKHNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3Q6IFNlc3Npb25Ub2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zZXNzaW9uVG9rZW5DcmVhdGUoc2Vzc2lvblRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgeW91IGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgLCBQbGFpZCB3aWxsIG5vcm1hbGx5IGluZmVyIHRoZSBvdXRjb21lIGZyb20geW91ciBTaWduYWwgUnVsZXMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IHVzaW5nIFNpZ25hbCBSdWxlcywgaWYgdGhlIFNpZ25hbCBSdWxlcyBvdXRjb21lIHdhcyBgUkVWSUVXYCwgb3IgaWYgeW91IHRha2UgYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduYWwgUnVsZXMsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgLiBUaGlzIGhlbHBzIGltcHJvdmUgU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3JlIGFjY3VyYWN5IGZvciB5b3VyIGFjY291bnQgYW5kIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoZSBydWxlIHBlcmZvcm1hbmNlIGFuZCBydWxlIHR1bmluZyBjYXBhYmlsaXRpZXMgaW4gdGhlIERhc2hib2FyZC4gSWYgeW91ciBlZmZlY3RpdmUgZGVjaXNpb24gY2hhbmdlcyBhZnRlciBjYWxsaW5nIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgKGZvciBleGFtcGxlLCB5b3UgaW5kaWNhdGVkIHRoYXQgeW91IGFjY2VwdGVkIGEgdHJhbnNhY3Rpb24sIGJ1dCBsYXRlciBvbiwgeW91ciBwYXltZW50IHByb2Nlc3NvciByZWplY3RlZCBpdCwgc28gaXQgd2FzIG5ldmVyIGluaXRpYXRlZCksIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCBhZ2FpbiBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvcnJlY3QgUGxhaWRcXCdzIHJlY29yZHMuICBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFRyYW5zZmVyIGFzIHlvdXIgcGF5bWVudCBwcm9jZXNzb3IsIHlvdSBhbHNvIGRvIG5vdCBuZWVkIHRvIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCwgYXMgUGxhaWQgY2FuIGluZmVyIG91dGNvbWVzIGZyb20geW91ciBUcmFuc2ZlciBhY3Rpdml0eS4gIElmIHVzaW5nIGEgQmFsYW5jZS1vbmx5IHJ1bGVzZXQsIHRoaXMgZW5kcG9pbnQgd2lsbCBub3QgaW1wYWN0IHNjb3JlcyAoQmFsYW5jZSBkb2VzIG5vdCB1c2Ugc2NvcmVzKSwgYnV0IGlzIG5lY2Vzc2FyeSB0byB2aWV3IGFjY3VyYXRlIHRyYW5zYWN0aW9uIG91dGNvbWVzIGFuZCB0dW5lIHJ1bGUgbG9naWMgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgQmVmb3JlIHVzaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIHJ1bGVzZXRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2lnbmFsL3NpZ25hbC1ydWxlcy8pIGluIHRoZSBEYXNoYm9hcmQgdW5kZXIgWyoqU2lnbmFsLT5SdWxlcyoqXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc2lnbmFsL3Jpc2stcHJvZmlsZXMpLiAgYC9zaWduYWwvZXZhbHVhdGVgIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZXMgb3IgdGhlIEJhbGFuY2UgcHJvZHVjdC4gV2hpY2ggcHJvZHVjdCBpcyB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgYHJ1bGVzZXRfa2V5YCB0aGF0IHlvdSBwcm92aWRlLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1NpZ25hbCBSdWxlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zaWduYWwvc2lnbmFsLXJ1bGVzLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IGhhdmUgaGlnaGVyIGxhdGVuY3kgd2hlbiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXF1ZXN0IGRhdGEuIEJhbGFuY2Utb25seSBydWxlc2V0cyBtYXkgaGF2ZSBsYXRlbmN5IG9mIHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhbiBJdGVtIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzIHVzZWQgdG8gZGV2ZWxvcCBhIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gVGhpcyBzaG91bGQgYmUgZG9uZSBvbiBJdGVtcyB3aGVyZSBgc2lnbmFsYCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCB0aGUgaW5pdGlhbCBjYWxsIHRvIGAvc2lnbmFsL2V2YWx1YXRlYCBvbiB0aGF0IEl0ZW0gd2lsbCBiZSBsZXNzIGFjY3VyYXRlLCBiZWNhdXNlIFBsYWlkIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gbGVzcyBkYXRhIGZvciBjb21wdXRpbmcgdGhlIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHlvdXIgaW50ZWdyYXRpb24gaXMgcHVyZWx5IEJhbGFuY2Utb25seSwgdGhpcyBlbmRwb2ludCB3aWxsIGhhdmUgbm8gZWZmZWN0LCBhcyBCYWxhbmNlLW9ubHkgcnVsZXNldHMgZG8gbm90IGNhbGN1bGF0ZSBhIFNpZ25hbCBUcmFuc2FjdGlvbiBTY29yZS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGBzaWduYWxgLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsIFRyYW5zYWN0aW9uIFNjb3Jlc1xuICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZHMgaW50byB5b3VyIHNjb3JlcyBhbmQgdHVuZSBydWxlIGxvZ2ljLiBJZiB1c2luZyBhIEJhbGFuY2Utb25seSBydWxlc2V0LCB0aGlzIGVuZHBvaW50IHdpbGwgbm90IGltcGFjdCBzY29yZXMgKGFzIEJhbGFuY2UgZG9lcyBub3QgdXNlIHNjb3JlcyksIGJ1dCBpcyBuZWNlc3NhcnkgdG8gdmlldyBhY2N1cmF0ZSB0cmFuc2FjdGlvbiBvdXRjb21lcyBhbmQgdHVuZSBydWxlIGxvZ2ljIGluIHRoZSBEYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9zaWduYWwvc2NoZWR1bGVgIHRvIHNjaGVkdWxlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24uXG4gICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsU2NoZWR1bGVSZXF1ZXN0fSBzaWduYWxTY2hlZHVsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxTY2hlZHVsZShzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBFbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudCBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRoZSBJdGVtIHdhcyBsYXN0IHVwZGF0ZWQsIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXJcXCdzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gIFdoZW4gdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgZm9yIGJlc3QgcmVzdWx0cywgbWFrZSBzdXJlIHRvIHVzZSB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBwYXJhbWV0ZXIgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIEl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoZSBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBUcmFuc2FjdGlvbnMgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAuICBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIG9wdGlvbmFsIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcuIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBBIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHVzZWQgdG8gY3JlYXRlIGEgdHJhbnNmZXIuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuIFRoZSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIHdpbGwgZXhwaXJlIGlmIG5vdCB1c2VkIGFmdGVyIG9uZSBob3VyLiAoWW91IGNhbiBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhdXRob3JpemF0aW9uIGxpZmV0aW1lLikgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgYWRkaXRpb25hbCB1c2VyIGlucHV0IGlzIG5lZWRlZCwgdXN1YWxseSB0byBmaXggYSBicm9rZW4gYmFuayBjb25uZWN0aW9uLCBiZWZvcmUgUGxhaWQgY2FuIHByb3Blcmx5IGFzc2VzcyB0aGUgcmlzay4gWW91IG5lZWQgdG8gbGF1bmNoIExpbmsgaW4gdXBkYXRlIG1vZGUgdG8gY29tcGxldGUgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uLiBXaGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgdG8gZ2V0IGEgbmV3IExpbmsgdG9rZW4sIGluc3RlYWQgb2YgcHJvdmlkaW5nIGBhY2Nlc3NfdG9rZW5gIGluIHRoZSByZXF1ZXN0LCB5b3Ugc2hvdWxkIHNldCBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGFzIHRoZSBgYXV0aG9yaXphdGlvbi5pZGAuIEFmdGVyIHRoZSBMaW5rIGZsb3cgaXMgY29tcGxldGVkLCB5b3UgbWF5IHJlLWF0dGVtcHQgdGhlIGF1dGhvcml6YXRpb24uICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lLURheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gZ2V0IGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gb2YgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYW4gYWNjb3VudCB0byBiZSB1c2VkIHdpdGggVHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgd29ya3Mgb24gYWxsIFRyYW5zZmVyLWNhcGFibGUgSXRlbXMsIGluY2x1ZGluZyB0aG9zZSBjcmVhdGVkIGJ5IGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IGlzIHJldHJ5YWJsZSBhbmQgaWRlbXBvdGVudDsgaWYgYSB0cmFuc2ZlciB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgaXQgd2lsbCByZXR1cm4gdGhlIHRyYW5zZmVyIGRldGFpbHMgd2l0aG91dCBjcmVhdGluZyBhIG5ldyB0cmFuc2Zlci4gQSB0cmFuc2ZlciBtYXkgc3RpbGwgYmUgY3JlYXRlZCBpZiBhIDUwMCBlcnJvciBpcyByZXR1cm5lZDsgdG8gZGV0ZWN0IHRoaXMgc2NlbmFyaW8sIHVzZSBbVHJhbnNmZXIgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3JlY29uY2lsaW5nLXRyYW5zZmVycy8pLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZWlyIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW91XFwnbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIGBtdWx0aXBhcnQvZm9ybS1kYXRhYC4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgNTAwIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGxlZGdlcnMsIGlmIHlvdSBoYXZlIG11bHRpcGxlLiBJZiB5b3VcXCdyZSBhIHBsYXRmb3JtLCB5b3UgY2FuIG1vdmUgZnVuZHMgYmV0d2VlbiBvbmUgb2YgeW91ciBsZWRnZXJzIGFuZCBvbmUgb2YgeW91ciBjdXN0b21lclxcJ3MgbGVkZ2Vycy5cbiAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gbGVkZ2Vyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBsZWRnZXIgZXZlbnRzIGZvciBhIHNwZWNpZmljIGxlZGdlciBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgbGVkZ2VyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlckV2ZW50TGlzdCh0cmFuc2ZlckxlZGdlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0KHRyYW5zZmVyTGVkZ2VyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuICBJbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBlbmRwb2ludCByZXR1cm5zIHN0YXRpYyBwbGFjZWhvbGRlciB2YWx1ZXMgcmF0aGVyIHRoYW4gbWV0cmljcyBjb21wdXRlZCBmcm9tIHlvdXIgU2FuZGJveCB0cmFuc2ZlciBhY3Rpdml0eS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBwcmV2aW91c2x5LXZlcmlmaWVkIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlciBvciBbc3VwcG9ydF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQpLlxuICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBmdW5kaW5nIGFjY291bnQgZm9yIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBmdW5kaW5nIGFjY291bnQgZm9yIGFuIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBzdWJtaXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3IgeW91IGFyZSBvbmJvYXJkaW5nLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmF0b3JcXCdzIGFncmVlbWVudCB0byB0aGUgcmVxdWlyZWQgbGVnYWwgdGVybXMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIG9yaWdpbmF0b3IgZm9yIFRyYW5zZmVyIGZvciBQbGF0Zm9ybXMgY3VzdG9tZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yIChlLmcuIGJlbmVmaWNpYWwgb3duZXIgb3IgY29udHJvbCBwZXJzb24pIGFuZCBvcHRpb25hbGx5IHN1Ym1pdCBwZXJzb25hbCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlbS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IGFkZGl0aW9uYWwgb25ib2FyZGluZyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5lZWRlZCBieSBQbGFpZCB0byBhcHByb3ZlIG9yIGRlY2xpbmUgdGhlIG9yaWdpbmF0b3IuIFNlZSBbUmVxdWlyZW1lbnQgdHlwZSBzY2hlbWEgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xTkVRa1REMHNWSzUwaUFRaTZ4SGlncmV4RFV4WjRReFhxU0VmVl9GRlRpVS8pIGZvciBhIGxpc3Qgb2YgcmVxdWlyZW1lbnQgdHlwZXMgYW5kIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgKiBAc3VtbWFyeSBTdWJtaXQgYWRkaXRpb25hbCBvbmJvYXJkaW5nIGluZm9ybWF0aW9uIG9uIGJlaGFsZiBvZiBhbiBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZFxcJ3MgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgQSBzY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFRyYW5zZmVyIGZvciBQbGF0Zm9ybXMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLiAgQSByZWZ1bmQgY2FuIHN0aWxsIGJlIGlzc3VlZCBldmVuIGlmIHRoZSBJdGVtXFwncyBgYWNjZXNzX3Rva2VuYCBpcyBubyBsb25nZXIgdmFsaWQgKGUuZy4gaWYgdGhlIHVzZXIgcmV2b2tlZCBPQXV0aCBjb25zZW50IG9yIHRoZSBJdGVtIHdhcyBkZWxldGVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCksIGFzIGxvbmcgYXMgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyIHBhaXIgdXNlZCB0byBtYWtlIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBpcyBzdGlsbCB2YWxpZC4gQSByZWZ1bmQgY2Fubm90IGJlIGlzc3VlZCBpZiB0aGUgSXRlbSBoYXMgYW4gW2ludmFsaWRhdGVkIFRBTl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKSwgd2hpY2ggY2FuIG9jY3VyIGF0IENoYXNlIG9yIFBOQy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmV0dXJuL3JlY292ZXJgIGVuZHBvaW50IHRvIG5vdGlmeSBQbGFpZCB0aGF0IHlvdSBoYXZlIHJlY292ZXJlZCBzb21lIG9yIGFsbCBvZiB0aGUgbG9zcyBvbiBhIHJldHVybmVkIGd1YXJhbnRlZWQgdHJhbnNmZXIuICBSZWNvdmVyeSBjYW4gYmUgcmVwb3J0ZWQgaW4gZnVsbCBvciBpbiBwYXJ0czsgdGhlIHN1bSBvZiByZWNvdmVyZWQgYW1vdW50cyBhY3Jvc3MgY2FsbHMgY2Fubm90IGV4Y2VlZCB0aGUgb3JpZ2luYWwgdHJhbnNmZXJcXCdzIGFtb3VudC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gcmVjb3ZlcnlcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3R9IHRyYW5zZmVyUmV0dXJuUmVjb3ZlclJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJldHVyblJlY292ZXIodHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdDogVHJhbnNmZXJSZXR1cm5SZWNvdmVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmV0dXJuUmVjb3Zlcih0cmFuc2ZlclJldHVyblJlY292ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHNlbmRpbmcgY2xpZW50LXNwZWNpZmljIGV2ZW50cyByZWxhdGVkIHRvIExheWVyIHNlc3Npb25zIGZvciBhbmFseXRpY3MgYW5kIHRyYWNraW5nIHB1cnBvc2VzLlxuICAgICAqIEBzdW1tYXJ5IFNlbmQgVXNlciBBY2NvdW50IFNlc3Npb24gRXZlbnRcbiAgICAgKiBAcGFyYW0ge1VzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3R9IHVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmQodXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uRXZlbnRTZW5kUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJBY2NvdW50U2Vzc2lvbkV2ZW50U2VuZCh1c2VyQWNjb3VudFNlc3Npb25FdmVudFNlbmRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdXNlciBwZXJtaXNzaW9uZWQgYWNjb3VudCBkYXRhLCBpbmNsdWRpbmcgaWRlbnRpdHkgYW5kIEl0ZW0gYWNjZXNzIHRva2VucywgZm9yIHVzZSB3aXRoIFtQbGFpZCBMYXllcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllcikuIE5vdGUgdGhhdCBlbmQgdXNlcnMgYXJlIHBlcm1pdHRlZCB0byBlZGl0IHRoZSBwcmVmaWxsZWQgaWRlbnRpdHkgZGF0YSBpbiB0aGUgTGluayBmbG93IGJlZm9yZSBzaGFyaW5nIGl0IHdpdGggeW91OyB5b3Ugc2hvdWxkIHRyZWF0IGFueSBpZGVudGl0eSBkYXRhIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXMgdXNlci1zdWJtaXR0ZWQsIHVudmVyaWZpZWQgZGF0YS4gRm9yIGEgdmVyaWZpY2F0aW9uIGxheWVyLCB5b3UgY2FuIGFkZCBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi8pIHRvIHlvdXIgZmxvdywgb3IgY2hlY2sgdGhlIHN1Ym1pdHRlZCBpZGVudGl0eSBkYXRhIGFnYWluc3QgYmFuayBhY2NvdW50IGRhdGEgZnJvbSBsaW5rZWQgYWNjb3VudHMgdXNpbmcgW0lkZW50aXR5IE1hdGNoXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LyNpZGVudGl0eS1tYXRjaCkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIFBsYWlkIHByb2R1Y3RzIGFuZCBmbG93cyB0aGF0IHVzZSB0aGUgdXNlciBvYmplY3QsIGAvdXNlci9jcmVhdGVgIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3UgbXVzdCBjYWxsIHRoaXMgZW5kcG9pbnQgYmVmb3JlIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaWYgeW91IGFyZSB1c2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZzogUGxhaWQgQ2hlY2ssIEluY29tZSBWZXJpZmljYXRpb24sIE11bHRpLUl0ZW0gTGluaywgb3IgUGxhaWQgUHJvdGVjdCAoSWRlbnRpdHkpLiBJZiB5b3UgYXJlIHVzaW5nIFBsYWlkIFByb3RlY3QgTGluayBzZXNzaW9uIHNjb3JpbmcsIHlvdSBkbyBub3QgbmVlZCB0byBjYWxsIGAvdXNlci9jcmVhdGVgIGZpcnN0OyBQbGFpZCB3aWxsIHJlc29sdmUgb3IgY3JlYXRlIHRoZSB1c2VyIHdoZW4gYHVzZXIuY2xpZW50X3VzZXJfaWRgIGlzIHByb3ZpZGVkIGluIGAvbGluay90b2tlbi9jcmVhdGVgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyB0aGlzIGVuZHBvaW50IG9uIG9yIGFmdGVyIERlY2VtYmVyIDEwLCAyMDI1LCB0aGlzIGVuZHBvaW50IHRha2VzIGEgYGNsaWVudF91c2VyX2lkYCBhbmQgYW4gYGlkZW50aXR5YCBvYmplY3QgYW5kIHdpbGwgcmV0dXJuIGEgYHVzZXJfaWRgLiBGb3IgY3VzdG9tZXJzIHdobyBiZWdhbiB1c2luZyBpdCBiZWZvcmUgdGhhdCBkYXRlLCB0aGUgZW5kcG9pbnQgdGFrZXMgYSBgY2xpZW50X3VzZXJfaWRgIGFuZCBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IGFuZCB3aWxsIHJldHVybiBhIGB1c2VyX3Rva2VuYCBhbmQgYHVzZXJfaWRgLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW05ldyBVc2VyIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3VzZXJzL3VzZXItYXBpcykuIEluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLCB0aGUgYGlkZW50aXR5YCAobmV3KSBvciBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIChsZWdhY3kpIG9iamVjdCBtdXN0IGJlIHByZXNlbnQuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiAgIEluIG9yZGVyIHRvIGdlbmVyYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0LCB0aGUgZm9sbG93aW5nIGBpZGVudGl0eWAgZmllbGRzLCBhdCBtaW5pbXVtLCBhcmUgcmVxdWlyZWQgYW5kIG11c3QgYmUgbm9uLWVtcHR5OiBgbmFtZWAsIGBkYXRlX29mX2JpcnRoYCwgYGVtYWlsc2AsIGBwaG9uZV9udW1iZXJzYCwgYW5kIGBhZGRyZXNzZXNgICh3aXRoIGF0IGxlYXN0IG9uZSBlbWFpbCwgcGhvbmUgbnVtYmVyLCBhbmQgYWRkcmVzcyBkZXNpZ25hdGVkIGFzIGBwcmltYXJ5YCkuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiBJZiBjcmVhdGluZyBhIHJlcG9ydCBmb3Igc2hhcmluZyB3aXRoIGEgR1NFIHN1Y2ggYXMgRmFubmllIG9yIEZyZWRkaWUsIHRoZSB1c2VyXFwncyBmdWxsIFNTTiBtdXN0IGJlIHByb3ZpZGVkIHZpYSB0aGUgYGlkX251bWJlcnNgIGZpZWxkLiBQcm92aWRpbmcgYXQgbGVhc3QgYSBwYXJ0aWFsIFNTTiBpcyBhbHNvIHN0cm9uZ2x5IHJlY29tbWVuZGVkIGZvciBhbGwgdXNlIGNhc2VzLCBzaW5jZSBpdCBpbXByb3ZlcyB0aGUgYWNjdXJhY3kgb2YgbWF0Y2hpbmcgdXNlciByZWNvcmRzIGR1cmluZyBjb21wbGlhbmNlIHByb2Nlc3NlcyBzdWNoIGFzIGZpbGUgZGlzY2xvc3VyZSwgZGlzcHV0ZSwgb3Igc2VjdXJpdHkgZnJlZXplIHJlcXVlc3RzLiAgIFdoZW4gdXNpbmcgUGxhaWQgUHJvdGVjdCwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHByb3ZpZGUgYW4gYGlkZW50aXR5YCBvYmplY3QgdG8gYmV0dGVyIGlkZW50aWZ5IGFuZCBibG9jayBmcmF1ZCBhY3Jvc3MgeW91ciBMaW5rIHNlc3Npb25zLiAgIFBsYWlkIHdpbGwgbm9ybWFsaXplIGlkZW50aXR5IGZpZWxkcyBiZWZvcmUgc3RvcmluZyB0aGVtIGFuZCB1dGlsaXplIHRoZSBzYW1lIGlkZW50aXR5IGFjcm9zcyBkaWZmZXJlbnQgdXNlci1iYXNlZCBwcm9kdWN0cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC91c2VyL2ZpbmFuY2lhbF9kYXRhL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIFVzZXIgdXNpbmcgdGhlIEZpbmFuY2lhbCBJbnNpZ2h0cyBidW5kbGUuIFRoaXMgYnVuZGxlIHJlZnJlc2hlcyB0aGUgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgYW5kIExpYWJpbGl0aWVzIHByb2R1Y3QgZGF0YS4gVGhpcyBlbmRwb2ludCBpcyBmb3IgY2xpZW50cyB3aG8gdXNlIHRoZSBGaW5hbmNpYWwgSW5zaWdodHMgYnVuZGxlIGFuZCB3YW50IHRvIHByb2FjdGl2ZWx5IHVwZGF0ZSBhbGwgbGlua2VkIEl0ZW1zIHVuZGVyIGEgdXNlci4gVGhlIHJlZnJlc2ggbWF5IHN1Y2NlZWQgb3IgZmFpbCBvbiBhIHBlci1JdGVtIGJhc2lzLiBVc2UgdGhlIGByZXN1bHRzYCBhcnJheSBpbiB0aGUgcmVzcG9uc2UgdG8gdW5kZXJzdGFuZCB0aGUgb3V0Y29tZSBmb3IgZWFjaCBJdGVtLiAgVGhpcyBlbmRwb2ludCBpcyBkaXN0aW5jdCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCB3aGljaCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yIGEgc2luZ2xlIEl0ZW0uIFVzZSBgL3VzZXIvZmluYW5jaWFsX2RhdGEvcmVmcmVzaGAgdG8gdGFyZ2V0IGFsbCBJdGVtcyBmb3IgYSB1c2VyIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB1c2VyIGl0ZW1zIGZvciBGaW5hbmNpYWwtSW5zaWdodHMgYnVuZGxlXG4gICAgICogQHBhcmFtIHtVc2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0fSB1c2VyRmluYW5jaWFsRGF0YVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckZpbmFuY2lhbERhdGFSZWZyZXNoKHVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3Q6IFVzZXJGaW5hbmNpYWxEYXRhUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyRmluYW5jaWFsRGF0YVJlZnJlc2godXNlckZpbmFuY2lhbERhdGFSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHVzZXIgZGV0YWlscyB1c2luZyBhIGB1c2VyX2lkYC4gVGhpcyBlbmRwb2ludCBvbmx5IHN1cHBvcnRzIHVzZXJzIHRoYXQgd2VyZSBjcmVhdGVkIG9uIHRoZSBuZXcgdXNlciBBUEkgZmxvdywgd2l0aG91dCBhIGB1c2VyX3Rva2VuYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtOZXcgVXNlciBBUElzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS91c2Vycy91c2VyLWFwaXMpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHVzZXIgaWRlbnRpdHkgYW5kIGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtVc2VyR2V0UmVxdWVzdH0gdXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyR2V0KHVzZXJHZXRSZXF1ZXN0OiBVc2VyR2V0UmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyR2V0KHVzZXJHZXRSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyBjdXN0b21lcnMgdG8gZXhwbGljaXRseSBwdXJnZSBpZGVudGl0eS9QSUkgZGF0YSBwcm92aWRlZCB0byBQbGFpZCBmb3IgYSBnaXZlbiB1c2VyLiBUaGlzIGlzIG5vdCBleHBvc2VkIHRvIGN1c3RvbWVycyBieSBkZWZhdWx0LCBhcyBpdCBpcyBtZWFudCBmb3Igc3BlY2lhbCBzY2VuYXJpb3Mgb3IgcmVxdWVzdHMsIGJ1dCBQbGFpZCBpcyBvYmxpZ2F0ZWQgdG8gZW5hYmxlIGN1c3RvbWVycyB0byBkZWxldGUgUElJIHByb3ZpZGVkIHRvIHVzLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge1VzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3R9IHVzZXJJZGVudGl0eVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGxhaWROZXdVc2VyQVBJRW5hYmxlZF0gVGhlIEhUVFAgaGVhZGVyIHVzZWQgaW4gQVBJIHJlcXVlc3RzIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgVXNlciBBUElzIHRvIGludm9rZTogdGhlIGxlZ2FjeSBDUkEgdmVyc2lvbiBvciB0aGUgbmV3IFVzZXIgQVBJIHZlcnNpb24uXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySWRlbnRpdHlSZW1vdmUodXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdDogVXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZD86IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VySWRlbnRpdHlSZW1vdmUodXNlcklkZW50aXR5UmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlcyBJdGVtcyB0byB0aGUgdGFyZ2V0IHVzZXIuIElmIGFuIEl0ZW0gaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGFub3RoZXIgdXNlciwgdGhlIEl0ZW0gd2lsbCBiZSBkaXNhc3NvY2lhdGVkIHdpdGggdGhlIGV4aXN0aW5nIHVzZXIgYW5kIGFzc29jaWF0ZWQgdG8gdGhlIHRhcmdldCB1c2VyLiBUaGlzIG9wZXJhdGlvbiBzdXBwb3J0cyBhIG1heCBvZiAxMDAgSXRlbXMuXG4gICAgICogQHN1bW1hcnkgQXNzb2NpYXRlIEl0ZW1zIHRvIGEgVXNlclxuICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdH0gdXNlckl0ZW1zQXNzb2NpYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJJdGVtc0Fzc29jaWF0ZSh1c2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0OiBVc2VySXRlbXNBc3NvY2lhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckl0ZW1zQXNzb2NpYXRlKHVzZXJJdGVtc0Fzc29jaWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLCBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuIFBsYWlkIGFzc29jaWF0ZXMgYW4gSXRlbSB3aXRoIGEgVXNlciB3aGVuIGl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgd2l0aGluIGEgTGluayBzZXNzaW9uIGluaXRpYWxpemVkIHdpdGggdGhhdCBgdXNlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgR2V0IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHNwZWNpZmljIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuIEl0IGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBvbiBlYWNoIEl0ZW0gaW5kaXZpZHVhbGx5LCBidXQgc3VwcG9ydHMgdXNlIGNhc2VzIChzdWNoIGFzIFBsYWlkIENoZWNrKSB3aGVyZSBhY2Nlc3MgdG9rZW5zIGFyZSBub3QgYXZhaWxhYmxlLiBBbGwgc3BlY2lmaWVkIEl0ZW1zIG11c3QgYmVsb25nIHRvIHRoZSB1c2VyIG9yIHRoZSBlbnRpcmUgb3BlcmF0aW9uIGZhaWxzLiBTaW1pbGFyIHRvIGAvaXRlbS9yZW1vdmVgLCB0aGlzIGRlbGV0ZXMgSXRlbSBwcm9kdWN0IGRhdGEgYW5kIHRlcm1pbmF0ZXMgYmlsbGluZyBvbiB0aGUgSXRlbVxcJ3MgcHJvZHVjdHMuIE9uY2UgcmVtb3ZlZCwgSXRlbXMgY2Fubm90IGJlIHJlY29ubmVjdGVkIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBMaW5rIGFnYWluLiBUaGlzIGVuZHBvaW50IGlzIG5vdCBpbnRlbmRlZCB0byByZW1vdmUgYWxsIGRhdGEgZm9yIGEgdXNlciwgYXMgaXQgd2lsbCBvbmx5IHJlbW92ZSBJdGVtcyBhbmQgbm8gb3RoZXIgZGF0YSBmb3IgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGhhcyBhbnkgdXNlci1iYXNlZCByZWN1cnJpbmcgc3Vic2NyaXB0aW9uIHByb2R1Y3RzIChGaW5hbmNpYWwgTWFuYWdlbWVudCwgUGxhaWQgUHJvdGVjdCwgb3IgQ1JBIENhc2ggRmxvdyBVcGRhdGVzKSBhbmQgaXMgZGVsZXRpbmcgdGhlaXIgYWNjb3VudCB3aXRoIHlvdXIgcHJvZHVjdCwgYWxzbyBjYWxsIGAvdXNlci9wcm9kdWN0cy90ZXJtaW5hdGVgIHRvIGVuZCB0aG9zZSBzdWJzY3JpcHRpb25zOyBwZXItSXRlbSBiaWxsaW5nIGlzIGFscmVhZHkgdGVybWluYXRlZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgYSB1c2VyIGluaXRpYXRlZCBkYXRhIGRlbGV0aW9uIHJlcXVlc3QsIHNlZSB0aGUgW0NvbnN1bWVyIFNlcnZpY2UgQ2VudGVyXShodHRwczovL3BsYWlkLmNvbS9jaGVjay9jb25zdW1lci1zZXJ2aWNlLWNlbnRlci8pIHRvIHJldm9rZSBhY2Nlc3MgdG8gZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgSXRlbXMgZnJvbSBhIFVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc1JlbW92ZVJlcXVlc3R9IHVzZXJJdGVtc1JlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySXRlbXNSZW1vdmUodXNlckl0ZW1zUmVtb3ZlUmVxdWVzdDogVXNlckl0ZW1zUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJJdGVtc1JlbW92ZSh1c2VySXRlbXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXJtaW5hdGVzIHVzZXItYmFzZWQgcmVjdXJyaW5nIHN1YnNjcmlwdGlvbiBidW5kbGVzIG9yIHByb2R1Y3RzIChGaW5hbmNpYWwgTWFuYWdlbWVudCwgUGxhaWQgUHJvdGVjdCwgYW5kIENSQSBDYXNoIEZsb3cgVXBkYXRlcykgYXNzb2NpYXRlZCB3aXRoIGEgYHVzZXJfaWRgLiBBZnRlciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LCB0aGUgdXNlciB3aWxsIG5vIGxvbmdlciBiZSBiaWxsZWQgZm9yIHRoZXNlIHByb2R1Y3RzLiBGb3IgQ1JBIE1vbml0b3JpbmcsIHRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQgYnV0IGhpc3RvcmljYWwgZGF0YSByZW1haW5zIGF2YWlsYWJsZSBmb3IgZnV0dXJlIHJlcG9ydCByZXF1ZXN0cy5cbiAgICAgKiBAc3VtbWFyeSBUZXJtaW5hdGUgdXNlci1iYXNlZCBwcm9kdWN0c1xuICAgICAqIEBwYXJhbSB7VXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdH0gdXNlclByb2R1Y3RzVGVybWluYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZSh1c2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0OiBVc2VyUHJvZHVjdHNUZXJtaW5hdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlclByb2R1Y3RzVGVybWluYXRlKHVzZXJQcm9kdWN0c1Rlcm1pbmF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BsYWlkTmV3VXNlckFQSUVuYWJsZWRdIFRoZSBIVFRQIGhlYWRlciB1c2VkIGluIEFQSSByZXF1ZXN0cyB0byBkZXRlcm1pbmUgd2hpY2ggc2V0IG9mIFVzZXIgQVBJcyB0byBpbnZva2U6IHRoZSBsZWdhY3kgQ1JBIHZlcnNpb24gb3IgdGhlIG5ldyBVc2VyIEFQSSB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQ/OiBib29sZWFuLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgcGxhaWROZXdVc2VyQVBJRW5hYmxlZCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIHNoYXJlZCB3aXRoIGFuZCB1c2VkIGJ5IGEgc3BlY2lmaWVkIHRoaXJkLXBhcnR5IGNsaWVudCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhyb3VnaCBzdXBwb3J0ZWQgZW5kcG9pbnRzLiAgRW5zdXJlIHlvdSBzdG9yZSB0aGUgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gIGFsb25nIHdpdGggdGhlIGB1c2VyX3Rva2VuYCBhbmQgYHRoaXJkX3BhcnR5X2NsaWVudF9pZGAsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdXNlci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgVXNlciB1c2luZyB0aGUgVHJhbnNhY3Rpb25zIGJ1bmRsZS4gVGhpcyBidW5kbGUgcmVmcmVzaGVzIG9ubHkgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGRhdGEuIFRoaXMgZW5kcG9pbnQgaXMgZm9yIGNsaWVudHMgd2hvIHVzZSB0aGUgVHJhbnNhY3Rpb25zIEluc2lnaHRzIGJ1bmRsZSBhbmQgd2FudCB0byBwcm9hY3RpdmVseSB1cGRhdGUgYWxsIGxpbmtlZCBJdGVtcyB1bmRlciBhIHVzZXIuIFRoZSByZWZyZXNoIG1heSBzdWNjZWVkIG9yIGZhaWwgb24gYSBwZXItSXRlbSBiYXNpcy4gVXNlIHRoZSBgcmVzdWx0c2AgYXJyYXkgaW4gdGhlIHJlc3BvbnNlIHRvIHVuZGVyc3RhbmQgdGhlIG91dGNvbWUgZm9yIGVhY2ggSXRlbS4gIFRoaXMgZW5kcG9pbnQgaXMgZGlzdGluY3QgZnJvbSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgd2hpY2ggdHJpZ2dlcnMgYSByZWZyZXNoIGZvciBhIHNpbmdsZSBJdGVtLiBVc2UgYC91c2VyL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCB0byB0YXJnZXQgYWxsIEl0ZW1zIGZvciBhIHVzZXIgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHVzZXIgaXRlbXMgZm9yIFRyYW5zYWN0aW9ucyBidW5kbGVcbiAgICAgKiBAcGFyYW0ge1VzZXJUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclRyYW5zYWN0aW9uc1JlZnJlc2godXNlclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBVc2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVHJhbnNhY3Rpb25zUmVmcmVzaCh1c2VyVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgdXBkYXRlcyB1c2VyIGluZm9ybWF0aW9uIGZvciBhbiBleGlzdGluZyBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gLiBJZiBhbiBleGlzdGluZyBgdXNlcl9pZGAgb3IgYHVzZXJfdG9rZW5gIGlzIG1pc3NpbmcgZmllbGRzIHJlcXVpcmVkIGZvciBhIGdpdmVuIHVzZSBjYXNlIChlLmcuIGNyZWF0aW5nIGEgQ29uc3VtZXIgUmVwb3J0KSB1c2UgYC91c2VyL3VwZGF0ZWAgdG8gYWRkIHZhbHVlcyBmb3IgdGhvc2UgZmllbGRzLiAgSWRlbnRpdHkgdXBkYXRlcyB1c2UgbWVyZ2Ugc2VtYW50aWNzOiBwcm92aWRlZCBmaWVsZHMgb3ZlcndyaXRlIGV4aXN0aW5nIG9uZXM7IG9taXR0ZWQgZmllbGRzIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbGFpZE5ld1VzZXJBUElFbmFibGVkXSBUaGUgSFRUUCBoZWFkZXIgdXNlZCBpbiBBUEkgcmVxdWVzdHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBVc2VyIEFQSXMgdG8gaW52b2tlOiB0aGUgbGVnYWN5IENSQSB2ZXJzaW9uIG9yIHRoZSBuZXcgVXNlciBBUEkgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBwbGFpZE5ld1VzZXJBUElFbmFibGVkPzogYm9vbGVhbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIHBsYWlkTmV3VXNlckFQSUVuYWJsZWQsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdDogV2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHN1bW1hcnkgTGlzdCBlLXdhbGxldCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IFdhdGNobGlzdCBTY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBXYXRjaGxpc3QgUHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG59XG5cblxuIl19 \ No newline at end of file diff --git a/dist/base.d.ts b/dist/base.d.ts index d7f87824..a4dbd14b 100644 --- a/dist/base.d.ts +++ b/dist/base.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/base.js b/dist/base.js index 65208bfd..6b23c088 100644 --- a/dist/base.js +++ b/dist/base.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -62,4 +62,4 @@ class RequiredError extends Error { } } exports.RequiredError = RequiredError; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjY5OC43XG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjcwNi4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/common.d.ts b/dist/common.d.ts index cfdad8e8..8dcb43e1 100644 --- a/dist/common.d.ts +++ b/dist/common.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/common.js b/dist/common.js index a72652c6..91ca1f4e 100644 --- a/dist/common.js +++ b/dist/common.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -150,4 +150,4 @@ const createRequestFunction = function (axiosArgs, globalAxios, BASE_PATH, confi }; }; exports.createRequestFunction = createRequestFunction; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS42OTguN1xuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDM0Y7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLG9CQUFvQix3QkFJaEM7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxhQUE2Qjs7UUFDM0YsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRTtZQUM1QyxNQUFNLFdBQVcsR0FBRyxPQUFPLGFBQWEsQ0FBQyxXQUFXLEtBQUssVUFBVTtnQkFDL0QsQ0FBQyxDQUFDLE1BQU0sYUFBYSxDQUFDLFdBQVcsRUFBRTtnQkFDbkMsQ0FBQyxDQUFDLE1BQU0sYUFBYSxDQUFDLFdBQVcsQ0FBQztZQUN0QyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQztTQUNyRDtJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxxQkFBcUIseUJBT2pDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxnQkFBZ0IsR0FBRyxVQUFnQixNQUFXLEVBQUUsSUFBWSxFQUFFLE1BQWdCLEVBQUUsYUFBNkI7O1FBQ3RILElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxXQUFXLEVBQUU7WUFDNUMsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLGFBQWEsQ0FBQyxXQUFXLEtBQUssVUFBVTtnQkFDNUUsQ0FBQyxDQUFDLE1BQU0sYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2dCQUMvQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsV0FBVyxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxTQUFTLEdBQUcsd0JBQXdCLENBQUM7U0FDbEU7SUFDTCxDQUFDO0NBQUEsQ0FBQTtBQVBZLFFBQUEsZ0JBQWdCLG9CQU81QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0sZUFBZSxHQUFHLFVBQVUsR0FBUSxFQUFFLEdBQUcsT0FBYztJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7UUFDMUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUU7WUFDdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUM1QixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDNUIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ2xDO2FBQ0o7aUJBQU07Z0JBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDdEM7U0FDSjtLQUNKO0lBQ0QsR0FBRyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDekMsQ0FBQyxDQUFBO0FBZlksUUFBQSxlQUFlLG1CQWUzQjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxLQUFVLEVBQUUsY0FBbUIsRUFBRSxhQUE2QjtJQUN6RyxNQUFNLFNBQVMsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7SUFDNUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxVQUFVO1FBQzdFLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixPQUFPLGtCQUFrQjtRQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS43MDYuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/configuration.d.ts b/dist/configuration.d.ts index 0b748ba7..0a085b07 100644 --- a/dist/configuration.d.ts +++ b/dist/configuration.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/configuration.js b/dist/configuration.js index 9c6a9561..1a0dd507 100644 --- a/dist/configuration.js +++ b/dist/configuration.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -31,7 +31,7 @@ class Configuration { this.baseOptions = {}; if (!this.baseOptions.headers) this.baseOptions.headers = {}; - this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v43.0.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); + this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v44.0.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); } /** * Check if the given MIME is a JSON MIME. @@ -49,4 +49,4 @@ class Configuration { } } exports.Configuration = Configuration; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtDQUNyQyxDQUFDO0FBRUYsTUFBYSxhQUFhO0lBbUR0QixZQUFZLFFBQWlDLEVBQUU7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBRXZDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzVDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLG1CQUN0QixDQUFDLFlBQVksQ0FBQyxFQUFFLG9CQUFvQixFQUNwQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFlBQVksSUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQzVCLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksVUFBVSxDQUFDLElBQVk7UUFDMUIsTUFBTSxRQUFRLEdBQVcsSUFBSSxNQUFNLENBQUMsK0RBQStELEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUcsT0FBTyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssNkJBQTZCLENBQUMsQ0FBQztJQUMxRyxDQUFDO0NBQ0o7QUFuRkQsc0NBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNjk4LjdcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblBhcmFtZXRlcnMge1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xufVxuXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmVzIDE2LTI1XG5pbnRlcmZhY2UgUGxhaWRFbnZpcm9ubWVudCB7XG4gIFtlbnY6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFBsYWlkRW52aXJvbm1lbnRzOiBQbGFpZEVudmlyb25tZW50ID0ge1xuICBwcm9kdWN0aW9uOiAnaHR0cHM6Ly9wcm9kdWN0aW9uLnBsYWlkLmNvbScsXG4gIHNhbmRib3g6ICdodHRwczovL3NhbmRib3gucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2NDMuMC4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtDQUNyQyxDQUFDO0FBRUYsTUFBYSxhQUFhO0lBbUR0QixZQUFZLFFBQWlDLEVBQUU7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBRXZDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzVDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLG1CQUN0QixDQUFDLFlBQVksQ0FBQyxFQUFFLG9CQUFvQixFQUNwQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFlBQVksSUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQzVCLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksVUFBVSxDQUFDLElBQVk7UUFDMUIsTUFBTSxRQUFRLEdBQVcsSUFBSSxNQUFNLENBQUMsK0RBQStELEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUcsT0FBTyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssNkJBQTZCLENBQUMsQ0FBQztJQUMxRyxDQUFDO0NBQ0o7QUFuRkQsc0NBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNzA2LjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblBhcmFtZXRlcnMge1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xufVxuXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmVzIDE2LTI1XG5pbnRlcmZhY2UgUGxhaWRFbnZpcm9ubWVudCB7XG4gIFtlbnY6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFBsYWlkRW52aXJvbm1lbnRzOiBQbGFpZEVudmlyb25tZW50ID0ge1xuICBwcm9kdWN0aW9uOiAnaHR0cHM6Ly9wcm9kdWN0aW9uLnBsYWlkLmNvbScsXG4gIHNhbmRib3g6ICdodHRwczovL3NhbmRib3gucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2NDQuMC4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 945d6483..e1b68402 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/index.js b/dist/index.js index 766bc0fa..f02c4f41 100644 --- a/dist/index.js +++ b/dist/index.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -25,4 +25,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { Object.defineProperty(exports, "__esModule", { value: true }); __exportStar(require("./api"), exports); __exportStar(require("./configuration"), exports); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNjk4LjdcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNzA2LjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file diff --git a/index.ts b/index.ts index 102b8cde..885bbd1f 100644 --- a/index.ts +++ b/index.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.698.7 + * The version of the OpenAPI document: 2020-09-14_1.706.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/package.json b/package.json index d293ea1a..aedb3327 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plaid", - "version": "43.0.0", + "version": "44.0.0", "description": "A node.js client for the Plaid API", "keywords": [ "plaid",